'no use strict'
!(function (e) {
	function t(e, t) {
		var n = e,
			r = ''
		while (n) {
			var i = t[n]
			if (typeof i == 'string') return i + r
			if (i) return i.location.replace(/\/*$/, '/') + (r || i.main || i.name)
			if (i === !1) return ''
			var s = n.lastIndexOf('/')
			if (s === -1) break
			;(r = n.substr(s) + r), (n = n.slice(0, s))
		}
		return e
	}
	if (typeof e.window != 'undefined' && e.document) return
	if (e.require && e.define) return
	e.console ||
		((e.console = function () {
			var e = Array.prototype.slice.call(arguments, 0)
			postMessage({ type: 'log', data: e })
		}),
		(e.console.error = e.console.warn = e.console.log = e.console.trace = e.console)),
		(e.window = e),
		(e.ace = e),
		(e.onerror = function (e, t, n, r, i) {
			postMessage({
				type: 'error',
				data: { message: e, data: i.data, file: t, line: n, col: r, stack: i.stack },
			})
		}),
		(e.normalizeModule = function (t, n) {
			if (n.indexOf('!') !== -1) {
				var r = n.split('!')
				return e.normalizeModule(t, r[0]) + '!' + e.normalizeModule(t, r[1])
			}
			if (n.charAt(0) == '.') {
				var i = t.split('/').slice(0, -1).join('/')
				n = (i ? i + '/' : '') + n
				while (n.indexOf('.') !== -1 && s != n) {
					var s = n
					n = n
						.replace(/^\.\//, '')
						.replace(/\/\.\//, '/')
						.replace(/[^\/]+\/\.\.\//, '')
				}
			}
			return n
		}),
		(e.require = function (r, i) {
			i || ((i = r), (r = null))
			if (!i.charAt) throw new Error('worker.js require() accepts only (parentId, id) as arguments')
			i = e.normalizeModule(r, i)
			var s = e.require.modules[i]
			if (s)
				return s.initialized || ((s.initialized = !0), (s.exports = s.factory().exports)), s.exports
			if (!e.require.tlns) return console.log('unable to load ' + i)
			var o = t(i, e.require.tlns)
			return (
				o.slice(-3) != '.js' && (o += '.js'),
				(e.require.id = i),
				(e.require.modules[i] = {}),
				importScripts(o),
				e.require(r, i)
			)
		}),
		(e.require.modules = {}),
		(e.require.tlns = {}),
		(e.define = function (t, n, r) {
			arguments.length == 2
				? ((r = n), typeof t != 'string' && ((n = t), (t = e.require.id)))
				: arguments.length == 1 && ((r = t), (n = []), (t = e.require.id))
			if (typeof r != 'function') {
				e.require.modules[t] = { exports: r, initialized: !0 }
				return
			}
			n.length || (n = ['require', 'exports', 'module'])
			var i = function (n) {
				return e.require(t, n)
			}
			e.require.modules[t] = {
				exports: {},
				factory: function () {
					var e = this,
						t = r.apply(
							this,
							n.slice(0, r.length).map(function (t) {
								switch (t) {
									case 'require':
										return i
									case 'exports':
										return e.exports
									case 'module':
										return e
									default:
										return i(t)
								}
							})
						)
					return t && (e.exports = t), e
				},
			}
		}),
		(e.define.amd = {}),
		(require.tlns = {}),
		(e.initBaseUrls = function (t) {
			for (var n in t) require.tlns[n] = t[n]
		}),
		(e.initSender = function () {
			var n = e.require('ace/lib/event_emitter').EventEmitter,
				r = e.require('ace/lib/oop'),
				i = function () {}
			return (
				function () {
					r.implement(this, n),
						(this.callback = function (e, t) {
							postMessage({ type: 'call', id: t, data: e })
						}),
						(this.emit = function (e, t) {
							postMessage({ type: 'event', name: e, data: t })
						})
				}.call(i.prototype),
				new i()
			)
		})
	var n = (e.main = null),
		r = (e.sender = null)
	e.onmessage = function (t) {
		var i = t.data
		if (i.event && r) r._signal(i.event, i.data)
		else if (i.command)
			if (n[i.command]) n[i.command].apply(n, i.args)
			else {
				if (!e[i.command]) throw new Error('Unknown command:' + i.command)
				e[i.command].apply(e, i.args)
			}
		else if (i.init) {
			e.initBaseUrls(i.tlns), (r = e.sender = e.initSender())
			var s = require(i.module)[i.classname]
			n = e.main = new s(r)
		}
	}
})(this),
	ace.define('ace/lib/oop', [], function (e, t, n) {
		'use strict'
		;(t.inherits = function (e, t) {
			;(e.super_ = t),
				(e.prototype = Object.create(t.prototype, {
					constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 },
				}))
		}),
			(t.mixin = function (e, t) {
				for (var n in t) e[n] = t[n]
				return e
			}),
			(t.implement = function (e, n) {
				t.mixin(e, n)
			})
	}),
	ace.define('ace/range', [], function (e, t, n) {
		'use strict'
		var r = function (e, t) {
				return e.row - t.row || e.column - t.column
			},
			i = function (e, t, n, r) {
				;(this.start = { row: e, column: t }), (this.end = { row: n, column: r })
			}
		;(function () {
			;(this.isEqual = function (e) {
				return (
					this.start.row === e.start.row &&
					this.end.row === e.end.row &&
					this.start.column === e.start.column &&
					this.end.column === e.end.column
				)
			}),
				(this.toString = function () {
					return (
						'Range: [' +
						this.start.row +
						'/' +
						this.start.column +
						'] -> [' +
						this.end.row +
						'/' +
						this.end.column +
						']'
					)
				}),
				(this.contains = function (e, t) {
					return this.compare(e, t) == 0
				}),
				(this.compareRange = function (e) {
					var t,
						n = e.end,
						r = e.start
					return (
						(t = this.compare(n.row, n.column)),
						t == 1
							? ((t = this.compare(r.row, r.column)), t == 1 ? 2 : t == 0 ? 1 : 0)
							: t == -1
							  ? -2
							  : ((t = this.compare(r.row, r.column)), t == -1 ? -1 : t == 1 ? 42 : 0)
					)
				}),
				(this.comparePoint = function (e) {
					return this.compare(e.row, e.column)
				}),
				(this.containsRange = function (e) {
					return this.comparePoint(e.start) == 0 && this.comparePoint(e.end) == 0
				}),
				(this.intersects = function (e) {
					var t = this.compareRange(e)
					return t == -1 || t == 0 || t == 1
				}),
				(this.isEnd = function (e, t) {
					return this.end.row == e && this.end.column == t
				}),
				(this.isStart = function (e, t) {
					return this.start.row == e && this.start.column == t
				}),
				(this.setStart = function (e, t) {
					typeof e == 'object'
						? ((this.start.column = e.column), (this.start.row = e.row))
						: ((this.start.row = e), (this.start.column = t))
				}),
				(this.setEnd = function (e, t) {
					typeof e == 'object'
						? ((this.end.column = e.column), (this.end.row = e.row))
						: ((this.end.row = e), (this.end.column = t))
				}),
				(this.inside = function (e, t) {
					return this.compare(e, t) == 0 ? (this.isEnd(e, t) || this.isStart(e, t) ? !1 : !0) : !1
				}),
				(this.insideStart = function (e, t) {
					return this.compare(e, t) == 0 ? (this.isEnd(e, t) ? !1 : !0) : !1
				}),
				(this.insideEnd = function (e, t) {
					return this.compare(e, t) == 0 ? (this.isStart(e, t) ? !1 : !0) : !1
				}),
				(this.compare = function (e, t) {
					return !this.isMultiLine() && e === this.start.row
						? t < this.start.column
							? -1
							: t > this.end.column
							  ? 1
							  : 0
						: e < this.start.row
						  ? -1
						  : e > this.end.row
						    ? 1
						    : this.start.row === e
						      ? t >= this.start.column
										? 0
										: -1
						      : this.end.row === e
						        ? t <= this.end.column
											? 0
											: 1
						        : 0
				}),
				(this.compareStart = function (e, t) {
					return this.start.row == e && this.start.column == t ? -1 : this.compare(e, t)
				}),
				(this.compareEnd = function (e, t) {
					return this.end.row == e && this.end.column == t ? 1 : this.compare(e, t)
				}),
				(this.compareInside = function (e, t) {
					return this.end.row == e && this.end.column == t
						? 1
						: this.start.row == e && this.start.column == t
						  ? -1
						  : this.compare(e, t)
				}),
				(this.clipRows = function (e, t) {
					if (this.end.row > t) var n = { row: t + 1, column: 0 }
					else if (this.end.row < e) var n = { row: e, column: 0 }
					if (this.start.row > t) var r = { row: t + 1, column: 0 }
					else if (this.start.row < e) var r = { row: e, column: 0 }
					return i.fromPoints(r || this.start, n || this.end)
				}),
				(this.extend = function (e, t) {
					var n = this.compare(e, t)
					if (n == 0) return this
					if (n == -1) var r = { row: e, column: t }
					else var s = { row: e, column: t }
					return i.fromPoints(r || this.start, s || this.end)
				}),
				(this.isEmpty = function () {
					return this.start.row === this.end.row && this.start.column === this.end.column
				}),
				(this.isMultiLine = function () {
					return this.start.row !== this.end.row
				}),
				(this.clone = function () {
					return i.fromPoints(this.start, this.end)
				}),
				(this.collapseRows = function () {
					return this.end.column == 0
						? new i(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0)
						: new i(this.start.row, 0, this.end.row, 0)
				}),
				(this.toScreenRange = function (e) {
					var t = e.documentToScreenPosition(this.start),
						n = e.documentToScreenPosition(this.end)
					return new i(t.row, t.column, n.row, n.column)
				}),
				(this.moveBy = function (e, t) {
					;(this.start.row += e),
						(this.start.column += t),
						(this.end.row += e),
						(this.end.column += t)
				})
		}).call(i.prototype),
			(i.fromPoints = function (e, t) {
				return new i(e.row, e.column, t.row, t.column)
			}),
			(i.comparePoints = r),
			(i.comparePoints = function (e, t) {
				return e.row - t.row || e.column - t.column
			}),
			(t.Range = i)
	}),
	ace.define('ace/apply_delta', [], function (e, t, n) {
		'use strict'
		function r(e, t) {
			throw (console.log('Invalid Delta:', e), 'Invalid Delta: ' + t)
		}
		function i(e, t) {
			return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length
		}
		function s(e, t) {
			t.action != 'insert' &&
				t.action != 'remove' &&
				r(t, "delta.action must be 'insert' or 'remove'"),
				t.lines instanceof Array || r(t, 'delta.lines must be an Array'),
				(!t.start || !t.end) && r(t, 'delta.start/end must be an present')
			var n = t.start
			i(e, t.start) || r(t, 'delta.start must be contained in document')
			var s = t.end
			t.action == 'remove' &&
				!i(e, s) &&
				r(t, "delta.end must contained in document for 'remove' actions")
			var o = s.row - n.row,
				u = s.column - (o == 0 ? n.column : 0)
			;(o != t.lines.length - 1 || t.lines[o].length != u) &&
				r(t, 'delta.range must match delta lines')
		}
		t.applyDelta = function (e, t, n) {
			var r = t.start.row,
				i = t.start.column,
				s = e[r] || ''
			switch (t.action) {
				case 'insert':
					var o = t.lines
					if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i)
					else {
						var u = [r, 1].concat(t.lines)
						e.splice.apply(e, u),
							(e[r] = s.substring(0, i) + e[r]),
							(e[r + t.lines.length - 1] += s.substring(i))
					}
					break
				case 'remove':
					var a = t.end.column,
						f = t.end.row
					r === f
						? (e[r] = s.substring(0, i) + s.substring(a))
						: e.splice(r, f - r + 1, s.substring(0, i) + e[f].substring(a))
			}
		}
	}),
	ace.define('ace/lib/event_emitter', [], function (e, t, n) {
		'use strict'
		var r = {},
			i = function () {
				this.propagationStopped = !0
			},
			s = function () {
				this.defaultPrevented = !0
			}
		;(r._emit = r._dispatchEvent =
			function (e, t) {
				this._eventRegistry || (this._eventRegistry = {}),
					this._defaultHandlers || (this._defaultHandlers = {})
				var n = this._eventRegistry[e] || [],
					r = this._defaultHandlers[e]
				if (!n.length && !r) return
				if (typeof t != 'object' || !t) t = {}
				t.type || (t.type = e),
					t.stopPropagation || (t.stopPropagation = i),
					t.preventDefault || (t.preventDefault = s),
					(n = n.slice())
				for (var o = 0; o < n.length; o++) {
					n[o](t, this)
					if (t.propagationStopped) break
				}
				if (r && !t.defaultPrevented) return r(t, this)
			}),
			(r._signal = function (e, t) {
				var n = (this._eventRegistry || {})[e]
				if (!n) return
				n = n.slice()
				for (var r = 0; r < n.length; r++) n[r](t, this)
			}),
			(r.once = function (e, t) {
				var n = this
				this.on(e, function r() {
					n.off(e, r), t.apply(null, arguments)
				})
				if (!t)
					return new Promise(function (e) {
						t = e
					})
			}),
			(r.setDefaultHandler = function (e, t) {
				var n = this._defaultHandlers
				n || (n = this._defaultHandlers = { _disabled_: {} })
				if (n[e]) {
					var r = n[e],
						i = n._disabled_[e]
					i || (n._disabled_[e] = i = []), i.push(r)
					var s = i.indexOf(t)
					s != -1 && i.splice(s, 1)
				}
				n[e] = t
			}),
			(r.removeDefaultHandler = function (e, t) {
				var n = this._defaultHandlers
				if (!n) return
				var r = n._disabled_[e]
				if (n[e] == t) r && this.setDefaultHandler(e, r.pop())
				else if (r) {
					var i = r.indexOf(t)
					i != -1 && r.splice(i, 1)
				}
			}),
			(r.on = r.addEventListener =
				function (e, t, n) {
					this._eventRegistry = this._eventRegistry || {}
					var r = this._eventRegistry[e]
					return (
						r || (r = this._eventRegistry[e] = []),
						r.indexOf(t) == -1 && r[n ? 'unshift' : 'push'](t),
						t
					)
				}),
			(r.off =
				r.removeListener =
				r.removeEventListener =
					function (e, t) {
						this._eventRegistry = this._eventRegistry || {}
						var n = this._eventRegistry[e]
						if (!n) return
						var r = n.indexOf(t)
						r !== -1 && n.splice(r, 1)
					}),
			(r.removeAllListeners = function (e) {
				e || (this._eventRegistry = this._defaultHandlers = undefined),
					this._eventRegistry && (this._eventRegistry[e] = undefined),
					this._defaultHandlers && (this._defaultHandlers[e] = undefined)
			}),
			(t.EventEmitter = r)
	}),
	ace.define('ace/anchor', [], function (e, t, n) {
		'use strict'
		var r = e('./lib/oop'),
			i = e('./lib/event_emitter').EventEmitter,
			s = (t.Anchor = function (e, t, n) {
				;(this.$onChange = this.onChange.bind(this)),
					this.attach(e),
					typeof n == 'undefined' ? this.setPosition(t.row, t.column) : this.setPosition(t, n)
			})
		;(function () {
			function e(e, t, n) {
				var r = n ? e.column <= t.column : e.column < t.column
				return e.row < t.row || (e.row == t.row && r)
			}
			function t(t, n, r) {
				var i = t.action == 'insert',
					s = (i ? 1 : -1) * (t.end.row - t.start.row),
					o = (i ? 1 : -1) * (t.end.column - t.start.column),
					u = t.start,
					a = i ? u : t.end
				return e(n, u, r)
					? { row: n.row, column: n.column }
					: e(a, n, !r)
					  ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) }
					  : { row: u.row, column: u.column }
			}
			r.implement(this, i),
				(this.getPosition = function () {
					return this.$clipPositionToDocument(this.row, this.column)
				}),
				(this.getDocument = function () {
					return this.document
				}),
				(this.$insertRight = !1),
				(this.onChange = function (e) {
					if (e.start.row == e.end.row && e.start.row != this.row) return
					if (e.start.row > this.row) return
					var n = t(e, { row: this.row, column: this.column }, this.$insertRight)
					this.setPosition(n.row, n.column, !0)
				}),
				(this.setPosition = function (e, t, n) {
					var r
					n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t))
					if (this.row == r.row && this.column == r.column) return
					var i = { row: this.row, column: this.column }
					;(this.row = r.row),
						(this.column = r.column),
						this._signal('change', { old: i, value: r })
				}),
				(this.detach = function () {
					this.document.off('change', this.$onChange)
				}),
				(this.attach = function (e) {
					;(this.document = e || this.document), this.document.on('change', this.$onChange)
				}),
				(this.$clipPositionToDocument = function (e, t) {
					var n = {}
					return (
						e >= this.document.getLength()
							? ((n.row = Math.max(0, this.document.getLength() - 1)),
							  (n.column = this.document.getLine(n.row).length))
							: e < 0
							  ? ((n.row = 0), (n.column = 0))
							  : ((n.row = e),
							    (n.column = Math.min(this.document.getLine(n.row).length, Math.max(0, t)))),
						t < 0 && (n.column = 0),
						n
					)
				})
		}).call(s.prototype)
	}),
	ace.define('ace/document', [], function (e, t, n) {
		'use strict'
		var r = e('./lib/oop'),
			i = e('./apply_delta').applyDelta,
			s = e('./lib/event_emitter').EventEmitter,
			o = e('./range').Range,
			u = e('./anchor').Anchor,
			a = function (e) {
				;(this.$lines = ['']),
					e.length === 0
						? (this.$lines = [''])
						: Array.isArray(e)
						  ? this.insertMergedLines({ row: 0, column: 0 }, e)
						  : this.insert({ row: 0, column: 0 }, e)
			}
		;(function () {
			r.implement(this, s),
				(this.setValue = function (e) {
					var t = this.getLength() - 1
					this.remove(new o(0, 0, t, this.getLine(t).length)), this.insert({ row: 0, column: 0 }, e)
				}),
				(this.getValue = function () {
					return this.getAllLines().join(this.getNewLineCharacter())
				}),
				(this.createAnchor = function (e, t) {
					return new u(this, e, t)
				}),
				'aaa'.split(/a/).length === 0
					? (this.$split = function (e) {
							return e.replace(/\r\n|\r/g, '\n').split('\n')
					  })
					: (this.$split = function (e) {
							return e.split(/\r\n|\r|\n/)
					  }),
				(this.$detectNewLine = function (e) {
					var t = e.match(/^.*?(\r\n|\r|\n)/m)
					;(this.$autoNewLine = t ? t[1] : '\n'), this._signal('changeNewLineMode')
				}),
				(this.getNewLineCharacter = function () {
					switch (this.$newLineMode) {
						case 'windows':
							return '\r\n'
						case 'unix':
							return '\n'
						default:
							return this.$autoNewLine || '\n'
					}
				}),
				(this.$autoNewLine = ''),
				(this.$newLineMode = 'auto'),
				(this.setNewLineMode = function (e) {
					if (this.$newLineMode === e) return
					;(this.$newLineMode = e), this._signal('changeNewLineMode')
				}),
				(this.getNewLineMode = function () {
					return this.$newLineMode
				}),
				(this.isNewLine = function (e) {
					return e == '\r\n' || e == '\r' || e == '\n'
				}),
				(this.getLine = function (e) {
					return this.$lines[e] || ''
				}),
				(this.getLines = function (e, t) {
					return this.$lines.slice(e, t + 1)
				}),
				(this.getAllLines = function () {
					return this.getLines(0, this.getLength())
				}),
				(this.getLength = function () {
					return this.$lines.length
				}),
				(this.getTextRange = function (e) {
					return this.getLinesForRange(e).join(this.getNewLineCharacter())
				}),
				(this.getLinesForRange = function (e) {
					var t
					if (e.start.row === e.end.row)
						t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]
					else {
						;(t = this.getLines(e.start.row, e.end.row)),
							(t[0] = (t[0] || '').substring(e.start.column))
						var n = t.length - 1
						e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column))
					}
					return t
				}),
				(this.insertLines = function (e, t) {
					return (
						console.warn(
							'Use of document.insertLines is deprecated. Use the insertFullLines method instead.'
						),
						this.insertFullLines(e, t)
					)
				}),
				(this.removeLines = function (e, t) {
					return (
						console.warn(
							'Use of document.removeLines is deprecated. Use the removeFullLines method instead.'
						),
						this.removeFullLines(e, t)
					)
				}),
				(this.insertNewLine = function (e) {
					return (
						console.warn(
							"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."
						),
						this.insertMergedLines(e, ['', ''])
					)
				}),
				(this.insert = function (e, t) {
					return (
						this.getLength() <= 1 && this.$detectNewLine(t),
						this.insertMergedLines(e, this.$split(t))
					)
				}),
				(this.insertInLine = function (e, t) {
					var n = this.clippedPos(e.row, e.column),
						r = this.pos(e.row, e.column + t.length)
					return (
						this.applyDelta({ start: n, end: r, action: 'insert', lines: [t] }, !0),
						this.clonePos(r)
					)
				}),
				(this.clippedPos = function (e, t) {
					var n = this.getLength()
					e === undefined ? (e = n) : e < 0 ? (e = 0) : e >= n && ((e = n - 1), (t = undefined))
					var r = this.getLine(e)
					return (
						t == undefined && (t = r.length),
						(t = Math.min(Math.max(t, 0), r.length)),
						{ row: e, column: t }
					)
				}),
				(this.clonePos = function (e) {
					return { row: e.row, column: e.column }
				}),
				(this.pos = function (e, t) {
					return { row: e, column: t }
				}),
				(this.$clipPosition = function (e) {
					var t = this.getLength()
					return (
						e.row >= t
							? ((e.row = Math.max(0, t - 1)), (e.column = this.getLine(t - 1).length))
							: ((e.row = Math.max(0, e.row)),
							  (e.column = Math.min(Math.max(e.column, 0), this.getLine(e.row).length))),
						e
					)
				}),
				(this.insertFullLines = function (e, t) {
					e = Math.min(Math.max(e, 0), this.getLength())
					var n = 0
					e < this.getLength()
						? ((t = t.concat([''])), (n = 0))
						: ((t = [''].concat(t)), e--, (n = this.$lines[e].length)),
						this.insertMergedLines({ row: e, column: n }, t)
				}),
				(this.insertMergedLines = function (e, t) {
					var n = this.clippedPos(e.row, e.column),
						r = {
							row: n.row + t.length - 1,
							column: (t.length == 1 ? n.column : 0) + t[t.length - 1].length,
						}
					return this.applyDelta({ start: n, end: r, action: 'insert', lines: t }), this.clonePos(r)
				}),
				(this.remove = function (e) {
					var t = this.clippedPos(e.start.row, e.start.column),
						n = this.clippedPos(e.end.row, e.end.column)
					return (
						this.applyDelta({
							start: t,
							end: n,
							action: 'remove',
							lines: this.getLinesForRange({ start: t, end: n }),
						}),
						this.clonePos(t)
					)
				}),
				(this.removeInLine = function (e, t, n) {
					var r = this.clippedPos(e, t),
						i = this.clippedPos(e, n)
					return (
						this.applyDelta(
							{
								start: r,
								end: i,
								action: 'remove',
								lines: this.getLinesForRange({ start: r, end: i }),
							},
							!0
						),
						this.clonePos(r)
					)
				}),
				(this.removeFullLines = function (e, t) {
					;(e = Math.min(Math.max(0, e), this.getLength() - 1)),
						(t = Math.min(Math.max(0, t), this.getLength() - 1))
					var n = t == this.getLength() - 1 && e > 0,
						r = t < this.getLength() - 1,
						i = n ? e - 1 : e,
						s = n ? this.getLine(i).length : 0,
						u = r ? t + 1 : t,
						a = r ? 0 : this.getLine(u).length,
						f = new o(i, s, u, a),
						l = this.$lines.slice(e, t + 1)
					return (
						this.applyDelta({
							start: f.start,
							end: f.end,
							action: 'remove',
							lines: this.getLinesForRange(f),
						}),
						l
					)
				}),
				(this.removeNewLine = function (e) {
					e < this.getLength() - 1 &&
						e >= 0 &&
						this.applyDelta({
							start: this.pos(e, this.getLine(e).length),
							end: this.pos(e + 1, 0),
							action: 'remove',
							lines: ['', ''],
						})
				}),
				(this.replace = function (e, t) {
					e instanceof o || (e = o.fromPoints(e.start, e.end))
					if (t.length === 0 && e.isEmpty()) return e.start
					if (t == this.getTextRange(e)) return e.end
					this.remove(e)
					var n
					return t ? (n = this.insert(e.start, t)) : (n = e.start), n
				}),
				(this.applyDeltas = function (e) {
					for (var t = 0; t < e.length; t++) this.applyDelta(e[t])
				}),
				(this.revertDeltas = function (e) {
					for (var t = e.length - 1; t >= 0; t--) this.revertDelta(e[t])
				}),
				(this.applyDelta = function (e, t) {
					var n = e.action == 'insert'
					if (n ? e.lines.length <= 1 && !e.lines[0] : !o.comparePoints(e.start, e.end)) return
					n && e.lines.length > 2e4
						? this.$splitAndapplyLargeDelta(e, 2e4)
						: (i(this.$lines, e, t), this._signal('change', e))
				}),
				(this.$safeApplyDelta = function (e) {
					var t = this.$lines.length
					;((e.action == 'remove' && e.start.row < t && e.end.row < t) ||
						(e.action == 'insert' && e.start.row <= t)) &&
						this.applyDelta(e)
				}),
				(this.$splitAndapplyLargeDelta = function (e, t) {
					var n = e.lines,
						r = n.length - t + 1,
						i = e.start.row,
						s = e.start.column
					for (var o = 0, u = 0; o < r; o = u) {
						u += t - 1
						var a = n.slice(o, u)
						a.push(''),
							this.applyDelta(
								{
									start: this.pos(i + o, s),
									end: this.pos(i + u, (s = 0)),
									action: e.action,
									lines: a,
								},
								!0
							)
					}
					;(e.lines = n.slice(o)),
						(e.start.row = i + o),
						(e.start.column = s),
						this.applyDelta(e, !0)
				}),
				(this.revertDelta = function (e) {
					this.$safeApplyDelta({
						start: this.clonePos(e.start),
						end: this.clonePos(e.end),
						action: e.action == 'insert' ? 'remove' : 'insert',
						lines: e.lines.slice(),
					})
				}),
				(this.indexToPosition = function (e, t) {
					var n = this.$lines || this.getAllLines(),
						r = this.getNewLineCharacter().length
					for (var i = t || 0, s = n.length; i < s; i++) {
						e -= n[i].length + r
						if (e < 0) return { row: i, column: e + n[i].length + r }
					}
					return { row: s - 1, column: e + n[s - 1].length + r }
				}),
				(this.positionToIndex = function (e, t) {
					var n = this.$lines || this.getAllLines(),
						r = this.getNewLineCharacter().length,
						i = 0,
						s = Math.min(e.row, n.length)
					for (var o = t || 0; o < s; ++o) i += n[o].length + r
					return i + e.column
				})
		}).call(a.prototype),
			(t.Document = a)
	}),
	ace.define('ace/lib/lang', [], function (e, t, n) {
		'use strict'
		;(t.last = function (e) {
			return e[e.length - 1]
		}),
			(t.stringReverse = function (e) {
				return e.split('').reverse().join('')
			}),
			(t.stringRepeat = function (e, t) {
				var n = ''
				while (t > 0) {
					t & 1 && (n += e)
					if ((t >>= 1)) e += e
				}
				return n
			})
		var r = /^\s\s*/,
			i = /\s\s*$/
		;(t.stringTrimLeft = function (e) {
			return e.replace(r, '')
		}),
			(t.stringTrimRight = function (e) {
				return e.replace(i, '')
			}),
			(t.copyObject = function (e) {
				var t = {}
				for (var n in e) t[n] = e[n]
				return t
			}),
			(t.copyArray = function (e) {
				var t = []
				for (var n = 0, r = e.length; n < r; n++)
					e[n] && typeof e[n] == 'object' ? (t[n] = this.copyObject(e[n])) : (t[n] = e[n])
				return t
			}),
			(t.deepCopy = function s(e) {
				if (typeof e != 'object' || !e) return e
				var t
				if (Array.isArray(e)) {
					t = []
					for (var n = 0; n < e.length; n++) t[n] = s(e[n])
					return t
				}
				if (Object.prototype.toString.call(e) !== '[object Object]') return e
				t = {}
				for (var n in e) t[n] = s(e[n])
				return t
			}),
			(t.arrayToMap = function (e) {
				var t = {}
				for (var n = 0; n < e.length; n++) t[e[n]] = 1
				return t
			}),
			(t.createMap = function (e) {
				var t = Object.create(null)
				for (var n in e) t[n] = e[n]
				return t
			}),
			(t.arrayRemove = function (e, t) {
				for (var n = 0; n <= e.length; n++) t === e[n] && e.splice(n, 1)
			}),
			(t.escapeRegExp = function (e) {
				return e.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1')
			}),
			(t.escapeHTML = function (e) {
				return ('' + e)
					.replace(/&/g, '&#38;')
					.replace(/"/g, '&#34;')
					.replace(/'/g, '&#39;')
					.replace(/</g, '&#60;')
			}),
			(t.getMatchOffsets = function (e, t) {
				var n = []
				return (
					e.replace(t, function (e) {
						n.push({ offset: arguments[arguments.length - 2], length: e.length })
					}),
					n
				)
			}),
			(t.deferredCall = function (e) {
				var t = null,
					n = function () {
						;(t = null), e()
					},
					r = function (e) {
						return r.cancel(), (t = setTimeout(n, e || 0)), r
					}
				return (
					(r.schedule = r),
					(r.call = function () {
						return this.cancel(), e(), r
					}),
					(r.cancel = function () {
						return clearTimeout(t), (t = null), r
					}),
					(r.isPending = function () {
						return t
					}),
					r
				)
			}),
			(t.delayedCall = function (e, t) {
				var n = null,
					r = function () {
						;(n = null), e()
					},
					i = function (e) {
						n == null && (n = setTimeout(r, e || t))
					}
				return (
					(i.delay = function (e) {
						n && clearTimeout(n), (n = setTimeout(r, e || t))
					}),
					(i.schedule = i),
					(i.call = function () {
						this.cancel(), e()
					}),
					(i.cancel = function () {
						n && clearTimeout(n), (n = null)
					}),
					(i.isPending = function () {
						return n
					}),
					i
				)
			})
	}),
	ace.define('ace/worker/mirror', [], function (e, t, n) {
		'use strict'
		var r = e('../range').Range,
			i = e('../document').Document,
			s = e('../lib/lang'),
			o = (t.Mirror = function (e) {
				this.sender = e
				var t = (this.doc = new i('')),
					n = (this.deferredUpdate = s.delayedCall(this.onUpdate.bind(this))),
					r = this
				e.on('change', function (e) {
					var i = e.data
					if (i[0].start) t.applyDeltas(i)
					else
						for (var s = 0; s < i.length; s += 2) {
							if (Array.isArray(i[s + 1]))
								var o = { action: 'insert', start: i[s], lines: i[s + 1] }
							else var o = { action: 'remove', start: i[s], end: i[s + 1] }
							t.applyDelta(o, !0)
						}
					if (r.$timeout) return n.schedule(r.$timeout)
					r.onUpdate()
				})
			})
		;(function () {
			;(this.$timeout = 500),
				(this.setTimeout = function (e) {
					this.$timeout = e
				}),
				(this.setValue = function (e) {
					this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)
				}),
				(this.getValue = function (e) {
					this.sender.callback(this.doc.getValue(), e)
				}),
				(this.onUpdate = function () {}),
				(this.isPending = function () {
					return this.deferredUpdate.isPending()
				})
		}).call(o.prototype)
	}),
	ace.define('ace/mode/lua/luaparse', [], function (e, t, n) {
		;(function (e, n, r) {
			r(t)
		})(this, 'luaparse', function (e) {
			'use strict'
			function m(e) {
				if (mt) {
					var t = vt.pop()
					t.complete(), n.locations && (e.loc = t.loc), n.ranges && (e.range = t.range)
				}
				return e
			}
			function w(e, t, n) {
				for (var r = 0, i = e.length; r < i; r++) if (e[r][t] === n) return r
				return -1
			}
			function E(e) {
				var t = g.call(arguments, 1)
				return (
					(e = e.replace(/%(\d)/g, function (e, n) {
						return '' + t[n - 1] || ''
					})),
					e
				)
			}
			function S() {
				var e = g.call(arguments),
					t = {},
					n,
					r
				for (var i = 0, s = e.length; i < s; i++) {
					n = e[i]
					for (r in n) n.hasOwnProperty(r) && (t[r] = n[r])
				}
				return t
			}
			function x(e) {
				var t = E.apply(null, g.call(arguments, 1)),
					n,
					r
				throw (
					('undefined' != typeof e.line
						? ((r = e.range[0] - e.lineStart),
						  (n = new SyntaxError(E('[%1:%2] %3', e.line, r, t))),
						  (n.line = e.line),
						  (n.index = e.range[0]),
						  (n.column = r))
						: ((r = C - D + 1),
						  (n = new SyntaxError(E('[%1:%2] %3', _, r, t))),
						  (n.index = C),
						  (n.line = _),
						  (n.column = r)),
					n)
				)
			}
			function T(e, t) {
				x(t, d.expectedToken, e, t.value)
			}
			function N(e, t) {
				'undefined' == typeof t && (t = A.value)
				if ('undefined' != typeof e.type) {
					var n
					switch (e.type) {
						case o:
							n = 'string'
							break
						case u:
							n = 'keyword'
							break
						case a:
							n = 'identifier'
							break
						case f:
							n = 'number'
							break
						case l:
							n = 'symbol'
							break
						case c:
							n = 'boolean'
							break
						case h:
							return x(e, d.unexpected, 'symbol', 'nil', t)
					}
					return x(e, d.unexpected, n, e.value, t)
				}
				return x(e, d.unexpected, 'symbol', e, t)
			}
			function P() {
				H()
				while (45 === t.charCodeAt(C) && 45 === t.charCodeAt(C + 1)) X(), H()
				if (C >= r) return { type: s, value: '<eof>', line: _, lineStart: D, range: [C, C] }
				var e = t.charCodeAt(C),
					n = t.charCodeAt(C + 1)
				M = C
				if (et(e)) return B()
				switch (e) {
					case 39:
					case 34:
						return I()
					case 48:
					case 49:
					case 50:
					case 51:
					case 52:
					case 53:
					case 54:
					case 55:
					case 56:
					case 57:
						return R()
					case 46:
						if (Y(n)) return R()
						if (46 === n) return 46 === t.charCodeAt(C + 2) ? F() : j('..')
						return j('.')
					case 61:
						if (61 === n) return j('==')
						return j('=')
					case 62:
						if (61 === n) return j('>=')
						return j('>')
					case 60:
						if (61 === n) return j('<=')
						return j('<')
					case 126:
						if (61 === n) return j('~=')
						return j('~')
					case 58:
						if (58 === n) return j('::')
						return j(':')
					case 91:
						if (91 === n || 61 === n) return q()
						return j('[')
					case 42:
					case 47:
					case 94:
					case 37:
					case 44:
					case 123:
					case 125:
					case 93:
					case 40:
					case 41:
					case 59:
					case 35:
					case 45:
					case 43:
					case 38:
					case 124:
						return j(t.charAt(C))
				}
				return N(t.charAt(C))
			}
			function H() {
				while (C < r) {
					var e = t.charCodeAt(C)
					if (Q(e)) C++
					else {
						if (!G(e)) break
						_++, (D = ++C)
					}
				}
			}
			function B() {
				var e, n
				while (tt(t.charCodeAt(++C)));
				return (
					(e = t.slice(M, C)),
					nt(e)
						? (n = u)
						: 'true' === e || 'false' === e
						  ? ((n = c), (e = 'true' === e))
						  : 'nil' === e
						    ? ((n = h), (e = null))
						    : (n = a),
					{ type: n, value: e, line: _, lineStart: D, range: [M, C] }
				)
			}
			function j(e) {
				return (C += e.length), { type: l, value: e, line: _, lineStart: D, range: [M, C] }
			}
			function F() {
				return (C += 3), { type: p, value: '...', line: _, lineStart: D, range: [M, C] }
			}
			function I() {
				var e = t.charCodeAt(C++),
					n = C,
					i = '',
					s
				while (C < r) {
					s = t.charCodeAt(C++)
					if (e === s) break
					if (92 === s) (i += t.slice(n, C - 1) + W()), (n = C)
					else if (C >= r || G(s))
						(i += t.slice(n, C - 1)), x({}, d.unfinishedString, i + String.fromCharCode(s))
				}
				return (i += t.slice(n, C - 1)), { type: o, value: i, line: _, lineStart: D, range: [M, C] }
			}
			function q() {
				var e = V()
				return (
					!1 === e && x(k, d.expected, '[', k.value),
					{ type: o, value: e, line: _, lineStart: D, range: [M, C] }
				)
			}
			function R() {
				var e = t.charAt(C),
					n = t.charAt(C + 1),
					r = '0' === e && 'xX'.indexOf(n || null) >= 0 ? U() : z()
				return { type: f, value: r, line: _, lineStart: D, range: [M, C] }
			}
			function U() {
				var e = 0,
					n = 1,
					r = 1,
					i,
					s,
					o,
					u
				;(u = C += 2), Z(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C))
				while (Z(t.charCodeAt(C))) C++
				i = parseInt(t.slice(u, C), 16)
				if ('.' === t.charAt(C)) {
					s = ++C
					while (Z(t.charCodeAt(C))) C++
					;(e = t.slice(s, C)), (e = s === C ? 0 : parseInt(e, 16) / Math.pow(16, C - s))
				}
				if ('pP'.indexOf(t.charAt(C) || null) >= 0) {
					C++,
						'+-'.indexOf(t.charAt(C) || null) >= 0 && (r = '+' === t.charAt(C++) ? 1 : -1),
						(o = C),
						Y(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C))
					while (Y(t.charCodeAt(C))) C++
					;(n = t.slice(o, C)), (n = Math.pow(2, n * r))
				}
				return (i + e) * n
			}
			function z() {
				while (Y(t.charCodeAt(C))) C++
				if ('.' === t.charAt(C)) {
					C++
					while (Y(t.charCodeAt(C))) C++
				}
				if ('eE'.indexOf(t.charAt(C) || null) >= 0) {
					C++,
						'+-'.indexOf(t.charAt(C) || null) >= 0 && C++,
						Y(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C))
					while (Y(t.charCodeAt(C))) C++
				}
				return parseFloat(t.slice(M, C))
			}
			function W() {
				var e = C
				switch (t.charAt(C)) {
					case 'n':
						return C++, '\n'
					case 'r':
						return C++, '\r'
					case 't':
						return C++, '	'
					case 'v':
						return C++, '\x0b'
					case 'b':
						return C++, '\b'
					case 'f':
						return C++, '\f'
					case 'z':
						return C++, H(), ''
					case 'x':
						if (Z(t.charCodeAt(C + 1)) && Z(t.charCodeAt(C + 2)))
							return (C += 3), '\\' + t.slice(e, C)
						return '\\' + t.charAt(C++)
					default:
						if (Y(t.charCodeAt(C))) {
							while (Y(t.charCodeAt(++C)));
							return '\\' + t.slice(e, C)
						}
						return t.charAt(C++)
				}
			}
			function X() {
				;(M = C), (C += 2)
				var e = t.charAt(C),
					i = '',
					s = !1,
					o = C,
					u = D,
					a = _
				'[' === e && ((i = V()), !1 === i ? (i = e) : (s = !0))
				if (!s) {
					while (C < r) {
						if (G(t.charCodeAt(C))) break
						C++
					}
					n.comments && (i = t.slice(o, C))
				}
				if (n.comments) {
					var f = v.comment(i, t.slice(M, C))
					n.locations &&
						(f.loc = { start: { line: a, column: M - u }, end: { line: _, column: C - D } }),
						n.ranges && (f.range = [M, C]),
						O.push(f)
				}
			}
			function V() {
				var e = 0,
					n = '',
					i = !1,
					s,
					o
				C++
				while ('=' === t.charAt(C + e)) e++
				if ('[' !== t.charAt(C + e)) return !1
				;(C += e + 1), G(t.charCodeAt(C)) && (_++, (D = C++)), (o = C)
				while (C < r) {
					;(s = t.charAt(C++)), G(s.charCodeAt(0)) && (_++, (D = C))
					if (']' === s) {
						i = !0
						for (var u = 0; u < e; u++) '=' !== t.charAt(C + u) && (i = !1)
						']' !== t.charAt(C + e) && (i = !1)
					}
					if (i) break
				}
				return (n += t.slice(o, C - 1)), (C += e + 1), n
			}
			function $() {
				;(L = k), (k = A), (A = P())
			}
			function J(e) {
				return e === k.value ? ($(), !0) : !1
			}
			function K(e) {
				e === k.value ? $() : x(k, d.expected, e, k.value)
			}
			function Q(e) {
				return 9 === e || 32 === e || 11 === e || 12 === e
			}
			function G(e) {
				return 10 === e || 13 === e
			}
			function Y(e) {
				return e >= 48 && e <= 57
			}
			function Z(e) {
				return (e >= 48 && e <= 57) || (e >= 97 && e <= 102) || (e >= 65 && e <= 70)
			}
			function et(e) {
				return (e >= 65 && e <= 90) || (e >= 97 && e <= 122) || 95 === e
			}
			function tt(e) {
				return (e >= 65 && e <= 90) || (e >= 97 && e <= 122) || 95 === e || (e >= 48 && e <= 57)
			}
			function nt(e) {
				switch (e.length) {
					case 2:
						return 'do' === e || 'if' === e || 'in' === e || 'or' === e
					case 3:
						return 'and' === e || 'end' === e || 'for' === e || 'not' === e
					case 4:
						return 'else' === e || 'goto' === e || 'then' === e
					case 5:
						return 'break' === e || 'local' === e || 'until' === e || 'while' === e
					case 6:
						return 'elseif' === e || 'repeat' === e || 'return' === e
					case 8:
						return 'function' === e
				}
				return !1
			}
			function rt(e) {
				return l === e.type ? '#-~'.indexOf(e.value) >= 0 : u === e.type ? 'not' === e.value : !1
			}
			function it(e) {
				switch (e.type) {
					case 'CallExpression':
					case 'TableCallExpression':
					case 'StringCallExpression':
						return !0
				}
				return !1
			}
			function st(e) {
				if (s === e.type) return !0
				if (u !== e.type) return !1
				switch (e.value) {
					case 'else':
					case 'elseif':
					case 'end':
					case 'until':
						return !0
					default:
						return !1
				}
			}
			function ft() {
				ot.push(Array.apply(null, ot[ut++]))
			}
			function lt() {
				ot.pop(), ut--
			}
			function ct(e) {
				if (-1 !== b(ot[ut], e)) return
				ot[ut].push(e)
			}
			function ht(e) {
				ct(e.name), pt(e, !0)
			}
			function pt(e, t) {
				!t && -1 === w(at, 'name', e.name) && at.push(e), (e.isLocal = t)
			}
			function dt(e) {
				return -1 !== b(ot[ut], e)
			}
			function gt() {
				return new yt(k)
			}
			function yt(e) {
				n.locations &&
					(this.loc = {
						start: { line: e.line, column: e.range[0] - e.lineStart },
						end: { line: 0, column: 0 },
					}),
					n.ranges && (this.range = [e.range[0], 0])
			}
			function bt() {
				mt && vt.push(gt())
			}
			function wt(e) {
				mt && vt.push(e)
			}
			function Et() {
				$(), bt()
				var e = St()
				return s !== k.type && N(k), mt && !e.length && (L = k), m(v.chunk(e))
			}
			function St(e) {
				var t = [],
					r
				n.scope && ft()
				while (!st(k)) {
					if ('return' === k.value) {
						t.push(xt())
						break
					}
					;(r = xt()), r && t.push(r)
				}
				return n.scope && lt(), t
			}
			function xt() {
				bt()
				if (u === k.type)
					switch (k.value) {
						case 'local':
							return $(), Dt()
						case 'if':
							return $(), Mt()
						case 'return':
							return $(), Ot()
						case 'function':
							$()
							var e = jt()
							return Bt(e)
						case 'while':
							return $(), Lt()
						case 'for':
							return $(), _t()
						case 'repeat':
							return $(), At()
						case 'break':
							return $(), Nt()
						case 'do':
							return $(), kt()
						case 'goto':
							return $(), Ct()
					}
				if (l === k.type && J('::')) return Tt()
				mt && vt.pop()
				if (J(';')) return
				return Pt()
			}
			function Tt() {
				var e = k.value,
					t = Ht()
				return n.scope && (ct('::' + e + '::'), pt(t, !0)), K('::'), m(v.labelStatement(t))
			}
			function Nt() {
				return m(v.breakStatement())
			}
			function Ct() {
				var e = k.value,
					t = Ht()
				return n.scope && (t.isLabel = dt('::' + e + '::')), m(v.gotoStatement(t))
			}
			function kt() {
				var e = St()
				return K('end'), m(v.doStatement(e))
			}
			function Lt() {
				var e = qt()
				K('do')
				var t = St()
				return K('end'), m(v.whileStatement(e, t))
			}
			function At() {
				var e = St()
				K('until')
				var t = qt()
				return m(v.repeatStatement(t, e))
			}
			function Ot() {
				var e = []
				if ('end' !== k.value) {
					var t = It()
					null != t && e.push(t)
					while (J(',')) (t = qt()), e.push(t)
					J(';')
				}
				return m(v.returnStatement(e))
			}
			function Mt() {
				var e = [],
					t,
					n,
					r
				mt && ((r = vt[vt.length - 1]), vt.push(r)),
					(t = qt()),
					K('then'),
					(n = St()),
					e.push(m(v.ifClause(t, n))),
					mt && (r = gt())
				while (J('elseif'))
					wt(r),
						(t = qt()),
						K('then'),
						(n = St()),
						e.push(m(v.elseifClause(t, n))),
						mt && (r = gt())
				return (
					J('else') &&
						(mt && ((r = new yt(L)), vt.push(r)), (n = St()), e.push(m(v.elseClause(n)))),
					K('end'),
					m(v.ifStatement(e))
				)
			}
			function _t() {
				var e = Ht(),
					t
				n.scope && ht(e)
				if (J('=')) {
					var r = qt()
					K(',')
					var i = qt(),
						s = J(',') ? qt() : null
					return K('do'), (t = St()), K('end'), m(v.forNumericStatement(e, r, i, s, t))
				}
				var o = [e]
				while (J(',')) (e = Ht()), n.scope && ht(e), o.push(e)
				K('in')
				var u = []
				do {
					var a = qt()
					u.push(a)
				} while (J(','))
				return K('do'), (t = St()), K('end'), m(v.forGenericStatement(o, u, t))
			}
			function Dt() {
				var e
				if (a === k.type) {
					var t = [],
						r = []
					do (e = Ht()), t.push(e)
					while (J(','))
					if (J('='))
						do {
							var i = qt()
							r.push(i)
						} while (J(','))
					if (n.scope) for (var s = 0, o = t.length; s < o; s++) ht(t[s])
					return m(v.localStatement(t, r))
				}
				if (J('function')) return (e = Ht()), n.scope && ht(e), Bt(e, !0)
				T('<name>', k)
			}
			function Pt() {
				var e = k,
					t,
					n
				mt && (n = gt()), (t = zt())
				if (null == t) return N(k)
				if (',='.indexOf(k.value) >= 0) {
					var r = [t],
						i = [],
						s
					while (J(',')) (s = zt()), null == s && T('<expression>', k), r.push(s)
					K('=')
					do (s = qt()), i.push(s)
					while (J(','))
					return wt(n), m(v.assignmentStatement(r, i))
				}
				return it(t) ? (wt(n), m(v.callStatement(t))) : N(e)
			}
			function Ht() {
				bt()
				var e = k.value
				return a !== k.type && T('<name>', k), $(), m(v.identifier(e))
			}
			function Bt(e, t) {
				var r = []
				K('(')
				if (!J(')'))
					for (;;)
						if (a === k.type) {
							var i = Ht()
							n.scope && ht(i), r.push(i)
							if (J(',')) continue
							if (J(')')) break
						} else {
							if (p === k.type) {
								r.push(Xt()), K(')')
								break
							}
							T("<name> or '...'", k)
						}
				var s = St()
				return K('end'), (t = t || !1), m(v.functionStatement(e, r, t, s))
			}
			function jt() {
				var e, t, r
				mt && (r = gt()), (e = Ht()), n.scope && pt(e, !1)
				while (J('.'))
					wt(r), (t = Ht()), n.scope && pt(t, !1), (e = m(v.memberExpression(e, '.', t)))
				return (
					J(':') &&
						(wt(r), (t = Ht()), n.scope && pt(t, !1), (e = m(v.memberExpression(e, ':', t)))),
					e
				)
			}
			function Ft() {
				var e = [],
					t,
					n
				for (;;) {
					bt()
					if (l === k.type && J('['))
						(t = qt()), K(']'), K('='), (n = qt()), e.push(m(v.tableKey(t, n)))
					else if (a === k.type)
						(t = qt()),
							J('=') ? ((n = qt()), e.push(m(v.tableKeyString(t, n)))) : e.push(m(v.tableValue(t)))
					else {
						if (null == (n = It())) {
							vt.pop()
							break
						}
						e.push(m(v.tableValue(n)))
					}
					if (',;'.indexOf(k.value) >= 0) {
						$()
						continue
					}
					if ('}' === k.value) break
				}
				return K('}'), m(v.tableConstructorExpression(e))
			}
			function It() {
				var e = Ut(0)
				return e
			}
			function qt() {
				var e = It()
				if (null != e) return e
				T('<expression>', k)
			}
			function Rt(e) {
				var t = e.charCodeAt(0),
					n = e.length
				if (1 === n)
					switch (t) {
						case 94:
							return 10
						case 42:
						case 47:
						case 37:
							return 7
						case 43:
						case 45:
							return 6
						case 60:
						case 62:
							return 3
						case 38:
						case 124:
							return 7
					}
				else if (2 === n)
					switch (t) {
						case 46:
							return 5
						case 60:
						case 62:
						case 61:
						case 126:
							return 3
						case 111:
							return 1
					}
				else if (97 === t && 'and' === e) return 2
				return 0
			}
			function Ut(e) {
				var t = k.value,
					n,
					r
				mt && (r = gt())
				if (rt(k)) {
					bt(), $()
					var i = Ut(8)
					i == null && T('<expression>', k), (n = m(v.unaryExpression(t, i)))
				}
				null == n && ((n = Xt()), null == n && (n = zt()))
				if (null == n) return null
				var s
				for (;;) {
					;(t = k.value), (s = l === k.type || u === k.type ? Rt(t) : 0)
					if (s === 0 || s <= e) break
					;('^' === t || '..' === t) && s--, $()
					var o = Ut(s)
					null == o && T('<expression>', k), mt && vt.push(r), (n = m(v.binaryExpression(t, n, o)))
				}
				return n
			}
			function zt() {
				var e, t, r, i
				mt && (r = gt())
				if (a === k.type) (t = k.value), (e = Ht()), n.scope && pt(e, (i = dt(t)))
				else {
					if (!J('(')) return null
					;(e = qt()), K(')'), n.scope && (i = e.isLocal)
				}
				var s, u
				for (;;)
					if (l === k.type)
						switch (k.value) {
							case '[':
								wt(r), $(), (s = qt()), (e = m(v.indexExpression(e, s))), K(']')
								break
							case '.':
								wt(r), $(), (u = Ht()), n.scope && pt(u, i), (e = m(v.memberExpression(e, '.', u)))
								break
							case ':':
								wt(r),
									$(),
									(u = Ht()),
									n.scope && pt(u, i),
									(e = m(v.memberExpression(e, ':', u))),
									wt(r),
									(e = Wt(e))
								break
							case '(':
							case '{':
								wt(r), (e = Wt(e))
								break
							default:
								return e
						}
					else {
						if (o !== k.type) break
						wt(r), (e = Wt(e))
					}
				return e
			}
			function Wt(e) {
				if (l === k.type)
					switch (k.value) {
						case '(':
							$()
							var t = [],
								n = It()
							null != n && t.push(n)
							while (J(',')) (n = qt()), t.push(n)
							return K(')'), m(v.callExpression(e, t))
						case '{':
							bt(), $()
							var r = Ft()
							return m(v.tableCallExpression(e, r))
					}
				else if (o === k.type) return m(v.stringCallExpression(e, Xt()))
				T('function arguments', k)
			}
			function Xt() {
				var e = o | f | c | h | p,
					n = k.value,
					r = k.type,
					i
				mt && (i = gt())
				if (r & e) {
					wt(i)
					var s = t.slice(k.range[0], k.range[1])
					return $(), m(v.literal(r, n, s))
				}
				if (u === r && 'function' === n) return wt(i), $(), Bt(null)
				if (J('{')) return wt(i), Ft()
			}
			function Vt(s, o) {
				return (
					'undefined' == typeof o && 'object' == typeof s && ((o = s), (s = undefined)),
					o || (o = {}),
					(t = s || ''),
					(n = S(i, o)),
					(C = 0),
					(_ = 1),
					(D = 0),
					(r = t.length),
					(ot = [[]]),
					(ut = 0),
					(at = []),
					(vt = []),
					n.comments && (O = []),
					n.wait ? e : Jt()
				)
			}
			function $t(n) {
				return (t += String(n)), (r = t.length), e
			}
			function Jt(e) {
				'undefined' != typeof e && $t(e), (r = t.length), (mt = n.locations || n.ranges), (A = P())
				var i = Et()
				n.comments && (i.comments = O), n.scope && (i.globals = at)
				if (vt.length > 0)
					throw new Error('Location tracking failed. This is most likely a bug in luaparse')
				return i
			}
			e.version = '0.1.4'
			var t,
				n,
				r,
				i = (e.defaultOptions = { wait: !1, comments: !0, scope: !1, locations: !1, ranges: !1 }),
				s = 1,
				o = 2,
				u = 4,
				a = 8,
				f = 16,
				l = 32,
				c = 64,
				h = 128,
				p = 256
			e.tokenTypes = {
				EOF: s,
				StringLiteral: o,
				Keyword: u,
				Identifier: a,
				NumericLiteral: f,
				Punctuator: l,
				BooleanLiteral: c,
				NilLiteral: h,
				VarargLiteral: p,
			}
			var d = (e.errors = {
					unexpected: "Unexpected %1 '%2' near '%3'",
					expected: "'%1' expected near '%2'",
					expectedToken: "%1 expected near '%2'",
					unfinishedString: "unfinished string near '%1'",
					malformedNumber: "malformed number near '%1'",
				}),
				v = (e.ast = {
					labelStatement: function (e) {
						return { type: 'LabelStatement', label: e }
					},
					breakStatement: function () {
						return { type: 'BreakStatement' }
					},
					gotoStatement: function (e) {
						return { type: 'GotoStatement', label: e }
					},
					returnStatement: function (e) {
						return { type: 'ReturnStatement', arguments: e }
					},
					ifStatement: function (e) {
						return { type: 'IfStatement', clauses: e }
					},
					ifClause: function (e, t) {
						return { type: 'IfClause', condition: e, body: t }
					},
					elseifClause: function (e, t) {
						return { type: 'ElseifClause', condition: e, body: t }
					},
					elseClause: function (e) {
						return { type: 'ElseClause', body: e }
					},
					whileStatement: function (e, t) {
						return { type: 'WhileStatement', condition: e, body: t }
					},
					doStatement: function (e) {
						return { type: 'DoStatement', body: e }
					},
					repeatStatement: function (e, t) {
						return { type: 'RepeatStatement', condition: e, body: t }
					},
					localStatement: function (e, t) {
						return { type: 'LocalStatement', variables: e, init: t }
					},
					assignmentStatement: function (e, t) {
						return { type: 'AssignmentStatement', variables: e, init: t }
					},
					callStatement: function (e) {
						return { type: 'CallStatement', expression: e }
					},
					functionStatement: function (e, t, n, r) {
						return {
							type: 'FunctionDeclaration',
							identifier: e,
							isLocal: n,
							parameters: t,
							body: r,
						}
					},
					forNumericStatement: function (e, t, n, r, i) {
						return { type: 'ForNumericStatement', variable: e, start: t, end: n, step: r, body: i }
					},
					forGenericStatement: function (e, t, n) {
						return { type: 'ForGenericStatement', variables: e, iterators: t, body: n }
					},
					chunk: function (e) {
						return { type: 'Chunk', body: e }
					},
					identifier: function (e) {
						return { type: 'Identifier', name: e }
					},
					literal: function (e, t, n) {
						return (
							(e =
								e === o
									? 'StringLiteral'
									: e === f
									  ? 'NumericLiteral'
									  : e === c
									    ? 'BooleanLiteral'
									    : e === h
									      ? 'NilLiteral'
									      : 'VarargLiteral'),
							{ type: e, value: t, raw: n }
						)
					},
					tableKey: function (e, t) {
						return { type: 'TableKey', key: e, value: t }
					},
					tableKeyString: function (e, t) {
						return { type: 'TableKeyString', key: e, value: t }
					},
					tableValue: function (e) {
						return { type: 'TableValue', value: e }
					},
					tableConstructorExpression: function (e) {
						return { type: 'TableConstructorExpression', fields: e }
					},
					binaryExpression: function (e, t, n) {
						var r = 'and' === e || 'or' === e ? 'LogicalExpression' : 'BinaryExpression'
						return { type: r, operator: e, left: t, right: n }
					},
					unaryExpression: function (e, t) {
						return { type: 'UnaryExpression', operator: e, argument: t }
					},
					memberExpression: function (e, t, n) {
						return { type: 'MemberExpression', indexer: t, identifier: n, base: e }
					},
					indexExpression: function (e, t) {
						return { type: 'IndexExpression', base: e, index: t }
					},
					callExpression: function (e, t) {
						return { type: 'CallExpression', base: e, arguments: t }
					},
					tableCallExpression: function (e, t) {
						return { type: 'TableCallExpression', base: e, arguments: t }
					},
					stringCallExpression: function (e, t) {
						return { type: 'StringCallExpression', base: e, argument: t }
					},
					comment: function (e, t) {
						return { type: 'Comment', value: e, raw: t }
					},
				}),
				g = Array.prototype.slice,
				y = Object.prototype.toString,
				b = function (t, n) {
					for (var r = 0, i = t.length; r < i; r++) if (t[r] === n) return r
					return -1
				},
				C,
				k,
				L,
				A,
				O,
				M,
				_,
				D
			e.lex = P
			var ot,
				ut,
				at,
				vt = [],
				mt
			;(yt.prototype.complete = function () {
				n.locations &&
					((this.loc.end.line = L.line), (this.loc.end.column = L.range[1] - L.lineStart)),
					n.ranges && (this.range[1] = L.range[1])
			}),
				(e.parse = Vt),
				(e.write = $t),
				(e.end = Jt)
		})
	}),
	ace.define('ace/mode/lua_worker', [], function (e, t, n) {
		'use strict'
		var r = e('../lib/oop'),
			i = e('../worker/mirror').Mirror,
			s = e('../mode/lua/luaparse'),
			o = (t.Worker = function (e) {
				i.call(this, e), this.setTimeout(500)
			})
		r.inherits(o, i),
			function () {
				this.onUpdate = function () {
					var e = this.doc.getValue(),
						t = []
					try {
						s.parse(e)
					} catch (n) {
						n instanceof SyntaxError &&
							t.push({ row: n.line - 1, column: n.column, text: n.message, type: 'error' })
					}
					this.sender.emit('annotate', t)
				}
			}.call(o.prototype)
	})
