{"version":3,"file":"application.js","mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCA;AAAA;AAAA;ACojDA;AAu6BA;AAqDA;ACnuDA;AAqiDA;AAAA;AAcA;AC1pEA;AC7OA;AAAA;AAAA;AAAA;AAAA;AAcA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8lGA;AACA;AACA;AA+qBA;AAiBA;AAiDA;AA4CA;AA2GA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4sCA;AA8zIA;AA6FA;AAIA;AAoyBA;AA+JA;AAQA;AA4IA;AA+BA;AAqcA;AAiBA;AAqvBA;AAgTA;AA8IA;AACA;AAo8BA;AAAA;AAskFA;AAuyDA;AAqBA;AAoRA;AA4lBA;AAiGA;AAQA;AAIA;AA4hBA;AAYA;AAgBA;AAsBA;AAKA;AA2IA;AAg/BA;AA4YA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAAA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AAojBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+FA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoVA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AAEA;AAAA;AAsDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AAAA;AAAA;AASA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAkHA;AAAA;AAAA;AAqGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AACA;AACA;AAAA;AAIA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAyDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAGA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AAAA;AAgCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sources":["webpack://hexlet_cv/./node_modules/select2/dist/js/select2.js","webpack://hexlet_cv/./node_modules/prosemirror-model/dist/index.js","webpack://hexlet_cv/./node_modules/prosemirror-view/dist/index.js","webpack://hexlet_cv/./node_modules/prosemirror-commands/dist/index.js","webpack://hexlet_cv/./node_modules/@toast-ui/editor/dist/esm/index.js"],"sourcesContent":["/*!\n * Select2 4.1.0-rc.0\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\n */\n;\n(function(factory) {\n if (typeof define === \"function\" && define.amd) {\n define([\"jquery\"], factory);\n } else if (typeof module === \"object\" && module.exports) {\n module.exports = function(root, jQuery2) {\n if (jQuery2 === void 0) {\n if (typeof window !== \"undefined\") {\n jQuery2 = require(\"jquery\");\n } else {\n jQuery2 = require(\"jquery\")(root);\n }\n }\n factory(jQuery2);\n return jQuery2;\n };\n } else {\n factory(jQuery);\n }\n})(function(jQuery2) {\n var S2 = function() {\n if (jQuery2 && jQuery2.fn && jQuery2.fn.select2 && jQuery2.fn.select2.amd) {\n var S22 = jQuery2.fn.select2.amd;\n }\n var S22;\n (function() {\n if (!S22 || !S22.requirejs) {\n if (!S22) {\n S22 = {};\n } else {\n require2 = S22;\n }\n /**\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n */\n var requirejs, require2, define2;\n (function(undef) {\n var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\\.js$/;\n function hasProp(obj, prop) {\n return hasOwn.call(obj, prop);\n }\n function normalize(name, baseName) {\n var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, baseParts = baseName && baseName.split(\"/\"), map = config.map, starMap = map && map[\"*\"] || {};\n if (name) {\n name = name.split(\"/\");\n lastIndex = name.length - 1;\n if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, \"\");\n }\n if (name[0].charAt(0) === \".\" && baseParts) {\n normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n name = normalizedBaseParts.concat(name);\n }\n for (i = 0; i < name.length; i++) {\n part = name[i];\n if (part === \".\") {\n name.splice(i, 1);\n i -= 1;\n } else if (part === \"..\") {\n if (i === 0 || i === 1 && name[2] === \"..\" || name[i - 1] === \"..\") {\n continue;\n } else if (i > 0) {\n name.splice(i - 1, 2);\n i -= 2;\n }\n }\n }\n name = name.join(\"/\");\n }\n if ((baseParts || starMap) && map) {\n nameParts = name.split(\"/\");\n for (i = nameParts.length; i > 0; i -= 1) {\n nameSegment = nameParts.slice(0, i).join(\"/\");\n if (baseParts) {\n for (j = baseParts.length; j > 0; j -= 1) {\n mapValue = map[baseParts.slice(0, j).join(\"/\")];\n if (mapValue) {\n mapValue = mapValue[nameSegment];\n if (mapValue) {\n foundMap = mapValue;\n foundI = i;\n break;\n }\n }\n }\n }\n if (foundMap) {\n break;\n }\n if (!foundStarMap && starMap && starMap[nameSegment]) {\n foundStarMap = starMap[nameSegment];\n starI = i;\n }\n }\n if (!foundMap && foundStarMap) {\n foundMap = foundStarMap;\n foundI = starI;\n }\n if (foundMap) {\n nameParts.splice(0, foundI, foundMap);\n name = nameParts.join(\"/\");\n }\n }\n return name;\n }\n function makeRequire(relName, forceSync) {\n return function() {\n var args = aps.call(arguments, 0);\n if (typeof args[0] !== \"string\" && args.length === 1) {\n args.push(null);\n }\n return req.apply(undef, args.concat([relName, forceSync]));\n };\n }\n function makeNormalize(relName) {\n return function(name) {\n return normalize(name, relName);\n };\n }\n function makeLoad(depName) {\n return function(value) {\n defined[depName] = value;\n };\n }\n function callDep(name) {\n if (hasProp(waiting, name)) {\n var args = waiting[name];\n delete waiting[name];\n defining[name] = true;\n main.apply(undef, args);\n }\n if (!hasProp(defined, name) && !hasProp(defining, name)) {\n throw new Error(\"No \" + name);\n }\n return defined[name];\n }\n function splitPrefix(name) {\n var prefix, index = name ? name.indexOf(\"!\") : -1;\n if (index > -1) {\n prefix = name.substring(0, index);\n name = name.substring(index + 1, name.length);\n }\n return [prefix, name];\n }\n function makeRelParts(relName) {\n return relName ? splitPrefix(relName) : [];\n }\n makeMap = function(name, relParts) {\n var plugin, parts = splitPrefix(name), prefix = parts[0], relResourceName = relParts[1];\n name = parts[1];\n if (prefix) {\n prefix = normalize(prefix, relResourceName);\n plugin = callDep(prefix);\n }\n if (prefix) {\n if (plugin && plugin.normalize) {\n name = plugin.normalize(name, makeNormalize(relResourceName));\n } else {\n name = normalize(name, relResourceName);\n }\n } else {\n name = normalize(name, relResourceName);\n parts = splitPrefix(name);\n prefix = parts[0];\n name = parts[1];\n if (prefix) {\n plugin = callDep(prefix);\n }\n }\n return {\n f: prefix ? prefix + \"!\" + name : name,\n //fullName\n n: name,\n pr: prefix,\n p: plugin\n };\n };\n function makeConfig(name) {\n return function() {\n return config && config.config && config.config[name] || {};\n };\n }\n handlers = {\n require: function(name) {\n return makeRequire(name);\n },\n exports: function(name) {\n var e = defined[name];\n if (typeof e !== \"undefined\") {\n return e;\n } else {\n return defined[name] = {};\n }\n },\n module: function(name) {\n return {\n id: name,\n uri: \"\",\n exports: defined[name],\n config: makeConfig(name)\n };\n }\n };\n main = function(name, deps, callback, relName) {\n var cjsModule, depName, ret, map, i, relParts, args = [], callbackType = typeof callback, usingExports;\n relName = relName || name;\n relParts = makeRelParts(relName);\n if (callbackType === \"undefined\" || callbackType === \"function\") {\n deps = !deps.length && callback.length ? [\"require\", \"exports\", \"module\"] : deps;\n for (i = 0; i < deps.length; i += 1) {\n map = makeMap(deps[i], relParts);\n depName = map.f;\n if (depName === \"require\") {\n args[i] = handlers.require(name);\n } else if (depName === \"exports\") {\n args[i] = handlers.exports(name);\n usingExports = true;\n } else if (depName === \"module\") {\n cjsModule = args[i] = handlers.module(name);\n } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) {\n args[i] = callDep(depName);\n } else if (map.p) {\n map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n args[i] = defined[depName];\n } else {\n throw new Error(name + \" missing \" + depName);\n }\n }\n ret = callback ? callback.apply(defined[name], args) : void 0;\n if (name) {\n if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) {\n defined[name] = cjsModule.exports;\n } else if (ret !== undef || !usingExports) {\n defined[name] = ret;\n }\n }\n } else if (name) {\n defined[name] = callback;\n }\n };\n requirejs = require2 = req = function(deps, callback, relName, forceSync, alt) {\n if (typeof deps === \"string\") {\n if (handlers[deps]) {\n return handlers[deps](callback);\n }\n return callDep(makeMap(deps, makeRelParts(callback)).f);\n } else if (!deps.splice) {\n config = deps;\n if (config.deps) {\n req(config.deps, config.callback);\n }\n if (!callback) {\n return;\n }\n if (callback.splice) {\n deps = callback;\n callback = relName;\n relName = null;\n } else {\n deps = undef;\n }\n }\n callback = callback || function() {\n };\n if (typeof relName === \"function\") {\n relName = forceSync;\n forceSync = alt;\n }\n if (forceSync) {\n main(undef, deps, callback, relName);\n } else {\n setTimeout(function() {\n main(undef, deps, callback, relName);\n }, 4);\n }\n return req;\n };\n req.config = function(cfg) {\n return req(cfg);\n };\n requirejs._defined = defined;\n define2 = function(name, deps, callback) {\n if (typeof name !== \"string\") {\n throw new Error(\"See almond README: incorrect module build, no module name\");\n }\n if (!deps.splice) {\n callback = deps;\n deps = [];\n }\n if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n waiting[name] = [name, deps, callback];\n }\n };\n define2.amd = {\n jQuery: true\n };\n })();\n S22.requirejs = requirejs;\n S22.require = require2;\n S22.define = define2;\n }\n })();\n S22.define(\"almond\", function() {\n });\n S22.define(\"jquery\", [], function() {\n var _$ = jQuery2 || $;\n if (_$ == null && console && console.error) {\n console.error(\n \"Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page.\"\n );\n }\n return _$;\n });\n S22.define(\"select2/utils\", [\n \"jquery\"\n ], function($2) {\n var Utils = {};\n Utils.Extend = function(ChildClass, SuperClass) {\n var __hasProp = {}.hasOwnProperty;\n function BaseConstructor() {\n this.constructor = ChildClass;\n }\n for (var key in SuperClass) {\n if (__hasProp.call(SuperClass, key)) {\n ChildClass[key] = SuperClass[key];\n }\n }\n BaseConstructor.prototype = SuperClass.prototype;\n ChildClass.prototype = new BaseConstructor();\n ChildClass.__super__ = SuperClass.prototype;\n return ChildClass;\n };\n function getMethods(theClass) {\n var proto = theClass.prototype;\n var methods = [];\n for (var methodName in proto) {\n var m = proto[methodName];\n if (typeof m !== \"function\") {\n continue;\n }\n if (methodName === \"constructor\") {\n continue;\n }\n methods.push(methodName);\n }\n return methods;\n }\n Utils.Decorate = function(SuperClass, DecoratorClass) {\n var decoratedMethods = getMethods(DecoratorClass);\n var superMethods = getMethods(SuperClass);\n function DecoratedClass() {\n var unshift = Array.prototype.unshift;\n var argCount = DecoratorClass.prototype.constructor.length;\n var calledConstructor = SuperClass.prototype.constructor;\n if (argCount > 0) {\n unshift.call(arguments, SuperClass.prototype.constructor);\n calledConstructor = DecoratorClass.prototype.constructor;\n }\n calledConstructor.apply(this, arguments);\n }\n DecoratorClass.displayName = SuperClass.displayName;\n function ctr() {\n this.constructor = DecoratedClass;\n }\n DecoratedClass.prototype = new ctr();\n for (var m = 0; m < superMethods.length; m++) {\n var superMethod = superMethods[m];\n DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod];\n }\n var calledMethod = function(methodName) {\n var originalMethod = function() {\n };\n if (methodName in DecoratedClass.prototype) {\n originalMethod = DecoratedClass.prototype[methodName];\n }\n var decoratedMethod2 = DecoratorClass.prototype[methodName];\n return function() {\n var unshift = Array.prototype.unshift;\n unshift.call(arguments, originalMethod);\n return decoratedMethod2.apply(this, arguments);\n };\n };\n for (var d = 0; d < decoratedMethods.length; d++) {\n var decoratedMethod = decoratedMethods[d];\n DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n }\n return DecoratedClass;\n };\n var Observable = function() {\n this.listeners = {};\n };\n Observable.prototype.on = function(event, callback) {\n this.listeners = this.listeners || {};\n if (event in this.listeners) {\n this.listeners[event].push(callback);\n } else {\n this.listeners[event] = [callback];\n }\n };\n Observable.prototype.trigger = function(event) {\n var slice = Array.prototype.slice;\n var params = slice.call(arguments, 1);\n this.listeners = this.listeners || {};\n if (params == null) {\n params = [];\n }\n if (params.length === 0) {\n params.push({});\n }\n params[0]._type = event;\n if (event in this.listeners) {\n this.invoke(this.listeners[event], slice.call(arguments, 1));\n }\n if (\"*\" in this.listeners) {\n this.invoke(this.listeners[\"*\"], arguments);\n }\n };\n Observable.prototype.invoke = function(listeners, params) {\n for (var i = 0, len = listeners.length; i < len; i++) {\n listeners[i].apply(this, params);\n }\n };\n Utils.Observable = Observable;\n Utils.generateChars = function(length) {\n var chars = \"\";\n for (var i = 0; i < length; i++) {\n var randomChar = Math.floor(Math.random() * 36);\n chars += randomChar.toString(36);\n }\n return chars;\n };\n Utils.bind = function(func, context) {\n return function() {\n func.apply(context, arguments);\n };\n };\n Utils._convertData = function(data) {\n for (var originalKey in data) {\n var keys = originalKey.split(\"-\");\n var dataLevel = data;\n if (keys.length === 1) {\n continue;\n }\n for (var k = 0; k < keys.length; k++) {\n var key = keys[k];\n key = key.substring(0, 1).toLowerCase() + key.substring(1);\n if (!(key in dataLevel)) {\n dataLevel[key] = {};\n }\n if (k == keys.length - 1) {\n dataLevel[key] = data[originalKey];\n }\n dataLevel = dataLevel[key];\n }\n delete data[originalKey];\n }\n return data;\n };\n Utils.hasScroll = function(index, el) {\n var $el = $2(el);\n var overflowX = el.style.overflowX;\n var overflowY = el.style.overflowY;\n if (overflowX === overflowY && (overflowY === \"hidden\" || overflowY === \"visible\")) {\n return false;\n }\n if (overflowX === \"scroll\" || overflowY === \"scroll\") {\n return true;\n }\n return $el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth;\n };\n Utils.escapeMarkup = function(markup) {\n var replaceMap = {\n \"\\\\\": \"\\",\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\"\n };\n if (typeof markup !== \"string\") {\n return markup;\n }\n return String(markup).replace(/[&<>\"'\\/\\\\]/g, function(match) {\n return replaceMap[match];\n });\n };\n Utils.__cache = {};\n var id = 0;\n Utils.GetUniqueElementId = function(element) {\n var select2Id = element.getAttribute(\"data-select2-id\");\n if (select2Id != null) {\n return select2Id;\n }\n if (element.id) {\n select2Id = \"select2-data-\" + element.id;\n } else {\n select2Id = \"select2-data-\" + (++id).toString() + \"-\" + Utils.generateChars(4);\n }\n element.setAttribute(\"data-select2-id\", select2Id);\n return select2Id;\n };\n Utils.StoreData = function(element, name, value) {\n var id2 = Utils.GetUniqueElementId(element);\n if (!Utils.__cache[id2]) {\n Utils.__cache[id2] = {};\n }\n Utils.__cache[id2][name] = value;\n };\n Utils.GetData = function(element, name) {\n var id2 = Utils.GetUniqueElementId(element);\n if (name) {\n if (Utils.__cache[id2]) {\n if (Utils.__cache[id2][name] != null) {\n return Utils.__cache[id2][name];\n }\n return $2(element).data(name);\n }\n return $2(element).data(name);\n } else {\n return Utils.__cache[id2];\n }\n };\n Utils.RemoveData = function(element) {\n var id2 = Utils.GetUniqueElementId(element);\n if (Utils.__cache[id2] != null) {\n delete Utils.__cache[id2];\n }\n element.removeAttribute(\"data-select2-id\");\n };\n Utils.copyNonInternalCssClasses = function(dest, src) {\n var classes;\n var destinationClasses = dest.getAttribute(\"class\").trim().split(/\\s+/);\n destinationClasses = destinationClasses.filter(function(clazz) {\n return clazz.indexOf(\"select2-\") === 0;\n });\n var sourceClasses = src.getAttribute(\"class\").trim().split(/\\s+/);\n sourceClasses = sourceClasses.filter(function(clazz) {\n return clazz.indexOf(\"select2-\") !== 0;\n });\n var replacements = destinationClasses.concat(sourceClasses);\n dest.setAttribute(\"class\", replacements.join(\" \"));\n };\n return Utils;\n });\n S22.define(\"select2/results\", [\n \"jquery\",\n \"./utils\"\n ], function($2, Utils) {\n function Results($element, options, dataAdapter) {\n this.$element = $element;\n this.data = dataAdapter;\n this.options = options;\n Results.__super__.constructor.call(this);\n }\n Utils.Extend(Results, Utils.Observable);\n Results.prototype.render = function() {\n var $results = $2(\n ''\n );\n if (this.options.get(\"multiple\")) {\n $results.attr(\"aria-multiselectable\", \"true\");\n }\n this.$results = $results;\n return $results;\n };\n Results.prototype.clear = function() {\n this.$results.empty();\n };\n Results.prototype.displayMessage = function(params) {\n var escapeMarkup = this.options.get(\"escapeMarkup\");\n this.clear();\n this.hideLoading();\n var $message = $2(\n '
  • '\n );\n var message = this.options.get(\"translations\").get(params.message);\n $message.append(\n escapeMarkup(\n message(params.args)\n )\n );\n $message[0].className += \" select2-results__message\";\n this.$results.append($message);\n };\n Results.prototype.hideMessages = function() {\n this.$results.find(\".select2-results__message\").remove();\n };\n Results.prototype.append = function(data) {\n this.hideLoading();\n var $options = [];\n if (data.results == null || data.results.length === 0) {\n if (this.$results.children().length === 0) {\n this.trigger(\"results:message\", {\n message: \"noResults\"\n });\n }\n return;\n }\n data.results = this.sort(data.results);\n for (var d = 0; d < data.results.length; d++) {\n var item = data.results[d];\n var $option = this.option(item);\n $options.push($option);\n }\n this.$results.append($options);\n };\n Results.prototype.position = function($results, $dropdown) {\n var $resultsContainer = $dropdown.find(\".select2-results\");\n $resultsContainer.append($results);\n };\n Results.prototype.sort = function(data) {\n var sorter = this.options.get(\"sorter\");\n return sorter(data);\n };\n Results.prototype.highlightFirstItem = function() {\n var $options = this.$results.find(\".select2-results__option--selectable\");\n var $selected = $options.filter(\".select2-results__option--selected\");\n if ($selected.length > 0) {\n $selected.first().trigger(\"mouseenter\");\n } else {\n $options.first().trigger(\"mouseenter\");\n }\n this.ensureHighlightVisible();\n };\n Results.prototype.setClasses = function() {\n var self = this;\n this.data.current(function(selected) {\n var selectedIds = selected.map(function(s) {\n return s.id.toString();\n });\n var $options = self.$results.find(\".select2-results__option--selectable\");\n $options.each(function() {\n var $option = $2(this);\n var item = Utils.GetData(this, \"data\");\n var id = \"\" + item.id;\n if (item.element != null && item.element.selected || item.element == null && selectedIds.indexOf(id) > -1) {\n this.classList.add(\"select2-results__option--selected\");\n $option.attr(\"aria-selected\", \"true\");\n } else {\n this.classList.remove(\"select2-results__option--selected\");\n $option.attr(\"aria-selected\", \"false\");\n }\n });\n });\n };\n Results.prototype.showLoading = function(params) {\n this.hideLoading();\n var loadingMore = this.options.get(\"translations\").get(\"searching\");\n var loading = {\n disabled: true,\n loading: true,\n text: loadingMore(params)\n };\n var $loading = this.option(loading);\n $loading.className += \" loading-results\";\n this.$results.prepend($loading);\n };\n Results.prototype.hideLoading = function() {\n this.$results.find(\".loading-results\").remove();\n };\n Results.prototype.option = function(data) {\n var option = document.createElement(\"li\");\n option.classList.add(\"select2-results__option\");\n option.classList.add(\"select2-results__option--selectable\");\n var attrs = {\n \"role\": \"option\"\n };\n var matches = window.Element.prototype.matches || window.Element.prototype.msMatchesSelector || window.Element.prototype.webkitMatchesSelector;\n if (data.element != null && matches.call(data.element, \":disabled\") || data.element == null && data.disabled) {\n attrs[\"aria-disabled\"] = \"true\";\n option.classList.remove(\"select2-results__option--selectable\");\n option.classList.add(\"select2-results__option--disabled\");\n }\n if (data.id == null) {\n option.classList.remove(\"select2-results__option--selectable\");\n }\n if (data._resultId != null) {\n option.id = data._resultId;\n }\n if (data.title) {\n option.title = data.title;\n }\n if (data.children) {\n attrs.role = \"group\";\n attrs[\"aria-label\"] = data.text;\n option.classList.remove(\"select2-results__option--selectable\");\n option.classList.add(\"select2-results__option--group\");\n }\n for (var attr in attrs) {\n var val = attrs[attr];\n option.setAttribute(attr, val);\n }\n if (data.children) {\n var $option = $2(option);\n var label = document.createElement(\"strong\");\n label.className = \"select2-results__group\";\n this.template(data, label);\n var $children = [];\n for (var c = 0; c < data.children.length; c++) {\n var child = data.children[c];\n var $child = this.option(child);\n $children.push($child);\n }\n var $childrenContainer = $2(\"\", {\n \"class\": \"select2-results__options select2-results__options--nested\",\n \"role\": \"none\"\n });\n $childrenContainer.append($children);\n $option.append(label);\n $option.append($childrenContainer);\n } else {\n this.template(data, option);\n }\n Utils.StoreData(option, \"data\", data);\n return option;\n };\n Results.prototype.bind = function(container, $container) {\n var self = this;\n var id = container.id + \"-results\";\n this.$results.attr(\"id\", id);\n container.on(\"results:all\", function(params) {\n self.clear();\n self.append(params.data);\n if (container.isOpen()) {\n self.setClasses();\n self.highlightFirstItem();\n }\n });\n container.on(\"results:append\", function(params) {\n self.append(params.data);\n if (container.isOpen()) {\n self.setClasses();\n }\n });\n container.on(\"query\", function(params) {\n self.hideMessages();\n self.showLoading(params);\n });\n container.on(\"select\", function() {\n if (!container.isOpen()) {\n return;\n }\n self.setClasses();\n if (self.options.get(\"scrollAfterSelect\")) {\n self.highlightFirstItem();\n }\n });\n container.on(\"unselect\", function() {\n if (!container.isOpen()) {\n return;\n }\n self.setClasses();\n if (self.options.get(\"scrollAfterSelect\")) {\n self.highlightFirstItem();\n }\n });\n container.on(\"open\", function() {\n self.$results.attr(\"aria-expanded\", \"true\");\n self.$results.attr(\"aria-hidden\", \"false\");\n self.setClasses();\n self.ensureHighlightVisible();\n });\n container.on(\"close\", function() {\n self.$results.attr(\"aria-expanded\", \"false\");\n self.$results.attr(\"aria-hidden\", \"true\");\n self.$results.removeAttr(\"aria-activedescendant\");\n });\n container.on(\"results:toggle\", function() {\n var $highlighted = self.getHighlightedResults();\n if ($highlighted.length === 0) {\n return;\n }\n $highlighted.trigger(\"mouseup\");\n });\n container.on(\"results:select\", function() {\n var $highlighted = self.getHighlightedResults();\n if ($highlighted.length === 0) {\n return;\n }\n var data = Utils.GetData($highlighted[0], \"data\");\n if ($highlighted.hasClass(\"select2-results__option--selected\")) {\n self.trigger(\"close\", {});\n } else {\n self.trigger(\"select\", {\n data\n });\n }\n });\n container.on(\"results:previous\", function() {\n var $highlighted = self.getHighlightedResults();\n var $options = self.$results.find(\".select2-results__option--selectable\");\n var currentIndex = $options.index($highlighted);\n if (currentIndex <= 0) {\n return;\n }\n var nextIndex = currentIndex - 1;\n if ($highlighted.length === 0) {\n nextIndex = 0;\n }\n var $next = $options.eq(nextIndex);\n $next.trigger(\"mouseenter\");\n var currentOffset = self.$results.offset().top;\n var nextTop = $next.offset().top;\n var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n if (nextIndex === 0) {\n self.$results.scrollTop(0);\n } else if (nextTop - currentOffset < 0) {\n self.$results.scrollTop(nextOffset);\n }\n });\n container.on(\"results:next\", function() {\n var $highlighted = self.getHighlightedResults();\n var $options = self.$results.find(\".select2-results__option--selectable\");\n var currentIndex = $options.index($highlighted);\n var nextIndex = currentIndex + 1;\n if (nextIndex >= $options.length) {\n return;\n }\n var $next = $options.eq(nextIndex);\n $next.trigger(\"mouseenter\");\n var currentOffset = self.$results.offset().top + self.$results.outerHeight(false);\n var nextBottom = $next.offset().top + $next.outerHeight(false);\n var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n if (nextIndex === 0) {\n self.$results.scrollTop(0);\n } else if (nextBottom > currentOffset) {\n self.$results.scrollTop(nextOffset);\n }\n });\n container.on(\"results:focus\", function(params) {\n params.element[0].classList.add(\"select2-results__option--highlighted\");\n params.element[0].setAttribute(\"aria-selected\", \"true\");\n });\n container.on(\"results:message\", function(params) {\n self.displayMessage(params);\n });\n if ($2.fn.mousewheel) {\n this.$results.on(\"mousewheel\", function(e) {\n var top = self.$results.scrollTop();\n var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;\n var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n if (isAtTop) {\n self.$results.scrollTop(0);\n e.preventDefault();\n e.stopPropagation();\n } else if (isAtBottom) {\n self.$results.scrollTop(\n self.$results.get(0).scrollHeight - self.$results.height()\n );\n e.preventDefault();\n e.stopPropagation();\n }\n });\n }\n this.$results.on(\n \"mouseup\",\n \".select2-results__option--selectable\",\n function(evt) {\n var $this = $2(this);\n var data = Utils.GetData(this, \"data\");\n if ($this.hasClass(\"select2-results__option--selected\")) {\n if (self.options.get(\"multiple\")) {\n self.trigger(\"unselect\", {\n originalEvent: evt,\n data\n });\n } else {\n self.trigger(\"close\", {});\n }\n return;\n }\n self.trigger(\"select\", {\n originalEvent: evt,\n data\n });\n }\n );\n this.$results.on(\n \"mouseenter\",\n \".select2-results__option--selectable\",\n function(evt) {\n var data = Utils.GetData(this, \"data\");\n self.getHighlightedResults().removeClass(\"select2-results__option--highlighted\").attr(\"aria-selected\", \"false\");\n self.trigger(\"results:focus\", {\n data,\n element: $2(this)\n });\n }\n );\n };\n Results.prototype.getHighlightedResults = function() {\n var $highlighted = this.$results.find(\".select2-results__option--highlighted\");\n return $highlighted;\n };\n Results.prototype.destroy = function() {\n this.$results.remove();\n };\n Results.prototype.ensureHighlightVisible = function() {\n var $highlighted = this.getHighlightedResults();\n if ($highlighted.length === 0) {\n return;\n }\n var $options = this.$results.find(\".select2-results__option--selectable\");\n var currentIndex = $options.index($highlighted);\n var currentOffset = this.$results.offset().top;\n var nextTop = $highlighted.offset().top;\n var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n var offsetDelta = nextTop - currentOffset;\n nextOffset -= $highlighted.outerHeight(false) * 2;\n if (currentIndex <= 2) {\n this.$results.scrollTop(0);\n } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n this.$results.scrollTop(nextOffset);\n }\n };\n Results.prototype.template = function(result, container) {\n var template = this.options.get(\"templateResult\");\n var escapeMarkup = this.options.get(\"escapeMarkup\");\n var content = template(result, container);\n if (content == null) {\n container.style.display = \"none\";\n } else if (typeof content === \"string\") {\n container.innerHTML = escapeMarkup(content);\n } else {\n $2(container).append(content);\n }\n };\n return Results;\n });\n S22.define(\"select2/keys\", [], function() {\n var KEYS = {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n ESC: 27,\n SPACE: 32,\n PAGE_UP: 33,\n PAGE_DOWN: 34,\n END: 35,\n HOME: 36,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n DELETE: 46\n };\n return KEYS;\n });\n S22.define(\"select2/selection/base\", [\n \"jquery\",\n \"../utils\",\n \"../keys\"\n ], function($2, Utils, KEYS) {\n function BaseSelection($element, options) {\n this.$element = $element;\n this.options = options;\n BaseSelection.__super__.constructor.call(this);\n }\n Utils.Extend(BaseSelection, Utils.Observable);\n BaseSelection.prototype.render = function() {\n var $selection = $2(\n ''\n );\n this._tabindex = 0;\n if (Utils.GetData(this.$element[0], \"old-tabindex\") != null) {\n this._tabindex = Utils.GetData(this.$element[0], \"old-tabindex\");\n } else if (this.$element.attr(\"tabindex\") != null) {\n this._tabindex = this.$element.attr(\"tabindex\");\n }\n $selection.attr(\"title\", this.$element.attr(\"title\"));\n $selection.attr(\"tabindex\", this._tabindex);\n $selection.attr(\"aria-disabled\", \"false\");\n this.$selection = $selection;\n return $selection;\n };\n BaseSelection.prototype.bind = function(container, $container) {\n var self = this;\n var resultsId = container.id + \"-results\";\n this.container = container;\n this.$selection.on(\"focus\", function(evt) {\n self.trigger(\"focus\", evt);\n });\n this.$selection.on(\"blur\", function(evt) {\n self._handleBlur(evt);\n });\n this.$selection.on(\"keydown\", function(evt) {\n self.trigger(\"keypress\", evt);\n if (evt.which === KEYS.SPACE) {\n evt.preventDefault();\n }\n });\n container.on(\"results:focus\", function(params) {\n self.$selection.attr(\"aria-activedescendant\", params.data._resultId);\n });\n container.on(\"selection:update\", function(params) {\n self.update(params.data);\n });\n container.on(\"open\", function() {\n self.$selection.attr(\"aria-expanded\", \"true\");\n self.$selection.attr(\"aria-owns\", resultsId);\n self._attachCloseHandler(container);\n });\n container.on(\"close\", function() {\n self.$selection.attr(\"aria-expanded\", \"false\");\n self.$selection.removeAttr(\"aria-activedescendant\");\n self.$selection.removeAttr(\"aria-owns\");\n self.$selection.trigger(\"focus\");\n self._detachCloseHandler(container);\n });\n container.on(\"enable\", function() {\n self.$selection.attr(\"tabindex\", self._tabindex);\n self.$selection.attr(\"aria-disabled\", \"false\");\n });\n container.on(\"disable\", function() {\n self.$selection.attr(\"tabindex\", \"-1\");\n self.$selection.attr(\"aria-disabled\", \"true\");\n });\n };\n BaseSelection.prototype._handleBlur = function(evt) {\n var self = this;\n window.setTimeout(function() {\n if (document.activeElement == self.$selection[0] || $2.contains(self.$selection[0], document.activeElement)) {\n return;\n }\n self.trigger(\"blur\", evt);\n }, 1);\n };\n BaseSelection.prototype._attachCloseHandler = function(container) {\n $2(document.body).on(\"mousedown.select2.\" + container.id, function(e) {\n var $target = $2(e.target);\n var $select = $target.closest(\".select2\");\n var $all = $2(\".select2.select2-container--open\");\n $all.each(function() {\n if (this == $select[0]) {\n return;\n }\n var $element = Utils.GetData(this, \"element\");\n $element.select2(\"close\");\n });\n });\n };\n BaseSelection.prototype._detachCloseHandler = function(container) {\n $2(document.body).off(\"mousedown.select2.\" + container.id);\n };\n BaseSelection.prototype.position = function($selection, $container) {\n var $selectionContainer = $container.find(\".selection\");\n $selectionContainer.append($selection);\n };\n BaseSelection.prototype.destroy = function() {\n this._detachCloseHandler(this.container);\n };\n BaseSelection.prototype.update = function(data) {\n throw new Error(\"The `update` method must be defined in child classes.\");\n };\n BaseSelection.prototype.isEnabled = function() {\n return !this.isDisabled();\n };\n BaseSelection.prototype.isDisabled = function() {\n return this.options.get(\"disabled\");\n };\n return BaseSelection;\n });\n S22.define(\"select2/selection/single\", [\n \"jquery\",\n \"./base\",\n \"../utils\",\n \"../keys\"\n ], function($2, BaseSelection, Utils, KEYS) {\n function SingleSelection() {\n SingleSelection.__super__.constructor.apply(this, arguments);\n }\n Utils.Extend(SingleSelection, BaseSelection);\n SingleSelection.prototype.render = function() {\n var $selection = SingleSelection.__super__.render.call(this);\n $selection[0].classList.add(\"select2-selection--single\");\n $selection.html(\n ''\n );\n return $selection;\n };\n SingleSelection.prototype.bind = function(container, $container) {\n var self = this;\n SingleSelection.__super__.bind.apply(this, arguments);\n var id = container.id + \"-container\";\n this.$selection.find(\".select2-selection__rendered\").attr(\"id\", id).attr(\"role\", \"textbox\").attr(\"aria-readonly\", \"true\");\n this.$selection.attr(\"aria-labelledby\", id);\n this.$selection.attr(\"aria-controls\", id);\n this.$selection.on(\"mousedown\", function(evt) {\n if (evt.which !== 1) {\n return;\n }\n self.trigger(\"toggle\", {\n originalEvent: evt\n });\n });\n this.$selection.on(\"focus\", function(evt) {\n });\n this.$selection.on(\"blur\", function(evt) {\n });\n container.on(\"focus\", function(evt) {\n if (!container.isOpen()) {\n self.$selection.trigger(\"focus\");\n }\n });\n };\n SingleSelection.prototype.clear = function() {\n var $rendered = this.$selection.find(\".select2-selection__rendered\");\n $rendered.empty();\n $rendered.removeAttr(\"title\");\n };\n SingleSelection.prototype.display = function(data, container) {\n var template = this.options.get(\"templateSelection\");\n var escapeMarkup = this.options.get(\"escapeMarkup\");\n return escapeMarkup(template(data, container));\n };\n SingleSelection.prototype.selectionContainer = function() {\n return $2(\"\");\n };\n SingleSelection.prototype.update = function(data) {\n if (data.length === 0) {\n this.clear();\n return;\n }\n var selection = data[0];\n var $rendered = this.$selection.find(\".select2-selection__rendered\");\n var formatted = this.display(selection, $rendered);\n $rendered.empty().append(formatted);\n var title = selection.title || selection.text;\n if (title) {\n $rendered.attr(\"title\", title);\n } else {\n $rendered.removeAttr(\"title\");\n }\n };\n return SingleSelection;\n });\n S22.define(\"select2/selection/multiple\", [\n \"jquery\",\n \"./base\",\n \"../utils\"\n ], function($2, BaseSelection, Utils) {\n function MultipleSelection($element, options) {\n MultipleSelection.__super__.constructor.apply(this, arguments);\n }\n Utils.Extend(MultipleSelection, BaseSelection);\n MultipleSelection.prototype.render = function() {\n var $selection = MultipleSelection.__super__.render.call(this);\n $selection[0].classList.add(\"select2-selection--multiple\");\n $selection.html(\n ''\n );\n return $selection;\n };\n MultipleSelection.prototype.bind = function(container, $container) {\n var self = this;\n MultipleSelection.__super__.bind.apply(this, arguments);\n var id = container.id + \"-container\";\n this.$selection.find(\".select2-selection__rendered\").attr(\"id\", id);\n this.$selection.on(\"click\", function(evt) {\n self.trigger(\"toggle\", {\n originalEvent: evt\n });\n });\n this.$selection.on(\n \"click\",\n \".select2-selection__choice__remove\",\n function(evt) {\n if (self.isDisabled()) {\n return;\n }\n var $remove = $2(this);\n var $selection = $remove.parent();\n var data = Utils.GetData($selection[0], \"data\");\n self.trigger(\"unselect\", {\n originalEvent: evt,\n data\n });\n }\n );\n this.$selection.on(\n \"keydown\",\n \".select2-selection__choice__remove\",\n function(evt) {\n if (self.isDisabled()) {\n return;\n }\n evt.stopPropagation();\n }\n );\n };\n MultipleSelection.prototype.clear = function() {\n var $rendered = this.$selection.find(\".select2-selection__rendered\");\n $rendered.empty();\n $rendered.removeAttr(\"title\");\n };\n MultipleSelection.prototype.display = function(data, container) {\n var template = this.options.get(\"templateSelection\");\n var escapeMarkup = this.options.get(\"escapeMarkup\");\n return escapeMarkup(template(data, container));\n };\n MultipleSelection.prototype.selectionContainer = function() {\n var $container = $2(\n '
  • '\n );\n return $container;\n };\n MultipleSelection.prototype.update = function(data) {\n this.clear();\n if (data.length === 0) {\n return;\n }\n var $selections = [];\n var selectionIdPrefix = this.$selection.find(\".select2-selection__rendered\").attr(\"id\") + \"-choice-\";\n for (var d = 0; d < data.length; d++) {\n var selection = data[d];\n var $selection = this.selectionContainer();\n var formatted = this.display(selection, $selection);\n var selectionId = selectionIdPrefix + Utils.generateChars(4) + \"-\";\n if (selection.id) {\n selectionId += selection.id;\n } else {\n selectionId += Utils.generateChars(4);\n }\n $selection.find(\".select2-selection__choice__display\").append(formatted).attr(\"id\", selectionId);\n var title = selection.title || selection.text;\n if (title) {\n $selection.attr(\"title\", title);\n }\n var removeItem = this.options.get(\"translations\").get(\"removeItem\");\n var $remove = $selection.find(\".select2-selection__choice__remove\");\n $remove.attr(\"title\", removeItem());\n $remove.attr(\"aria-label\", removeItem());\n $remove.attr(\"aria-describedby\", selectionId);\n Utils.StoreData($selection[0], \"data\", selection);\n $selections.push($selection);\n }\n var $rendered = this.$selection.find(\".select2-selection__rendered\");\n $rendered.append($selections);\n };\n return MultipleSelection;\n });\n S22.define(\"select2/selection/placeholder\", [], function() {\n function Placeholder(decorated, $element, options) {\n this.placeholder = this.normalizePlaceholder(options.get(\"placeholder\"));\n decorated.call(this, $element, options);\n }\n Placeholder.prototype.normalizePlaceholder = function(_, placeholder) {\n if (typeof placeholder === \"string\") {\n placeholder = {\n id: \"\",\n text: placeholder\n };\n }\n return placeholder;\n };\n Placeholder.prototype.createPlaceholder = function(decorated, placeholder) {\n var $placeholder = this.selectionContainer();\n $placeholder.html(this.display(placeholder));\n $placeholder[0].classList.add(\"select2-selection__placeholder\");\n $placeholder[0].classList.remove(\"select2-selection__choice\");\n var placeholderTitle = placeholder.title || placeholder.text || $placeholder.text();\n this.$selection.find(\".select2-selection__rendered\").attr(\n \"title\",\n placeholderTitle\n );\n return $placeholder;\n };\n Placeholder.prototype.update = function(decorated, data) {\n var singlePlaceholder = data.length == 1 && data[0].id != this.placeholder.id;\n var multipleSelections = data.length > 1;\n if (multipleSelections || singlePlaceholder) {\n return decorated.call(this, data);\n }\n this.clear();\n var $placeholder = this.createPlaceholder(this.placeholder);\n this.$selection.find(\".select2-selection__rendered\").append($placeholder);\n };\n return Placeholder;\n });\n S22.define(\"select2/selection/allowClear\", [\n \"jquery\",\n \"../keys\",\n \"../utils\"\n ], function($2, KEYS, Utils) {\n function AllowClear() {\n }\n AllowClear.prototype.bind = function(decorated, container, $container) {\n var self = this;\n decorated.call(this, container, $container);\n if (this.placeholder == null) {\n if (this.options.get(\"debug\") && window.console && console.error) {\n console.error(\n \"Select2: The `allowClear` option should be used in combination with the `placeholder` option.\"\n );\n }\n }\n this.$selection.on(\n \"mousedown\",\n \".select2-selection__clear\",\n function(evt) {\n self._handleClear(evt);\n }\n );\n container.on(\"keypress\", function(evt) {\n self._handleKeyboardClear(evt, container);\n });\n };\n AllowClear.prototype._handleClear = function(_, evt) {\n if (this.isDisabled()) {\n return;\n }\n var $clear = this.$selection.find(\".select2-selection__clear\");\n if ($clear.length === 0) {\n return;\n }\n evt.stopPropagation();\n var data = Utils.GetData($clear[0], \"data\");\n var previousVal = this.$element.val();\n this.$element.val(this.placeholder.id);\n var unselectData = {\n data\n };\n this.trigger(\"clear\", unselectData);\n if (unselectData.prevented) {\n this.$element.val(previousVal);\n return;\n }\n for (var d = 0; d < data.length; d++) {\n unselectData = {\n data: data[d]\n };\n this.trigger(\"unselect\", unselectData);\n if (unselectData.prevented) {\n this.$element.val(previousVal);\n return;\n }\n }\n this.$element.trigger(\"input\").trigger(\"change\");\n this.trigger(\"toggle\", {});\n };\n AllowClear.prototype._handleKeyboardClear = function(_, evt, container) {\n if (container.isOpen()) {\n return;\n }\n if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n this._handleClear(evt);\n }\n };\n AllowClear.prototype.update = function(decorated, data) {\n decorated.call(this, data);\n this.$selection.find(\".select2-selection__clear\").remove();\n this.$selection[0].classList.remove(\"select2-selection--clearable\");\n if (this.$selection.find(\".select2-selection__placeholder\").length > 0 || data.length === 0) {\n return;\n }\n var selectionId = this.$selection.find(\".select2-selection__rendered\").attr(\"id\");\n var removeAll = this.options.get(\"translations\").get(\"removeAllItems\");\n var $remove = $2(\n ''\n );\n $remove.attr(\"title\", removeAll());\n $remove.attr(\"aria-label\", removeAll());\n $remove.attr(\"aria-describedby\", selectionId);\n Utils.StoreData($remove[0], \"data\", data);\n this.$selection.prepend($remove);\n this.$selection[0].classList.add(\"select2-selection--clearable\");\n };\n return AllowClear;\n });\n S22.define(\"select2/selection/search\", [\n \"jquery\",\n \"../utils\",\n \"../keys\"\n ], function($2, Utils, KEYS) {\n function Search(decorated, $element, options) {\n decorated.call(this, $element, options);\n }\n Search.prototype.render = function(decorated) {\n var searchLabel = this.options.get(\"translations\").get(\"search\");\n var $search = $2(\n ''\n );\n this.$searchContainer = $search;\n this.$search = $search.find(\"textarea\");\n this.$search.prop(\"autocomplete\", this.options.get(\"autocomplete\"));\n this.$search.attr(\"aria-label\", searchLabel());\n var $rendered = decorated.call(this);\n this._transferTabIndex();\n $rendered.append(this.$searchContainer);\n return $rendered;\n };\n Search.prototype.bind = function(decorated, container, $container) {\n var self = this;\n var resultsId = container.id + \"-results\";\n var selectionId = container.id + \"-container\";\n decorated.call(this, container, $container);\n self.$search.attr(\"aria-describedby\", selectionId);\n container.on(\"open\", function() {\n self.$search.attr(\"aria-controls\", resultsId);\n self.$search.trigger(\"focus\");\n });\n container.on(\"close\", function() {\n self.$search.val(\"\");\n self.resizeSearch();\n self.$search.removeAttr(\"aria-controls\");\n self.$search.removeAttr(\"aria-activedescendant\");\n self.$search.trigger(\"focus\");\n });\n container.on(\"enable\", function() {\n self.$search.prop(\"disabled\", false);\n self._transferTabIndex();\n });\n container.on(\"disable\", function() {\n self.$search.prop(\"disabled\", true);\n });\n container.on(\"focus\", function(evt) {\n self.$search.trigger(\"focus\");\n });\n container.on(\"results:focus\", function(params) {\n if (params.data._resultId) {\n self.$search.attr(\"aria-activedescendant\", params.data._resultId);\n } else {\n self.$search.removeAttr(\"aria-activedescendant\");\n }\n });\n this.$selection.on(\"focusin\", \".select2-search--inline\", function(evt) {\n self.trigger(\"focus\", evt);\n });\n this.$selection.on(\"focusout\", \".select2-search--inline\", function(evt) {\n self._handleBlur(evt);\n });\n this.$selection.on(\"keydown\", \".select2-search--inline\", function(evt) {\n evt.stopPropagation();\n self.trigger(\"keypress\", evt);\n self._keyUpPrevented = evt.isDefaultPrevented();\n var key = evt.which;\n if (key === KEYS.BACKSPACE && self.$search.val() === \"\") {\n var $previousChoice = self.$selection.find(\".select2-selection__choice\").last();\n if ($previousChoice.length > 0) {\n var item = Utils.GetData($previousChoice[0], \"data\");\n self.searchRemoveChoice(item);\n evt.preventDefault();\n }\n }\n });\n this.$selection.on(\"click\", \".select2-search--inline\", function(evt) {\n if (self.$search.val()) {\n evt.stopPropagation();\n }\n });\n var msie = document.documentMode;\n var disableInputEvents = msie && msie <= 11;\n this.$selection.on(\n \"input.searchcheck\",\n \".select2-search--inline\",\n function(evt) {\n if (disableInputEvents) {\n self.$selection.off(\"input.search input.searchcheck\");\n return;\n }\n self.$selection.off(\"keyup.search\");\n }\n );\n this.$selection.on(\n \"keyup.search input.search\",\n \".select2-search--inline\",\n function(evt) {\n if (disableInputEvents && evt.type === \"input\") {\n self.$selection.off(\"input.search input.searchcheck\");\n return;\n }\n var key = evt.which;\n if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {\n return;\n }\n if (key == KEYS.TAB) {\n return;\n }\n self.handleSearch(evt);\n }\n );\n };\n Search.prototype._transferTabIndex = function(decorated) {\n this.$search.attr(\"tabindex\", this.$selection.attr(\"tabindex\"));\n this.$selection.attr(\"tabindex\", \"-1\");\n };\n Search.prototype.createPlaceholder = function(decorated, placeholder) {\n this.$search.attr(\"placeholder\", placeholder.text);\n };\n Search.prototype.update = function(decorated, data) {\n var searchHadFocus = this.$search[0] == document.activeElement;\n this.$search.attr(\"placeholder\", \"\");\n decorated.call(this, data);\n this.resizeSearch();\n if (searchHadFocus) {\n this.$search.trigger(\"focus\");\n }\n };\n Search.prototype.handleSearch = function() {\n this.resizeSearch();\n if (!this._keyUpPrevented) {\n var input = this.$search.val();\n this.trigger(\"query\", {\n term: input\n });\n }\n this._keyUpPrevented = false;\n };\n Search.prototype.searchRemoveChoice = function(decorated, item) {\n this.trigger(\"unselect\", {\n data: item\n });\n this.$search.val(item.text);\n this.handleSearch();\n };\n Search.prototype.resizeSearch = function() {\n this.$search.css(\"width\", \"25px\");\n var width = \"100%\";\n if (this.$search.attr(\"placeholder\") === \"\") {\n var minimumWidth = this.$search.val().length + 1;\n width = minimumWidth * 0.75 + \"em\";\n }\n this.$search.css(\"width\", width);\n };\n return Search;\n });\n S22.define(\"select2/selection/selectionCss\", [\n \"../utils\"\n ], function(Utils) {\n function SelectionCSS() {\n }\n SelectionCSS.prototype.render = function(decorated) {\n var $selection = decorated.call(this);\n var selectionCssClass = this.options.get(\"selectionCssClass\") || \"\";\n if (selectionCssClass.indexOf(\":all:\") !== -1) {\n selectionCssClass = selectionCssClass.replace(\":all:\", \"\");\n Utils.copyNonInternalCssClasses($selection[0], this.$element[0]);\n }\n $selection.addClass(selectionCssClass);\n return $selection;\n };\n return SelectionCSS;\n });\n S22.define(\"select2/selection/eventRelay\", [\n \"jquery\"\n ], function($2) {\n function EventRelay() {\n }\n EventRelay.prototype.bind = function(decorated, container, $container) {\n var self = this;\n var relayEvents = [\n \"open\",\n \"opening\",\n \"close\",\n \"closing\",\n \"select\",\n \"selecting\",\n \"unselect\",\n \"unselecting\",\n \"clear\",\n \"clearing\"\n ];\n var preventableEvents = [\n \"opening\",\n \"closing\",\n \"selecting\",\n \"unselecting\",\n \"clearing\"\n ];\n decorated.call(this, container, $container);\n container.on(\"*\", function(name, params) {\n if (relayEvents.indexOf(name) === -1) {\n return;\n }\n params = params || {};\n var evt = $2.Event(\"select2:\" + name, {\n params\n });\n self.$element.trigger(evt);\n if (preventableEvents.indexOf(name) === -1) {\n return;\n }\n params.prevented = evt.isDefaultPrevented();\n });\n };\n return EventRelay;\n });\n S22.define(\"select2/translation\", [\n \"jquery\",\n \"require\"\n ], function($2, require2) {\n function Translation(dict) {\n this.dict = dict || {};\n }\n Translation.prototype.all = function() {\n return this.dict;\n };\n Translation.prototype.get = function(key) {\n return this.dict[key];\n };\n Translation.prototype.extend = function(translation) {\n this.dict = $2.extend({}, translation.all(), this.dict);\n };\n Translation._cache = {};\n Translation.loadPath = function(path) {\n if (!(path in Translation._cache)) {\n var translations = require2(path);\n Translation._cache[path] = translations;\n }\n return new Translation(Translation._cache[path]);\n };\n return Translation;\n });\n S22.define(\"select2/diacritics\", [], function() {\n var diacritics = {\n \"\\u24B6\": \"A\",\n \"\\uFF21\": \"A\",\n \"\\xC0\": \"A\",\n \"\\xC1\": \"A\",\n \"\\xC2\": \"A\",\n \"\\u1EA6\": \"A\",\n \"\\u1EA4\": \"A\",\n \"\\u1EAA\": \"A\",\n \"\\u1EA8\": \"A\",\n \"\\xC3\": \"A\",\n \"\\u0100\": \"A\",\n \"\\u0102\": \"A\",\n \"\\u1EB0\": \"A\",\n \"\\u1EAE\": \"A\",\n \"\\u1EB4\": \"A\",\n \"\\u1EB2\": \"A\",\n \"\\u0226\": \"A\",\n \"\\u01E0\": \"A\",\n \"\\xC4\": \"A\",\n \"\\u01DE\": \"A\",\n \"\\u1EA2\": \"A\",\n \"\\xC5\": \"A\",\n \"\\u01FA\": \"A\",\n \"\\u01CD\": \"A\",\n \"\\u0200\": \"A\",\n \"\\u0202\": \"A\",\n \"\\u1EA0\": \"A\",\n \"\\u1EAC\": \"A\",\n \"\\u1EB6\": \"A\",\n \"\\u1E00\": \"A\",\n \"\\u0104\": \"A\",\n \"\\u023A\": \"A\",\n \"\\u2C6F\": \"A\",\n \"\\uA732\": \"AA\",\n \"\\xC6\": \"AE\",\n \"\\u01FC\": \"AE\",\n \"\\u01E2\": \"AE\",\n \"\\uA734\": \"AO\",\n \"\\uA736\": \"AU\",\n \"\\uA738\": \"AV\",\n \"\\uA73A\": \"AV\",\n \"\\uA73C\": \"AY\",\n \"\\u24B7\": \"B\",\n \"\\uFF22\": \"B\",\n \"\\u1E02\": \"B\",\n \"\\u1E04\": \"B\",\n \"\\u1E06\": \"B\",\n \"\\u0243\": \"B\",\n \"\\u0182\": \"B\",\n \"\\u0181\": \"B\",\n \"\\u24B8\": \"C\",\n \"\\uFF23\": \"C\",\n \"\\u0106\": \"C\",\n \"\\u0108\": \"C\",\n \"\\u010A\": \"C\",\n \"\\u010C\": \"C\",\n \"\\xC7\": \"C\",\n \"\\u1E08\": \"C\",\n \"\\u0187\": \"C\",\n \"\\u023B\": \"C\",\n \"\\uA73E\": \"C\",\n \"\\u24B9\": \"D\",\n \"\\uFF24\": \"D\",\n \"\\u1E0A\": \"D\",\n \"\\u010E\": \"D\",\n \"\\u1E0C\": \"D\",\n \"\\u1E10\": \"D\",\n \"\\u1E12\": \"D\",\n \"\\u1E0E\": \"D\",\n \"\\u0110\": \"D\",\n \"\\u018B\": \"D\",\n \"\\u018A\": \"D\",\n \"\\u0189\": \"D\",\n \"\\uA779\": \"D\",\n \"\\u01F1\": \"DZ\",\n \"\\u01C4\": \"DZ\",\n \"\\u01F2\": \"Dz\",\n \"\\u01C5\": \"Dz\",\n \"\\u24BA\": \"E\",\n \"\\uFF25\": \"E\",\n \"\\xC8\": \"E\",\n \"\\xC9\": \"E\",\n \"\\xCA\": \"E\",\n \"\\u1EC0\": \"E\",\n \"\\u1EBE\": \"E\",\n \"\\u1EC4\": \"E\",\n \"\\u1EC2\": \"E\",\n \"\\u1EBC\": \"E\",\n \"\\u0112\": \"E\",\n \"\\u1E14\": \"E\",\n \"\\u1E16\": \"E\",\n \"\\u0114\": \"E\",\n \"\\u0116\": \"E\",\n \"\\xCB\": \"E\",\n \"\\u1EBA\": \"E\",\n \"\\u011A\": \"E\",\n \"\\u0204\": \"E\",\n \"\\u0206\": \"E\",\n \"\\u1EB8\": \"E\",\n \"\\u1EC6\": \"E\",\n \"\\u0228\": \"E\",\n \"\\u1E1C\": \"E\",\n \"\\u0118\": \"E\",\n \"\\u1E18\": \"E\",\n \"\\u1E1A\": \"E\",\n \"\\u0190\": \"E\",\n \"\\u018E\": \"E\",\n \"\\u24BB\": \"F\",\n \"\\uFF26\": \"F\",\n \"\\u1E1E\": \"F\",\n \"\\u0191\": \"F\",\n \"\\uA77B\": \"F\",\n \"\\u24BC\": \"G\",\n \"\\uFF27\": \"G\",\n \"\\u01F4\": \"G\",\n \"\\u011C\": \"G\",\n \"\\u1E20\": \"G\",\n \"\\u011E\": \"G\",\n \"\\u0120\": \"G\",\n \"\\u01E6\": \"G\",\n \"\\u0122\": \"G\",\n \"\\u01E4\": \"G\",\n \"\\u0193\": \"G\",\n \"\\uA7A0\": \"G\",\n \"\\uA77D\": \"G\",\n \"\\uA77E\": \"G\",\n \"\\u24BD\": \"H\",\n \"\\uFF28\": \"H\",\n \"\\u0124\": \"H\",\n \"\\u1E22\": \"H\",\n \"\\u1E26\": \"H\",\n \"\\u021E\": \"H\",\n \"\\u1E24\": \"H\",\n \"\\u1E28\": \"H\",\n \"\\u1E2A\": \"H\",\n \"\\u0126\": \"H\",\n \"\\u2C67\": \"H\",\n \"\\u2C75\": \"H\",\n \"\\uA78D\": \"H\",\n \"\\u24BE\": \"I\",\n \"\\uFF29\": \"I\",\n \"\\xCC\": \"I\",\n \"\\xCD\": \"I\",\n \"\\xCE\": \"I\",\n \"\\u0128\": \"I\",\n \"\\u012A\": \"I\",\n \"\\u012C\": \"I\",\n \"\\u0130\": \"I\",\n \"\\xCF\": \"I\",\n \"\\u1E2E\": \"I\",\n \"\\u1EC8\": \"I\",\n \"\\u01CF\": \"I\",\n \"\\u0208\": \"I\",\n \"\\u020A\": \"I\",\n \"\\u1ECA\": \"I\",\n \"\\u012E\": \"I\",\n \"\\u1E2C\": \"I\",\n \"\\u0197\": \"I\",\n \"\\u24BF\": \"J\",\n \"\\uFF2A\": \"J\",\n \"\\u0134\": \"J\",\n \"\\u0248\": \"J\",\n \"\\u24C0\": \"K\",\n \"\\uFF2B\": \"K\",\n \"\\u1E30\": \"K\",\n \"\\u01E8\": \"K\",\n \"\\u1E32\": \"K\",\n \"\\u0136\": \"K\",\n \"\\u1E34\": \"K\",\n \"\\u0198\": \"K\",\n \"\\u2C69\": \"K\",\n \"\\uA740\": \"K\",\n \"\\uA742\": \"K\",\n \"\\uA744\": \"K\",\n \"\\uA7A2\": \"K\",\n \"\\u24C1\": \"L\",\n \"\\uFF2C\": \"L\",\n \"\\u013F\": \"L\",\n \"\\u0139\": \"L\",\n \"\\u013D\": \"L\",\n \"\\u1E36\": \"L\",\n \"\\u1E38\": \"L\",\n \"\\u013B\": \"L\",\n \"\\u1E3C\": \"L\",\n \"\\u1E3A\": \"L\",\n \"\\u0141\": \"L\",\n \"\\u023D\": \"L\",\n \"\\u2C62\": \"L\",\n \"\\u2C60\": \"L\",\n \"\\uA748\": \"L\",\n \"\\uA746\": \"L\",\n \"\\uA780\": \"L\",\n \"\\u01C7\": \"LJ\",\n \"\\u01C8\": \"Lj\",\n \"\\u24C2\": \"M\",\n \"\\uFF2D\": \"M\",\n \"\\u1E3E\": \"M\",\n \"\\u1E40\": \"M\",\n \"\\u1E42\": \"M\",\n \"\\u2C6E\": \"M\",\n \"\\u019C\": \"M\",\n \"\\u24C3\": \"N\",\n \"\\uFF2E\": \"N\",\n \"\\u01F8\": \"N\",\n \"\\u0143\": \"N\",\n \"\\xD1\": \"N\",\n \"\\u1E44\": \"N\",\n \"\\u0147\": \"N\",\n \"\\u1E46\": \"N\",\n \"\\u0145\": \"N\",\n \"\\u1E4A\": \"N\",\n \"\\u1E48\": \"N\",\n \"\\u0220\": \"N\",\n \"\\u019D\": \"N\",\n \"\\uA790\": \"N\",\n \"\\uA7A4\": \"N\",\n \"\\u01CA\": \"NJ\",\n \"\\u01CB\": \"Nj\",\n \"\\u24C4\": \"O\",\n \"\\uFF2F\": \"O\",\n \"\\xD2\": \"O\",\n \"\\xD3\": \"O\",\n \"\\xD4\": \"O\",\n \"\\u1ED2\": \"O\",\n \"\\u1ED0\": \"O\",\n \"\\u1ED6\": \"O\",\n \"\\u1ED4\": \"O\",\n \"\\xD5\": \"O\",\n \"\\u1E4C\": \"O\",\n \"\\u022C\": \"O\",\n \"\\u1E4E\": \"O\",\n \"\\u014C\": \"O\",\n \"\\u1E50\": \"O\",\n \"\\u1E52\": \"O\",\n \"\\u014E\": \"O\",\n \"\\u022E\": \"O\",\n \"\\u0230\": \"O\",\n \"\\xD6\": \"O\",\n \"\\u022A\": \"O\",\n \"\\u1ECE\": \"O\",\n \"\\u0150\": \"O\",\n \"\\u01D1\": \"O\",\n \"\\u020C\": \"O\",\n \"\\u020E\": \"O\",\n \"\\u01A0\": \"O\",\n \"\\u1EDC\": \"O\",\n \"\\u1EDA\": \"O\",\n \"\\u1EE0\": \"O\",\n \"\\u1EDE\": \"O\",\n \"\\u1EE2\": \"O\",\n \"\\u1ECC\": \"O\",\n \"\\u1ED8\": \"O\",\n \"\\u01EA\": \"O\",\n \"\\u01EC\": \"O\",\n \"\\xD8\": \"O\",\n \"\\u01FE\": \"O\",\n \"\\u0186\": \"O\",\n \"\\u019F\": \"O\",\n \"\\uA74A\": \"O\",\n \"\\uA74C\": \"O\",\n \"\\u0152\": \"OE\",\n \"\\u01A2\": \"OI\",\n \"\\uA74E\": \"OO\",\n \"\\u0222\": \"OU\",\n \"\\u24C5\": \"P\",\n \"\\uFF30\": \"P\",\n \"\\u1E54\": \"P\",\n \"\\u1E56\": \"P\",\n \"\\u01A4\": \"P\",\n \"\\u2C63\": \"P\",\n \"\\uA750\": \"P\",\n \"\\uA752\": \"P\",\n \"\\uA754\": \"P\",\n \"\\u24C6\": \"Q\",\n \"\\uFF31\": \"Q\",\n \"\\uA756\": \"Q\",\n \"\\uA758\": \"Q\",\n \"\\u024A\": \"Q\",\n \"\\u24C7\": \"R\",\n \"\\uFF32\": \"R\",\n \"\\u0154\": \"R\",\n \"\\u1E58\": \"R\",\n \"\\u0158\": \"R\",\n \"\\u0210\": \"R\",\n \"\\u0212\": \"R\",\n \"\\u1E5A\": \"R\",\n \"\\u1E5C\": \"R\",\n \"\\u0156\": \"R\",\n \"\\u1E5E\": \"R\",\n \"\\u024C\": \"R\",\n \"\\u2C64\": \"R\",\n \"\\uA75A\": \"R\",\n \"\\uA7A6\": \"R\",\n \"\\uA782\": \"R\",\n \"\\u24C8\": \"S\",\n \"\\uFF33\": \"S\",\n \"\\u1E9E\": \"S\",\n \"\\u015A\": \"S\",\n \"\\u1E64\": \"S\",\n \"\\u015C\": \"S\",\n \"\\u1E60\": \"S\",\n \"\\u0160\": \"S\",\n \"\\u1E66\": \"S\",\n \"\\u1E62\": \"S\",\n \"\\u1E68\": \"S\",\n \"\\u0218\": \"S\",\n \"\\u015E\": \"S\",\n \"\\u2C7E\": \"S\",\n \"\\uA7A8\": \"S\",\n \"\\uA784\": \"S\",\n \"\\u24C9\": \"T\",\n \"\\uFF34\": \"T\",\n \"\\u1E6A\": \"T\",\n \"\\u0164\": \"T\",\n \"\\u1E6C\": \"T\",\n \"\\u021A\": \"T\",\n \"\\u0162\": \"T\",\n \"\\u1E70\": \"T\",\n \"\\u1E6E\": \"T\",\n \"\\u0166\": \"T\",\n \"\\u01AC\": \"T\",\n \"\\u01AE\": \"T\",\n \"\\u023E\": \"T\",\n \"\\uA786\": \"T\",\n \"\\uA728\": \"TZ\",\n \"\\u24CA\": \"U\",\n \"\\uFF35\": \"U\",\n \"\\xD9\": \"U\",\n \"\\xDA\": \"U\",\n \"\\xDB\": \"U\",\n \"\\u0168\": \"U\",\n \"\\u1E78\": \"U\",\n \"\\u016A\": \"U\",\n \"\\u1E7A\": \"U\",\n \"\\u016C\": \"U\",\n \"\\xDC\": \"U\",\n \"\\u01DB\": \"U\",\n \"\\u01D7\": \"U\",\n \"\\u01D5\": \"U\",\n \"\\u01D9\": \"U\",\n \"\\u1EE6\": \"U\",\n \"\\u016E\": \"U\",\n \"\\u0170\": \"U\",\n \"\\u01D3\": \"U\",\n \"\\u0214\": \"U\",\n \"\\u0216\": \"U\",\n \"\\u01AF\": \"U\",\n \"\\u1EEA\": \"U\",\n \"\\u1EE8\": \"U\",\n \"\\u1EEE\": \"U\",\n \"\\u1EEC\": \"U\",\n \"\\u1EF0\": \"U\",\n \"\\u1EE4\": \"U\",\n \"\\u1E72\": \"U\",\n \"\\u0172\": \"U\",\n \"\\u1E76\": \"U\",\n \"\\u1E74\": \"U\",\n \"\\u0244\": \"U\",\n \"\\u24CB\": \"V\",\n \"\\uFF36\": \"V\",\n \"\\u1E7C\": \"V\",\n \"\\u1E7E\": \"V\",\n \"\\u01B2\": \"V\",\n \"\\uA75E\": \"V\",\n \"\\u0245\": \"V\",\n \"\\uA760\": \"VY\",\n \"\\u24CC\": \"W\",\n \"\\uFF37\": \"W\",\n \"\\u1E80\": \"W\",\n \"\\u1E82\": \"W\",\n \"\\u0174\": \"W\",\n \"\\u1E86\": \"W\",\n \"\\u1E84\": \"W\",\n \"\\u1E88\": \"W\",\n \"\\u2C72\": \"W\",\n \"\\u24CD\": \"X\",\n \"\\uFF38\": \"X\",\n \"\\u1E8A\": \"X\",\n \"\\u1E8C\": \"X\",\n \"\\u24CE\": \"Y\",\n \"\\uFF39\": \"Y\",\n \"\\u1EF2\": \"Y\",\n \"\\xDD\": \"Y\",\n \"\\u0176\": \"Y\",\n \"\\u1EF8\": \"Y\",\n \"\\u0232\": \"Y\",\n \"\\u1E8E\": \"Y\",\n \"\\u0178\": \"Y\",\n \"\\u1EF6\": \"Y\",\n \"\\u1EF4\": \"Y\",\n \"\\u01B3\": \"Y\",\n \"\\u024E\": \"Y\",\n \"\\u1EFE\": \"Y\",\n \"\\u24CF\": \"Z\",\n \"\\uFF3A\": \"Z\",\n \"\\u0179\": \"Z\",\n \"\\u1E90\": \"Z\",\n \"\\u017B\": \"Z\",\n \"\\u017D\": \"Z\",\n \"\\u1E92\": \"Z\",\n \"\\u1E94\": \"Z\",\n \"\\u01B5\": \"Z\",\n \"\\u0224\": \"Z\",\n \"\\u2C7F\": \"Z\",\n \"\\u2C6B\": \"Z\",\n \"\\uA762\": \"Z\",\n \"\\u24D0\": \"a\",\n \"\\uFF41\": \"a\",\n \"\\u1E9A\": \"a\",\n \"\\xE0\": \"a\",\n \"\\xE1\": \"a\",\n \"\\xE2\": \"a\",\n \"\\u1EA7\": \"a\",\n \"\\u1EA5\": \"a\",\n \"\\u1EAB\": \"a\",\n \"\\u1EA9\": \"a\",\n \"\\xE3\": \"a\",\n \"\\u0101\": \"a\",\n \"\\u0103\": \"a\",\n \"\\u1EB1\": \"a\",\n \"\\u1EAF\": \"a\",\n \"\\u1EB5\": \"a\",\n \"\\u1EB3\": \"a\",\n \"\\u0227\": \"a\",\n \"\\u01E1\": \"a\",\n \"\\xE4\": \"a\",\n \"\\u01DF\": \"a\",\n \"\\u1EA3\": \"a\",\n \"\\xE5\": \"a\",\n \"\\u01FB\": \"a\",\n \"\\u01CE\": \"a\",\n \"\\u0201\": \"a\",\n \"\\u0203\": \"a\",\n \"\\u1EA1\": \"a\",\n \"\\u1EAD\": \"a\",\n \"\\u1EB7\": \"a\",\n \"\\u1E01\": \"a\",\n \"\\u0105\": \"a\",\n \"\\u2C65\": \"a\",\n \"\\u0250\": \"a\",\n \"\\uA733\": \"aa\",\n \"\\xE6\": \"ae\",\n \"\\u01FD\": \"ae\",\n \"\\u01E3\": \"ae\",\n \"\\uA735\": \"ao\",\n \"\\uA737\": \"au\",\n \"\\uA739\": \"av\",\n \"\\uA73B\": \"av\",\n \"\\uA73D\": \"ay\",\n \"\\u24D1\": \"b\",\n \"\\uFF42\": \"b\",\n \"\\u1E03\": \"b\",\n \"\\u1E05\": \"b\",\n \"\\u1E07\": \"b\",\n \"\\u0180\": \"b\",\n \"\\u0183\": \"b\",\n \"\\u0253\": \"b\",\n \"\\u24D2\": \"c\",\n \"\\uFF43\": \"c\",\n \"\\u0107\": \"c\",\n \"\\u0109\": \"c\",\n \"\\u010B\": \"c\",\n \"\\u010D\": \"c\",\n \"\\xE7\": \"c\",\n \"\\u1E09\": \"c\",\n \"\\u0188\": \"c\",\n \"\\u023C\": \"c\",\n \"\\uA73F\": \"c\",\n \"\\u2184\": \"c\",\n \"\\u24D3\": \"d\",\n \"\\uFF44\": \"d\",\n \"\\u1E0B\": \"d\",\n \"\\u010F\": \"d\",\n \"\\u1E0D\": \"d\",\n \"\\u1E11\": \"d\",\n \"\\u1E13\": \"d\",\n \"\\u1E0F\": \"d\",\n \"\\u0111\": \"d\",\n \"\\u018C\": \"d\",\n \"\\u0256\": \"d\",\n \"\\u0257\": \"d\",\n \"\\uA77A\": \"d\",\n \"\\u01F3\": \"dz\",\n \"\\u01C6\": \"dz\",\n \"\\u24D4\": \"e\",\n \"\\uFF45\": \"e\",\n \"\\xE8\": \"e\",\n \"\\xE9\": \"e\",\n \"\\xEA\": \"e\",\n \"\\u1EC1\": \"e\",\n \"\\u1EBF\": \"e\",\n \"\\u1EC5\": \"e\",\n \"\\u1EC3\": \"e\",\n \"\\u1EBD\": \"e\",\n \"\\u0113\": \"e\",\n \"\\u1E15\": \"e\",\n \"\\u1E17\": \"e\",\n \"\\u0115\": \"e\",\n \"\\u0117\": \"e\",\n \"\\xEB\": \"e\",\n \"\\u1EBB\": \"e\",\n \"\\u011B\": \"e\",\n \"\\u0205\": \"e\",\n \"\\u0207\": \"e\",\n \"\\u1EB9\": \"e\",\n \"\\u1EC7\": \"e\",\n \"\\u0229\": \"e\",\n \"\\u1E1D\": \"e\",\n \"\\u0119\": \"e\",\n \"\\u1E19\": \"e\",\n \"\\u1E1B\": \"e\",\n \"\\u0247\": \"e\",\n \"\\u025B\": \"e\",\n \"\\u01DD\": \"e\",\n \"\\u24D5\": \"f\",\n \"\\uFF46\": \"f\",\n \"\\u1E1F\": \"f\",\n \"\\u0192\": \"f\",\n \"\\uA77C\": \"f\",\n \"\\u24D6\": \"g\",\n \"\\uFF47\": \"g\",\n \"\\u01F5\": \"g\",\n \"\\u011D\": \"g\",\n \"\\u1E21\": \"g\",\n \"\\u011F\": \"g\",\n \"\\u0121\": \"g\",\n \"\\u01E7\": \"g\",\n \"\\u0123\": \"g\",\n \"\\u01E5\": \"g\",\n \"\\u0260\": \"g\",\n \"\\uA7A1\": \"g\",\n \"\\u1D79\": \"g\",\n \"\\uA77F\": \"g\",\n \"\\u24D7\": \"h\",\n \"\\uFF48\": \"h\",\n \"\\u0125\": \"h\",\n \"\\u1E23\": \"h\",\n \"\\u1E27\": \"h\",\n \"\\u021F\": \"h\",\n \"\\u1E25\": \"h\",\n \"\\u1E29\": \"h\",\n \"\\u1E2B\": \"h\",\n \"\\u1E96\": \"h\",\n \"\\u0127\": \"h\",\n \"\\u2C68\": \"h\",\n \"\\u2C76\": \"h\",\n \"\\u0265\": \"h\",\n \"\\u0195\": \"hv\",\n \"\\u24D8\": \"i\",\n \"\\uFF49\": \"i\",\n \"\\xEC\": \"i\",\n \"\\xED\": \"i\",\n \"\\xEE\": \"i\",\n \"\\u0129\": \"i\",\n \"\\u012B\": \"i\",\n \"\\u012D\": \"i\",\n \"\\xEF\": \"i\",\n \"\\u1E2F\": \"i\",\n \"\\u1EC9\": \"i\",\n \"\\u01D0\": \"i\",\n \"\\u0209\": \"i\",\n \"\\u020B\": \"i\",\n \"\\u1ECB\": \"i\",\n \"\\u012F\": \"i\",\n \"\\u1E2D\": \"i\",\n \"\\u0268\": \"i\",\n \"\\u0131\": \"i\",\n \"\\u24D9\": \"j\",\n \"\\uFF4A\": \"j\",\n \"\\u0135\": \"j\",\n \"\\u01F0\": \"j\",\n \"\\u0249\": \"j\",\n \"\\u24DA\": \"k\",\n \"\\uFF4B\": \"k\",\n \"\\u1E31\": \"k\",\n \"\\u01E9\": \"k\",\n \"\\u1E33\": \"k\",\n \"\\u0137\": \"k\",\n \"\\u1E35\": \"k\",\n \"\\u0199\": \"k\",\n \"\\u2C6A\": \"k\",\n \"\\uA741\": \"k\",\n \"\\uA743\": \"k\",\n \"\\uA745\": \"k\",\n \"\\uA7A3\": \"k\",\n \"\\u24DB\": \"l\",\n \"\\uFF4C\": \"l\",\n \"\\u0140\": \"l\",\n \"\\u013A\": \"l\",\n \"\\u013E\": \"l\",\n \"\\u1E37\": \"l\",\n \"\\u1E39\": \"l\",\n \"\\u013C\": \"l\",\n \"\\u1E3D\": \"l\",\n \"\\u1E3B\": \"l\",\n \"\\u017F\": \"l\",\n \"\\u0142\": \"l\",\n \"\\u019A\": \"l\",\n \"\\u026B\": \"l\",\n \"\\u2C61\": \"l\",\n \"\\uA749\": \"l\",\n \"\\uA781\": \"l\",\n \"\\uA747\": \"l\",\n \"\\u01C9\": \"lj\",\n \"\\u24DC\": \"m\",\n \"\\uFF4D\": \"m\",\n \"\\u1E3F\": \"m\",\n \"\\u1E41\": \"m\",\n \"\\u1E43\": \"m\",\n \"\\u0271\": \"m\",\n \"\\u026F\": \"m\",\n \"\\u24DD\": \"n\",\n \"\\uFF4E\": \"n\",\n \"\\u01F9\": \"n\",\n \"\\u0144\": \"n\",\n \"\\xF1\": \"n\",\n \"\\u1E45\": \"n\",\n \"\\u0148\": \"n\",\n \"\\u1E47\": \"n\",\n \"\\u0146\": \"n\",\n \"\\u1E4B\": \"n\",\n \"\\u1E49\": \"n\",\n \"\\u019E\": \"n\",\n \"\\u0272\": \"n\",\n \"\\u0149\": \"n\",\n \"\\uA791\": \"n\",\n \"\\uA7A5\": \"n\",\n \"\\u01CC\": \"nj\",\n \"\\u24DE\": \"o\",\n \"\\uFF4F\": \"o\",\n \"\\xF2\": \"o\",\n \"\\xF3\": \"o\",\n \"\\xF4\": \"o\",\n \"\\u1ED3\": \"o\",\n \"\\u1ED1\": \"o\",\n \"\\u1ED7\": \"o\",\n \"\\u1ED5\": \"o\",\n \"\\xF5\": \"o\",\n \"\\u1E4D\": \"o\",\n \"\\u022D\": \"o\",\n \"\\u1E4F\": \"o\",\n \"\\u014D\": \"o\",\n \"\\u1E51\": \"o\",\n \"\\u1E53\": \"o\",\n \"\\u014F\": \"o\",\n \"\\u022F\": \"o\",\n \"\\u0231\": \"o\",\n \"\\xF6\": \"o\",\n \"\\u022B\": \"o\",\n \"\\u1ECF\": \"o\",\n \"\\u0151\": \"o\",\n \"\\u01D2\": \"o\",\n \"\\u020D\": \"o\",\n \"\\u020F\": \"o\",\n \"\\u01A1\": \"o\",\n \"\\u1EDD\": \"o\",\n \"\\u1EDB\": \"o\",\n \"\\u1EE1\": \"o\",\n \"\\u1EDF\": \"o\",\n \"\\u1EE3\": \"o\",\n \"\\u1ECD\": \"o\",\n \"\\u1ED9\": \"o\",\n \"\\u01EB\": \"o\",\n \"\\u01ED\": \"o\",\n \"\\xF8\": \"o\",\n \"\\u01FF\": \"o\",\n \"\\u0254\": \"o\",\n \"\\uA74B\": \"o\",\n \"\\uA74D\": \"o\",\n \"\\u0275\": \"o\",\n \"\\u0153\": \"oe\",\n \"\\u01A3\": \"oi\",\n \"\\u0223\": \"ou\",\n \"\\uA74F\": \"oo\",\n \"\\u24DF\": \"p\",\n \"\\uFF50\": \"p\",\n \"\\u1E55\": \"p\",\n \"\\u1E57\": \"p\",\n \"\\u01A5\": \"p\",\n \"\\u1D7D\": \"p\",\n \"\\uA751\": \"p\",\n \"\\uA753\": \"p\",\n \"\\uA755\": \"p\",\n \"\\u24E0\": \"q\",\n \"\\uFF51\": \"q\",\n \"\\u024B\": \"q\",\n \"\\uA757\": \"q\",\n \"\\uA759\": \"q\",\n \"\\u24E1\": \"r\",\n \"\\uFF52\": \"r\",\n \"\\u0155\": \"r\",\n \"\\u1E59\": \"r\",\n \"\\u0159\": \"r\",\n \"\\u0211\": \"r\",\n \"\\u0213\": \"r\",\n \"\\u1E5B\": \"r\",\n \"\\u1E5D\": \"r\",\n \"\\u0157\": \"r\",\n \"\\u1E5F\": \"r\",\n \"\\u024D\": \"r\",\n \"\\u027D\": \"r\",\n \"\\uA75B\": \"r\",\n \"\\uA7A7\": \"r\",\n \"\\uA783\": \"r\",\n \"\\u24E2\": \"s\",\n \"\\uFF53\": \"s\",\n \"\\xDF\": \"s\",\n \"\\u015B\": \"s\",\n \"\\u1E65\": \"s\",\n \"\\u015D\": \"s\",\n \"\\u1E61\": \"s\",\n \"\\u0161\": \"s\",\n \"\\u1E67\": \"s\",\n \"\\u1E63\": \"s\",\n \"\\u1E69\": \"s\",\n \"\\u0219\": \"s\",\n \"\\u015F\": \"s\",\n \"\\u023F\": \"s\",\n \"\\uA7A9\": \"s\",\n \"\\uA785\": \"s\",\n \"\\u1E9B\": \"s\",\n \"\\u24E3\": \"t\",\n \"\\uFF54\": \"t\",\n \"\\u1E6B\": \"t\",\n \"\\u1E97\": \"t\",\n \"\\u0165\": \"t\",\n \"\\u1E6D\": \"t\",\n \"\\u021B\": \"t\",\n \"\\u0163\": \"t\",\n \"\\u1E71\": \"t\",\n \"\\u1E6F\": \"t\",\n \"\\u0167\": \"t\",\n \"\\u01AD\": \"t\",\n \"\\u0288\": \"t\",\n \"\\u2C66\": \"t\",\n \"\\uA787\": \"t\",\n \"\\uA729\": \"tz\",\n \"\\u24E4\": \"u\",\n \"\\uFF55\": \"u\",\n \"\\xF9\": \"u\",\n \"\\xFA\": \"u\",\n \"\\xFB\": \"u\",\n \"\\u0169\": \"u\",\n \"\\u1E79\": \"u\",\n \"\\u016B\": \"u\",\n \"\\u1E7B\": \"u\",\n \"\\u016D\": \"u\",\n \"\\xFC\": \"u\",\n \"\\u01DC\": \"u\",\n \"\\u01D8\": \"u\",\n \"\\u01D6\": \"u\",\n \"\\u01DA\": \"u\",\n \"\\u1EE7\": \"u\",\n \"\\u016F\": \"u\",\n \"\\u0171\": \"u\",\n \"\\u01D4\": \"u\",\n \"\\u0215\": \"u\",\n \"\\u0217\": \"u\",\n \"\\u01B0\": \"u\",\n \"\\u1EEB\": \"u\",\n \"\\u1EE9\": \"u\",\n \"\\u1EEF\": \"u\",\n \"\\u1EED\": \"u\",\n \"\\u1EF1\": \"u\",\n \"\\u1EE5\": \"u\",\n \"\\u1E73\": \"u\",\n \"\\u0173\": \"u\",\n \"\\u1E77\": \"u\",\n \"\\u1E75\": \"u\",\n \"\\u0289\": \"u\",\n \"\\u24E5\": \"v\",\n \"\\uFF56\": \"v\",\n \"\\u1E7D\": \"v\",\n \"\\u1E7F\": \"v\",\n \"\\u028B\": \"v\",\n \"\\uA75F\": \"v\",\n \"\\u028C\": \"v\",\n \"\\uA761\": \"vy\",\n \"\\u24E6\": \"w\",\n \"\\uFF57\": \"w\",\n \"\\u1E81\": \"w\",\n \"\\u1E83\": \"w\",\n \"\\u0175\": \"w\",\n \"\\u1E87\": \"w\",\n \"\\u1E85\": \"w\",\n \"\\u1E98\": \"w\",\n \"\\u1E89\": \"w\",\n \"\\u2C73\": \"w\",\n \"\\u24E7\": \"x\",\n \"\\uFF58\": \"x\",\n \"\\u1E8B\": \"x\",\n \"\\u1E8D\": \"x\",\n \"\\u24E8\": \"y\",\n \"\\uFF59\": \"y\",\n \"\\u1EF3\": \"y\",\n \"\\xFD\": \"y\",\n \"\\u0177\": \"y\",\n \"\\u1EF9\": \"y\",\n \"\\u0233\": \"y\",\n \"\\u1E8F\": \"y\",\n \"\\xFF\": \"y\",\n \"\\u1EF7\": \"y\",\n \"\\u1E99\": \"y\",\n \"\\u1EF5\": \"y\",\n \"\\u01B4\": \"y\",\n \"\\u024F\": \"y\",\n \"\\u1EFF\": \"y\",\n \"\\u24E9\": \"z\",\n \"\\uFF5A\": \"z\",\n \"\\u017A\": \"z\",\n \"\\u1E91\": \"z\",\n \"\\u017C\": \"z\",\n \"\\u017E\": \"z\",\n \"\\u1E93\": \"z\",\n \"\\u1E95\": \"z\",\n \"\\u01B6\": \"z\",\n \"\\u0225\": \"z\",\n \"\\u0240\": \"z\",\n \"\\u2C6C\": \"z\",\n \"\\uA763\": \"z\",\n \"\\u0386\": \"\\u0391\",\n \"\\u0388\": \"\\u0395\",\n \"\\u0389\": \"\\u0397\",\n \"\\u038A\": \"\\u0399\",\n \"\\u03AA\": \"\\u0399\",\n \"\\u038C\": \"\\u039F\",\n \"\\u038E\": \"\\u03A5\",\n \"\\u03AB\": \"\\u03A5\",\n \"\\u038F\": \"\\u03A9\",\n \"\\u03AC\": \"\\u03B1\",\n \"\\u03AD\": \"\\u03B5\",\n \"\\u03AE\": \"\\u03B7\",\n \"\\u03AF\": \"\\u03B9\",\n \"\\u03CA\": \"\\u03B9\",\n \"\\u0390\": \"\\u03B9\",\n \"\\u03CC\": \"\\u03BF\",\n \"\\u03CD\": \"\\u03C5\",\n \"\\u03CB\": \"\\u03C5\",\n \"\\u03B0\": \"\\u03C5\",\n \"\\u03CE\": \"\\u03C9\",\n \"\\u03C2\": \"\\u03C3\",\n \"\\u2019\": \"'\"\n };\n return diacritics;\n });\n S22.define(\"select2/data/base\", [\n \"../utils\"\n ], function(Utils) {\n function BaseAdapter($element, options) {\n BaseAdapter.__super__.constructor.call(this);\n }\n Utils.Extend(BaseAdapter, Utils.Observable);\n BaseAdapter.prototype.current = function(callback) {\n throw new Error(\"The `current` method must be defined in child classes.\");\n };\n BaseAdapter.prototype.query = function(params, callback) {\n throw new Error(\"The `query` method must be defined in child classes.\");\n };\n BaseAdapter.prototype.bind = function(container, $container) {\n };\n BaseAdapter.prototype.destroy = function() {\n };\n BaseAdapter.prototype.generateResultId = function(container, data) {\n var id = container.id + \"-result-\";\n id += Utils.generateChars(4);\n if (data.id != null) {\n id += \"-\" + data.id.toString();\n } else {\n id += \"-\" + Utils.generateChars(4);\n }\n return id;\n };\n return BaseAdapter;\n });\n S22.define(\"select2/data/select\", [\n \"./base\",\n \"../utils\",\n \"jquery\"\n ], function(BaseAdapter, Utils, $2) {\n function SelectAdapter($element, options) {\n this.$element = $element;\n this.options = options;\n SelectAdapter.__super__.constructor.call(this);\n }\n Utils.Extend(SelectAdapter, BaseAdapter);\n SelectAdapter.prototype.current = function(callback) {\n var self = this;\n var data = Array.prototype.map.call(\n this.$element[0].querySelectorAll(\":checked\"),\n function(selectedElement) {\n return self.item($2(selectedElement));\n }\n );\n callback(data);\n };\n SelectAdapter.prototype.select = function(data) {\n var self = this;\n data.selected = true;\n if (data.element != null && data.element.tagName.toLowerCase() === \"option\") {\n data.element.selected = true;\n this.$element.trigger(\"input\").trigger(\"change\");\n return;\n }\n if (this.$element.prop(\"multiple\")) {\n this.current(function(currentData) {\n var val2 = [];\n data = [data];\n data.push.apply(data, currentData);\n for (var d = 0; d < data.length; d++) {\n var id = data[d].id;\n if (val2.indexOf(id) === -1) {\n val2.push(id);\n }\n }\n self.$element.val(val2);\n self.$element.trigger(\"input\").trigger(\"change\");\n });\n } else {\n var val = data.id;\n this.$element.val(val);\n this.$element.trigger(\"input\").trigger(\"change\");\n }\n };\n SelectAdapter.prototype.unselect = function(data) {\n var self = this;\n if (!this.$element.prop(\"multiple\")) {\n return;\n }\n data.selected = false;\n if (data.element != null && data.element.tagName.toLowerCase() === \"option\") {\n data.element.selected = false;\n this.$element.trigger(\"input\").trigger(\"change\");\n return;\n }\n this.current(function(currentData) {\n var val = [];\n for (var d = 0; d < currentData.length; d++) {\n var id = currentData[d].id;\n if (id !== data.id && val.indexOf(id) === -1) {\n val.push(id);\n }\n }\n self.$element.val(val);\n self.$element.trigger(\"input\").trigger(\"change\");\n });\n };\n SelectAdapter.prototype.bind = function(container, $container) {\n var self = this;\n this.container = container;\n container.on(\"select\", function(params) {\n self.select(params.data);\n });\n container.on(\"unselect\", function(params) {\n self.unselect(params.data);\n });\n };\n SelectAdapter.prototype.destroy = function() {\n this.$element.find(\"*\").each(function() {\n Utils.RemoveData(this);\n });\n };\n SelectAdapter.prototype.query = function(params, callback) {\n var data = [];\n var self = this;\n var $options = this.$element.children();\n $options.each(function() {\n if (this.tagName.toLowerCase() !== \"option\" && this.tagName.toLowerCase() !== \"optgroup\") {\n return;\n }\n var $option = $2(this);\n var option = self.item($option);\n var matches = self.matches(params, option);\n if (matches !== null) {\n data.push(matches);\n }\n });\n callback({\n results: data\n });\n };\n SelectAdapter.prototype.addOptions = function($options) {\n this.$element.append($options);\n };\n SelectAdapter.prototype.option = function(data) {\n var option;\n if (data.children) {\n option = document.createElement(\"optgroup\");\n option.label = data.text;\n } else {\n option = document.createElement(\"option\");\n if (option.textContent !== void 0) {\n option.textContent = data.text;\n } else {\n option.innerText = data.text;\n }\n }\n if (data.id !== void 0) {\n option.value = data.id;\n }\n if (data.disabled) {\n option.disabled = true;\n }\n if (data.selected) {\n option.selected = true;\n }\n if (data.title) {\n option.title = data.title;\n }\n var normalizedData = this._normalizeItem(data);\n normalizedData.element = option;\n Utils.StoreData(option, \"data\", normalizedData);\n return $2(option);\n };\n SelectAdapter.prototype.item = function($option) {\n var data = {};\n data = Utils.GetData($option[0], \"data\");\n if (data != null) {\n return data;\n }\n var option = $option[0];\n if (option.tagName.toLowerCase() === \"option\") {\n data = {\n id: $option.val(),\n text: $option.text(),\n disabled: $option.prop(\"disabled\"),\n selected: $option.prop(\"selected\"),\n title: $option.prop(\"title\")\n };\n } else if (option.tagName.toLowerCase() === \"optgroup\") {\n data = {\n text: $option.prop(\"label\"),\n children: [],\n title: $option.prop(\"title\")\n };\n var $children = $option.children(\"option\");\n var children = [];\n for (var c = 0; c < $children.length; c++) {\n var $child = $2($children[c]);\n var child = this.item($child);\n children.push(child);\n }\n data.children = children;\n }\n data = this._normalizeItem(data);\n data.element = $option[0];\n Utils.StoreData($option[0], \"data\", data);\n return data;\n };\n SelectAdapter.prototype._normalizeItem = function(item) {\n if (item !== Object(item)) {\n item = {\n id: item,\n text: item\n };\n }\n item = $2.extend({}, {\n text: \"\"\n }, item);\n var defaults = {\n selected: false,\n disabled: false\n };\n if (item.id != null) {\n item.id = item.id.toString();\n }\n if (item.text != null) {\n item.text = item.text.toString();\n }\n if (item._resultId == null && item.id && this.container != null) {\n item._resultId = this.generateResultId(this.container, item);\n }\n return $2.extend({}, defaults, item);\n };\n SelectAdapter.prototype.matches = function(params, data) {\n var matcher = this.options.get(\"matcher\");\n return matcher(params, data);\n };\n return SelectAdapter;\n });\n S22.define(\"select2/data/array\", [\n \"./select\",\n \"../utils\",\n \"jquery\"\n ], function(SelectAdapter, Utils, $2) {\n function ArrayAdapter($element, options) {\n this._dataToConvert = options.get(\"data\") || [];\n ArrayAdapter.__super__.constructor.call(this, $element, options);\n }\n Utils.Extend(ArrayAdapter, SelectAdapter);\n ArrayAdapter.prototype.bind = function(container, $container) {\n ArrayAdapter.__super__.bind.call(this, container, $container);\n this.addOptions(this.convertToOptions(this._dataToConvert));\n };\n ArrayAdapter.prototype.select = function(data) {\n var $option = this.$element.find(\"option\").filter(function(i, elm) {\n return elm.value == data.id.toString();\n });\n if ($option.length === 0) {\n $option = this.option(data);\n this.addOptions($option);\n }\n ArrayAdapter.__super__.select.call(this, data);\n };\n ArrayAdapter.prototype.convertToOptions = function(data) {\n var self = this;\n var $existing = this.$element.find(\"option\");\n var existingIds = $existing.map(function() {\n return self.item($2(this)).id;\n }).get();\n var $options = [];\n function onlyItem(item2) {\n return function() {\n return $2(this).val() == item2.id;\n };\n }\n for (var d = 0; d < data.length; d++) {\n var item = this._normalizeItem(data[d]);\n if (existingIds.indexOf(item.id) >= 0) {\n var $existingOption = $existing.filter(onlyItem(item));\n var existingData = this.item($existingOption);\n var newData = $2.extend(true, {}, item, existingData);\n var $newOption = this.option(newData);\n $existingOption.replaceWith($newOption);\n continue;\n }\n var $option = this.option(item);\n if (item.children) {\n var $children = this.convertToOptions(item.children);\n $option.append($children);\n }\n $options.push($option);\n }\n return $options;\n };\n return ArrayAdapter;\n });\n S22.define(\"select2/data/ajax\", [\n \"./array\",\n \"../utils\",\n \"jquery\"\n ], function(ArrayAdapter, Utils, $2) {\n function AjaxAdapter($element, options) {\n this.ajaxOptions = this._applyDefaults(options.get(\"ajax\"));\n if (this.ajaxOptions.processResults != null) {\n this.processResults = this.ajaxOptions.processResults;\n }\n AjaxAdapter.__super__.constructor.call(this, $element, options);\n }\n Utils.Extend(AjaxAdapter, ArrayAdapter);\n AjaxAdapter.prototype._applyDefaults = function(options) {\n var defaults = {\n data: function(params) {\n return $2.extend({}, params, {\n q: params.term\n });\n },\n transport: function(params, success, failure) {\n var $request = $2.ajax(params);\n $request.then(success);\n $request.fail(failure);\n return $request;\n }\n };\n return $2.extend({}, defaults, options, true);\n };\n AjaxAdapter.prototype.processResults = function(results) {\n return results;\n };\n AjaxAdapter.prototype.query = function(params, callback) {\n var matches = [];\n var self = this;\n if (this._request != null) {\n if (typeof this._request.abort === \"function\") {\n this._request.abort();\n }\n this._request = null;\n }\n var options = $2.extend({\n type: \"GET\"\n }, this.ajaxOptions);\n if (typeof options.url === \"function\") {\n options.url = options.url.call(this.$element, params);\n }\n if (typeof options.data === \"function\") {\n options.data = options.data.call(this.$element, params);\n }\n function request() {\n var $request = options.transport(options, function(data) {\n var results = self.processResults(data, params);\n if (self.options.get(\"debug\") && window.console && console.error) {\n if (!results || !results.results || !Array.isArray(results.results)) {\n console.error(\n \"Select2: The AJAX results did not return an array in the `results` key of the response.\"\n );\n }\n }\n callback(results);\n }, function() {\n if (\"status\" in $request && ($request.status === 0 || $request.status === \"0\")) {\n return;\n }\n self.trigger(\"results:message\", {\n message: \"errorLoading\"\n });\n });\n self._request = $request;\n }\n if (this.ajaxOptions.delay && params.term != null) {\n if (this._queryTimeout) {\n window.clearTimeout(this._queryTimeout);\n }\n this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n } else {\n request();\n }\n };\n return AjaxAdapter;\n });\n S22.define(\"select2/data/tags\", [\n \"jquery\"\n ], function($2) {\n function Tags(decorated, $element, options) {\n var tags = options.get(\"tags\");\n var createTag = options.get(\"createTag\");\n if (createTag !== void 0) {\n this.createTag = createTag;\n }\n var insertTag = options.get(\"insertTag\");\n if (insertTag !== void 0) {\n this.insertTag = insertTag;\n }\n decorated.call(this, $element, options);\n if (Array.isArray(tags)) {\n for (var t = 0; t < tags.length; t++) {\n var tag = tags[t];\n var item = this._normalizeItem(tag);\n var $option = this.option(item);\n this.$element.append($option);\n }\n }\n }\n Tags.prototype.query = function(decorated, params, callback) {\n var self = this;\n this._removeOldTags();\n if (params.term == null || params.page != null) {\n decorated.call(this, params, callback);\n return;\n }\n function wrapper(obj, child) {\n var data = obj.results;\n for (var i = 0; i < data.length; i++) {\n var option = data[i];\n var checkChildren = option.children != null && !wrapper({\n results: option.children\n }, true);\n var optionText = (option.text || \"\").toUpperCase();\n var paramsTerm = (params.term || \"\").toUpperCase();\n var checkText = optionText === paramsTerm;\n if (checkText || checkChildren) {\n if (child) {\n return false;\n }\n obj.data = data;\n callback(obj);\n return;\n }\n }\n if (child) {\n return true;\n }\n var tag = self.createTag(params);\n if (tag != null) {\n var $option = self.option(tag);\n $option.attr(\"data-select2-tag\", \"true\");\n self.addOptions([$option]);\n self.insertTag(data, tag);\n }\n obj.results = data;\n callback(obj);\n }\n decorated.call(this, params, wrapper);\n };\n Tags.prototype.createTag = function(decorated, params) {\n if (params.term == null) {\n return null;\n }\n var term = params.term.trim();\n if (term === \"\") {\n return null;\n }\n return {\n id: term,\n text: term\n };\n };\n Tags.prototype.insertTag = function(_, data, tag) {\n data.unshift(tag);\n };\n Tags.prototype._removeOldTags = function(_) {\n var $options = this.$element.find(\"option[data-select2-tag]\");\n $options.each(function() {\n if (this.selected) {\n return;\n }\n $2(this).remove();\n });\n };\n return Tags;\n });\n S22.define(\"select2/data/tokenizer\", [\n \"jquery\"\n ], function($2) {\n function Tokenizer(decorated, $element, options) {\n var tokenizer = options.get(\"tokenizer\");\n if (tokenizer !== void 0) {\n this.tokenizer = tokenizer;\n }\n decorated.call(this, $element, options);\n }\n Tokenizer.prototype.bind = function(decorated, container, $container) {\n decorated.call(this, container, $container);\n this.$search = container.dropdown.$search || container.selection.$search || $container.find(\".select2-search__field\");\n };\n Tokenizer.prototype.query = function(decorated, params, callback) {\n var self = this;\n function createAndSelect(data) {\n var item = self._normalizeItem(data);\n var $existingOptions = self.$element.find(\"option\").filter(function() {\n return $2(this).val() === item.id;\n });\n if (!$existingOptions.length) {\n var $option = self.option(item);\n $option.attr(\"data-select2-tag\", true);\n self._removeOldTags();\n self.addOptions([$option]);\n }\n select(item);\n }\n function select(data) {\n self.trigger(\"select\", {\n data\n });\n }\n params.term = params.term || \"\";\n var tokenData = this.tokenizer(params, this.options, createAndSelect);\n if (tokenData.term !== params.term) {\n if (this.$search.length) {\n this.$search.val(tokenData.term);\n this.$search.trigger(\"focus\");\n }\n params.term = tokenData.term;\n }\n decorated.call(this, params, callback);\n };\n Tokenizer.prototype.tokenizer = function(_, params, options, callback) {\n var separators = options.get(\"tokenSeparators\") || [];\n var term = params.term;\n var i = 0;\n var createTag = this.createTag || function(params2) {\n return {\n id: params2.term,\n text: params2.term\n };\n };\n while (i < term.length) {\n var termChar = term[i];\n if (separators.indexOf(termChar) === -1) {\n i++;\n continue;\n }\n var part = term.substr(0, i);\n var partParams = $2.extend({}, params, {\n term: part\n });\n var data = createTag(partParams);\n if (data == null) {\n i++;\n continue;\n }\n callback(data);\n term = term.substr(i + 1) || \"\";\n i = 0;\n }\n return {\n term\n };\n };\n return Tokenizer;\n });\n S22.define(\"select2/data/minimumInputLength\", [], function() {\n function MinimumInputLength(decorated, $e, options) {\n this.minimumInputLength = options.get(\"minimumInputLength\");\n decorated.call(this, $e, options);\n }\n MinimumInputLength.prototype.query = function(decorated, params, callback) {\n params.term = params.term || \"\";\n if (params.term.length < this.minimumInputLength) {\n this.trigger(\"results:message\", {\n message: \"inputTooShort\",\n args: {\n minimum: this.minimumInputLength,\n input: params.term,\n params\n }\n });\n return;\n }\n decorated.call(this, params, callback);\n };\n return MinimumInputLength;\n });\n S22.define(\"select2/data/maximumInputLength\", [], function() {\n function MaximumInputLength(decorated, $e, options) {\n this.maximumInputLength = options.get(\"maximumInputLength\");\n decorated.call(this, $e, options);\n }\n MaximumInputLength.prototype.query = function(decorated, params, callback) {\n params.term = params.term || \"\";\n if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) {\n this.trigger(\"results:message\", {\n message: \"inputTooLong\",\n args: {\n maximum: this.maximumInputLength,\n input: params.term,\n params\n }\n });\n return;\n }\n decorated.call(this, params, callback);\n };\n return MaximumInputLength;\n });\n S22.define(\"select2/data/maximumSelectionLength\", [], function() {\n function MaximumSelectionLength(decorated, $e, options) {\n this.maximumSelectionLength = options.get(\"maximumSelectionLength\");\n decorated.call(this, $e, options);\n }\n MaximumSelectionLength.prototype.bind = function(decorated, container, $container) {\n var self = this;\n decorated.call(this, container, $container);\n container.on(\"select\", function() {\n self._checkIfMaximumSelected();\n });\n };\n MaximumSelectionLength.prototype.query = function(decorated, params, callback) {\n var self = this;\n this._checkIfMaximumSelected(function() {\n decorated.call(self, params, callback);\n });\n };\n MaximumSelectionLength.prototype._checkIfMaximumSelected = function(_, successCallback) {\n var self = this;\n this.current(function(currentData) {\n var count = currentData != null ? currentData.length : 0;\n if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) {\n self.trigger(\"results:message\", {\n message: \"maximumSelected\",\n args: {\n maximum: self.maximumSelectionLength\n }\n });\n return;\n }\n if (successCallback) {\n successCallback();\n }\n });\n };\n return MaximumSelectionLength;\n });\n S22.define(\"select2/dropdown\", [\n \"jquery\",\n \"./utils\"\n ], function($2, Utils) {\n function Dropdown($element, options) {\n this.$element = $element;\n this.options = options;\n Dropdown.__super__.constructor.call(this);\n }\n Utils.Extend(Dropdown, Utils.Observable);\n Dropdown.prototype.render = function() {\n var $dropdown = $2(\n ''\n );\n $dropdown.attr(\"dir\", this.options.get(\"dir\"));\n this.$dropdown = $dropdown;\n return $dropdown;\n };\n Dropdown.prototype.bind = function() {\n };\n Dropdown.prototype.position = function($dropdown, $container) {\n };\n Dropdown.prototype.destroy = function() {\n this.$dropdown.remove();\n };\n return Dropdown;\n });\n S22.define(\"select2/dropdown/search\", [\n \"jquery\"\n ], function($2) {\n function Search() {\n }\n Search.prototype.render = function(decorated) {\n var $rendered = decorated.call(this);\n var searchLabel = this.options.get(\"translations\").get(\"search\");\n var $search = $2(\n ''\n );\n this.$searchContainer = $search;\n this.$search = $search.find(\"input\");\n this.$search.prop(\"autocomplete\", this.options.get(\"autocomplete\"));\n this.$search.attr(\"aria-label\", searchLabel());\n $rendered.prepend($search);\n return $rendered;\n };\n Search.prototype.bind = function(decorated, container, $container) {\n var self = this;\n var resultsId = container.id + \"-results\";\n decorated.call(this, container, $container);\n this.$search.on(\"keydown\", function(evt) {\n self.trigger(\"keypress\", evt);\n self._keyUpPrevented = evt.isDefaultPrevented();\n });\n this.$search.on(\"input\", function(evt) {\n $2(this).off(\"keyup\");\n });\n this.$search.on(\"keyup input\", function(evt) {\n self.handleSearch(evt);\n });\n container.on(\"open\", function() {\n self.$search.attr(\"tabindex\", 0);\n self.$search.attr(\"aria-controls\", resultsId);\n self.$search.trigger(\"focus\");\n window.setTimeout(function() {\n self.$search.trigger(\"focus\");\n }, 0);\n });\n container.on(\"close\", function() {\n self.$search.attr(\"tabindex\", -1);\n self.$search.removeAttr(\"aria-controls\");\n self.$search.removeAttr(\"aria-activedescendant\");\n self.$search.val(\"\");\n self.$search.trigger(\"blur\");\n });\n container.on(\"focus\", function() {\n if (!container.isOpen()) {\n self.$search.trigger(\"focus\");\n }\n });\n container.on(\"results:all\", function(params) {\n if (params.query.term == null || params.query.term === \"\") {\n var showSearch = self.showSearch(params);\n if (showSearch) {\n self.$searchContainer[0].classList.remove(\"select2-search--hide\");\n } else {\n self.$searchContainer[0].classList.add(\"select2-search--hide\");\n }\n }\n });\n container.on(\"results:focus\", function(params) {\n if (params.data._resultId) {\n self.$search.attr(\"aria-activedescendant\", params.data._resultId);\n } else {\n self.$search.removeAttr(\"aria-activedescendant\");\n }\n });\n };\n Search.prototype.handleSearch = function(evt) {\n if (!this._keyUpPrevented) {\n var input = this.$search.val();\n this.trigger(\"query\", {\n term: input\n });\n }\n this._keyUpPrevented = false;\n };\n Search.prototype.showSearch = function(_, params) {\n return true;\n };\n return Search;\n });\n S22.define(\"select2/dropdown/hidePlaceholder\", [], function() {\n function HidePlaceholder(decorated, $element, options, dataAdapter) {\n this.placeholder = this.normalizePlaceholder(options.get(\"placeholder\"));\n decorated.call(this, $element, options, dataAdapter);\n }\n HidePlaceholder.prototype.append = function(decorated, data) {\n data.results = this.removePlaceholder(data.results);\n decorated.call(this, data);\n };\n HidePlaceholder.prototype.normalizePlaceholder = function(_, placeholder) {\n if (typeof placeholder === \"string\") {\n placeholder = {\n id: \"\",\n text: placeholder\n };\n }\n return placeholder;\n };\n HidePlaceholder.prototype.removePlaceholder = function(_, data) {\n var modifiedData = data.slice(0);\n for (var d = data.length - 1; d >= 0; d--) {\n var item = data[d];\n if (this.placeholder.id === item.id) {\n modifiedData.splice(d, 1);\n }\n }\n return modifiedData;\n };\n return HidePlaceholder;\n });\n S22.define(\"select2/dropdown/infiniteScroll\", [\n \"jquery\"\n ], function($2) {\n function InfiniteScroll(decorated, $element, options, dataAdapter) {\n this.lastParams = {};\n decorated.call(this, $element, options, dataAdapter);\n this.$loadingMore = this.createLoadingMore();\n this.loading = false;\n }\n InfiniteScroll.prototype.append = function(decorated, data) {\n this.$loadingMore.remove();\n this.loading = false;\n decorated.call(this, data);\n if (this.showLoadingMore(data)) {\n this.$results.append(this.$loadingMore);\n this.loadMoreIfNeeded();\n }\n };\n InfiniteScroll.prototype.bind = function(decorated, container, $container) {\n var self = this;\n decorated.call(this, container, $container);\n container.on(\"query\", function(params) {\n self.lastParams = params;\n self.loading = true;\n });\n container.on(\"query:append\", function(params) {\n self.lastParams = params;\n self.loading = true;\n });\n this.$results.on(\"scroll\", this.loadMoreIfNeeded.bind(this));\n };\n InfiniteScroll.prototype.loadMoreIfNeeded = function() {\n var isLoadMoreVisible = $2.contains(\n document.documentElement,\n this.$loadingMore[0]\n );\n if (this.loading || !isLoadMoreVisible) {\n return;\n }\n var currentOffset = this.$results.offset().top + this.$results.outerHeight(false);\n var loadingMoreOffset = this.$loadingMore.offset().top + this.$loadingMore.outerHeight(false);\n if (currentOffset + 50 >= loadingMoreOffset) {\n this.loadMore();\n }\n };\n InfiniteScroll.prototype.loadMore = function() {\n this.loading = true;\n var params = $2.extend({}, { page: 1 }, this.lastParams);\n params.page++;\n this.trigger(\"query:append\", params);\n };\n InfiniteScroll.prototype.showLoadingMore = function(_, data) {\n return data.pagination && data.pagination.more;\n };\n InfiniteScroll.prototype.createLoadingMore = function() {\n var $option = $2(\n '
  • '\n );\n var message = this.options.get(\"translations\").get(\"loadingMore\");\n $option.html(message(this.lastParams));\n return $option;\n };\n return InfiniteScroll;\n });\n S22.define(\"select2/dropdown/attachBody\", [\n \"jquery\",\n \"../utils\"\n ], function($2, Utils) {\n function AttachBody(decorated, $element, options) {\n this.$dropdownParent = $2(options.get(\"dropdownParent\") || document.body);\n decorated.call(this, $element, options);\n }\n AttachBody.prototype.bind = function(decorated, container, $container) {\n var self = this;\n decorated.call(this, container, $container);\n container.on(\"open\", function() {\n self._showDropdown();\n self._attachPositioningHandler(container);\n self._bindContainerResultHandlers(container);\n });\n container.on(\"close\", function() {\n self._hideDropdown();\n self._detachPositioningHandler(container);\n });\n this.$dropdownContainer.on(\"mousedown\", function(evt) {\n evt.stopPropagation();\n });\n };\n AttachBody.prototype.destroy = function(decorated) {\n decorated.call(this);\n this.$dropdownContainer.remove();\n };\n AttachBody.prototype.position = function(decorated, $dropdown, $container) {\n $dropdown.attr(\"class\", $container.attr(\"class\"));\n $dropdown[0].classList.remove(\"select2\");\n $dropdown[0].classList.add(\"select2-container--open\");\n $dropdown.css({\n position: \"absolute\",\n top: -999999\n });\n this.$container = $container;\n };\n AttachBody.prototype.render = function(decorated) {\n var $container = $2(\"\");\n var $dropdown = decorated.call(this);\n $container.append($dropdown);\n this.$dropdownContainer = $container;\n return $container;\n };\n AttachBody.prototype._hideDropdown = function(decorated) {\n this.$dropdownContainer.detach();\n };\n AttachBody.prototype._bindContainerResultHandlers = function(decorated, container) {\n if (this._containerResultsHandlersBound) {\n return;\n }\n var self = this;\n container.on(\"results:all\", function() {\n self._positionDropdown();\n self._resizeDropdown();\n });\n container.on(\"results:append\", function() {\n self._positionDropdown();\n self._resizeDropdown();\n });\n container.on(\"results:message\", function() {\n self._positionDropdown();\n self._resizeDropdown();\n });\n container.on(\"select\", function() {\n self._positionDropdown();\n self._resizeDropdown();\n });\n container.on(\"unselect\", function() {\n self._positionDropdown();\n self._resizeDropdown();\n });\n this._containerResultsHandlersBound = true;\n };\n AttachBody.prototype._attachPositioningHandler = function(decorated, container) {\n var self = this;\n var scrollEvent = \"scroll.select2.\" + container.id;\n var resizeEvent = \"resize.select2.\" + container.id;\n var orientationEvent = \"orientationchange.select2.\" + container.id;\n var $watchers = this.$container.parents().filter(Utils.hasScroll);\n $watchers.each(function() {\n Utils.StoreData(this, \"select2-scroll-position\", {\n x: $2(this).scrollLeft(),\n y: $2(this).scrollTop()\n });\n });\n $watchers.on(scrollEvent, function(ev) {\n var position = Utils.GetData(this, \"select2-scroll-position\");\n $2(this).scrollTop(position.y);\n });\n $2(window).on(\n scrollEvent + \" \" + resizeEvent + \" \" + orientationEvent,\n function(e) {\n self._positionDropdown();\n self._resizeDropdown();\n }\n );\n };\n AttachBody.prototype._detachPositioningHandler = function(decorated, container) {\n var scrollEvent = \"scroll.select2.\" + container.id;\n var resizeEvent = \"resize.select2.\" + container.id;\n var orientationEvent = \"orientationchange.select2.\" + container.id;\n var $watchers = this.$container.parents().filter(Utils.hasScroll);\n $watchers.off(scrollEvent);\n $2(window).off(scrollEvent + \" \" + resizeEvent + \" \" + orientationEvent);\n };\n AttachBody.prototype._positionDropdown = function() {\n var $window = $2(window);\n var isCurrentlyAbove = this.$dropdown[0].classList.contains(\"select2-dropdown--above\");\n var isCurrentlyBelow = this.$dropdown[0].classList.contains(\"select2-dropdown--below\");\n var newDirection = null;\n var offset = this.$container.offset();\n offset.bottom = offset.top + this.$container.outerHeight(false);\n var container = {\n height: this.$container.outerHeight(false)\n };\n container.top = offset.top;\n container.bottom = offset.top + container.height;\n var dropdown = {\n height: this.$dropdown.outerHeight(false)\n };\n var viewport = {\n top: $window.scrollTop(),\n bottom: $window.scrollTop() + $window.height()\n };\n var enoughRoomAbove = viewport.top < offset.top - dropdown.height;\n var enoughRoomBelow = viewport.bottom > offset.bottom + dropdown.height;\n var css = {\n left: offset.left,\n top: container.bottom\n };\n var $offsetParent = this.$dropdownParent;\n if ($offsetParent.css(\"position\") === \"static\") {\n $offsetParent = $offsetParent.offsetParent();\n }\n var parentOffset = {\n top: 0,\n left: 0\n };\n if ($2.contains(document.body, $offsetParent[0]) || $offsetParent[0].isConnected) {\n parentOffset = $offsetParent.offset();\n }\n css.top -= parentOffset.top;\n css.left -= parentOffset.left;\n if (!isCurrentlyAbove && !isCurrentlyBelow) {\n newDirection = \"below\";\n }\n if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n newDirection = \"above\";\n } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n newDirection = \"below\";\n }\n if (newDirection == \"above\" || isCurrentlyAbove && newDirection !== \"below\") {\n css.top = container.top - parentOffset.top - dropdown.height;\n }\n if (newDirection != null) {\n this.$dropdown[0].classList.remove(\"select2-dropdown--below\");\n this.$dropdown[0].classList.remove(\"select2-dropdown--above\");\n this.$dropdown[0].classList.add(\"select2-dropdown--\" + newDirection);\n this.$container[0].classList.remove(\"select2-container--below\");\n this.$container[0].classList.remove(\"select2-container--above\");\n this.$container[0].classList.add(\"select2-container--\" + newDirection);\n }\n this.$dropdownContainer.css(css);\n };\n AttachBody.prototype._resizeDropdown = function() {\n var css = {\n width: this.$container.outerWidth(false) + \"px\"\n };\n if (this.options.get(\"dropdownAutoWidth\")) {\n css.minWidth = css.width;\n css.position = \"relative\";\n css.width = \"auto\";\n }\n this.$dropdown.css(css);\n };\n AttachBody.prototype._showDropdown = function(decorated) {\n this.$dropdownContainer.appendTo(this.$dropdownParent);\n this._positionDropdown();\n this._resizeDropdown();\n };\n return AttachBody;\n });\n S22.define(\"select2/dropdown/minimumResultsForSearch\", [], function() {\n function countResults(data) {\n var count = 0;\n for (var d = 0; d < data.length; d++) {\n var item = data[d];\n if (item.children) {\n count += countResults(item.children);\n } else {\n count++;\n }\n }\n return count;\n }\n function MinimumResultsForSearch(decorated, $element, options, dataAdapter) {\n this.minimumResultsForSearch = options.get(\"minimumResultsForSearch\");\n if (this.minimumResultsForSearch < 0) {\n this.minimumResultsForSearch = Infinity;\n }\n decorated.call(this, $element, options, dataAdapter);\n }\n MinimumResultsForSearch.prototype.showSearch = function(decorated, params) {\n if (countResults(params.data.results) < this.minimumResultsForSearch) {\n return false;\n }\n return decorated.call(this, params);\n };\n return MinimumResultsForSearch;\n });\n S22.define(\"select2/dropdown/selectOnClose\", [\n \"../utils\"\n ], function(Utils) {\n function SelectOnClose() {\n }\n SelectOnClose.prototype.bind = function(decorated, container, $container) {\n var self = this;\n decorated.call(this, container, $container);\n container.on(\"close\", function(params) {\n self._handleSelectOnClose(params);\n });\n };\n SelectOnClose.prototype._handleSelectOnClose = function(_, params) {\n if (params && params.originalSelect2Event != null) {\n var event = params.originalSelect2Event;\n if (event._type === \"select\" || event._type === \"unselect\") {\n return;\n }\n }\n var $highlightedResults = this.getHighlightedResults();\n if ($highlightedResults.length < 1) {\n return;\n }\n var data = Utils.GetData($highlightedResults[0], \"data\");\n if (data.element != null && data.element.selected || data.element == null && data.selected) {\n return;\n }\n this.trigger(\"select\", {\n data\n });\n };\n return SelectOnClose;\n });\n S22.define(\"select2/dropdown/closeOnSelect\", [], function() {\n function CloseOnSelect() {\n }\n CloseOnSelect.prototype.bind = function(decorated, container, $container) {\n var self = this;\n decorated.call(this, container, $container);\n container.on(\"select\", function(evt) {\n self._selectTriggered(evt);\n });\n container.on(\"unselect\", function(evt) {\n self._selectTriggered(evt);\n });\n };\n CloseOnSelect.prototype._selectTriggered = function(_, evt) {\n var originalEvent = evt.originalEvent;\n if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {\n return;\n }\n this.trigger(\"close\", {\n originalEvent,\n originalSelect2Event: evt\n });\n };\n return CloseOnSelect;\n });\n S22.define(\"select2/dropdown/dropdownCss\", [\n \"../utils\"\n ], function(Utils) {\n function DropdownCSS() {\n }\n DropdownCSS.prototype.render = function(decorated) {\n var $dropdown = decorated.call(this);\n var dropdownCssClass = this.options.get(\"dropdownCssClass\") || \"\";\n if (dropdownCssClass.indexOf(\":all:\") !== -1) {\n dropdownCssClass = dropdownCssClass.replace(\":all:\", \"\");\n Utils.copyNonInternalCssClasses($dropdown[0], this.$element[0]);\n }\n $dropdown.addClass(dropdownCssClass);\n return $dropdown;\n };\n return DropdownCSS;\n });\n S22.define(\"select2/dropdown/tagsSearchHighlight\", [\n \"../utils\"\n ], function(Utils) {\n function TagsSearchHighlight() {\n }\n TagsSearchHighlight.prototype.highlightFirstItem = function(decorated) {\n var $options = this.$results.find(\n \".select2-results__option--selectable:not(.select2-results__option--selected)\"\n );\n if ($options.length > 0) {\n var $firstOption = $options.first();\n var data = Utils.GetData($firstOption[0], \"data\");\n var firstElement = data.element;\n if (firstElement && firstElement.getAttribute) {\n if (firstElement.getAttribute(\"data-select2-tag\") === \"true\") {\n $firstOption.trigger(\"mouseenter\");\n return;\n }\n }\n }\n decorated.call(this);\n };\n return TagsSearchHighlight;\n });\n S22.define(\"select2/i18n/en\", [], function() {\n return {\n errorLoading: function() {\n return \"The results could not be loaded.\";\n },\n inputTooLong: function(args) {\n var overChars = args.input.length - args.maximum;\n var message = \"Please delete \" + overChars + \" character\";\n if (overChars != 1) {\n message += \"s\";\n }\n return message;\n },\n inputTooShort: function(args) {\n var remainingChars = args.minimum - args.input.length;\n var message = \"Please enter \" + remainingChars + \" or more characters\";\n return message;\n },\n loadingMore: function() {\n return \"Loading more results\\u2026\";\n },\n maximumSelected: function(args) {\n var message = \"You can only select \" + args.maximum + \" item\";\n if (args.maximum != 1) {\n message += \"s\";\n }\n return message;\n },\n noResults: function() {\n return \"No results found\";\n },\n searching: function() {\n return \"Searching\\u2026\";\n },\n removeAllItems: function() {\n return \"Remove all items\";\n },\n removeItem: function() {\n return \"Remove item\";\n },\n search: function() {\n return \"Search\";\n }\n };\n });\n S22.define(\"select2/defaults\", [\n \"jquery\",\n \"./results\",\n \"./selection/single\",\n \"./selection/multiple\",\n \"./selection/placeholder\",\n \"./selection/allowClear\",\n \"./selection/search\",\n \"./selection/selectionCss\",\n \"./selection/eventRelay\",\n \"./utils\",\n \"./translation\",\n \"./diacritics\",\n \"./data/select\",\n \"./data/array\",\n \"./data/ajax\",\n \"./data/tags\",\n \"./data/tokenizer\",\n \"./data/minimumInputLength\",\n \"./data/maximumInputLength\",\n \"./data/maximumSelectionLength\",\n \"./dropdown\",\n \"./dropdown/search\",\n \"./dropdown/hidePlaceholder\",\n \"./dropdown/infiniteScroll\",\n \"./dropdown/attachBody\",\n \"./dropdown/minimumResultsForSearch\",\n \"./dropdown/selectOnClose\",\n \"./dropdown/closeOnSelect\",\n \"./dropdown/dropdownCss\",\n \"./dropdown/tagsSearchHighlight\",\n \"./i18n/en\"\n ], function($2, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, SelectionCSS, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, DropdownCSS, TagsSearchHighlight, EnglishTranslation) {\n function Defaults() {\n this.reset();\n }\n Defaults.prototype.apply = function(options) {\n options = $2.extend(true, {}, this.defaults, options);\n if (options.dataAdapter == null) {\n if (options.ajax != null) {\n options.dataAdapter = AjaxData;\n } else if (options.data != null) {\n options.dataAdapter = ArrayData;\n } else {\n options.dataAdapter = SelectData;\n }\n if (options.minimumInputLength > 0) {\n options.dataAdapter = Utils.Decorate(\n options.dataAdapter,\n MinimumInputLength\n );\n }\n if (options.maximumInputLength > 0) {\n options.dataAdapter = Utils.Decorate(\n options.dataAdapter,\n MaximumInputLength\n );\n }\n if (options.maximumSelectionLength > 0) {\n options.dataAdapter = Utils.Decorate(\n options.dataAdapter,\n MaximumSelectionLength\n );\n }\n if (options.tags) {\n options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n }\n if (options.tokenSeparators != null || options.tokenizer != null) {\n options.dataAdapter = Utils.Decorate(\n options.dataAdapter,\n Tokenizer\n );\n }\n }\n if (options.resultsAdapter == null) {\n options.resultsAdapter = ResultsList;\n if (options.ajax != null) {\n options.resultsAdapter = Utils.Decorate(\n options.resultsAdapter,\n InfiniteScroll\n );\n }\n if (options.placeholder != null) {\n options.resultsAdapter = Utils.Decorate(\n options.resultsAdapter,\n HidePlaceholder\n );\n }\n if (options.selectOnClose) {\n options.resultsAdapter = Utils.Decorate(\n options.resultsAdapter,\n SelectOnClose\n );\n }\n if (options.tags) {\n options.resultsAdapter = Utils.Decorate(\n options.resultsAdapter,\n TagsSearchHighlight\n );\n }\n }\n if (options.dropdownAdapter == null) {\n if (options.multiple) {\n options.dropdownAdapter = Dropdown;\n } else {\n var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n options.dropdownAdapter = SearchableDropdown;\n }\n if (options.minimumResultsForSearch !== 0) {\n options.dropdownAdapter = Utils.Decorate(\n options.dropdownAdapter,\n MinimumResultsForSearch\n );\n }\n if (options.closeOnSelect) {\n options.dropdownAdapter = Utils.Decorate(\n options.dropdownAdapter,\n CloseOnSelect\n );\n }\n if (options.dropdownCssClass != null) {\n options.dropdownAdapter = Utils.Decorate(\n options.dropdownAdapter,\n DropdownCSS\n );\n }\n options.dropdownAdapter = Utils.Decorate(\n options.dropdownAdapter,\n AttachBody\n );\n }\n if (options.selectionAdapter == null) {\n if (options.multiple) {\n options.selectionAdapter = MultipleSelection;\n } else {\n options.selectionAdapter = SingleSelection;\n }\n if (options.placeholder != null) {\n options.selectionAdapter = Utils.Decorate(\n options.selectionAdapter,\n Placeholder\n );\n }\n if (options.allowClear) {\n options.selectionAdapter = Utils.Decorate(\n options.selectionAdapter,\n AllowClear\n );\n }\n if (options.multiple) {\n options.selectionAdapter = Utils.Decorate(\n options.selectionAdapter,\n SelectionSearch\n );\n }\n if (options.selectionCssClass != null) {\n options.selectionAdapter = Utils.Decorate(\n options.selectionAdapter,\n SelectionCSS\n );\n }\n options.selectionAdapter = Utils.Decorate(\n options.selectionAdapter,\n EventRelay\n );\n }\n options.language = this._resolveLanguage(options.language);\n options.language.push(\"en\");\n var uniqueLanguages = [];\n for (var l = 0; l < options.language.length; l++) {\n var language = options.language[l];\n if (uniqueLanguages.indexOf(language) === -1) {\n uniqueLanguages.push(language);\n }\n }\n options.language = uniqueLanguages;\n options.translations = this._processTranslations(\n options.language,\n options.debug\n );\n return options;\n };\n Defaults.prototype.reset = function() {\n function stripDiacritics(text) {\n function match(a) {\n return DIACRITICS[a] || a;\n }\n return text.replace(/[^\\u0000-\\u007E]/g, match);\n }\n function matcher(params, data) {\n if (params.term == null || params.term.trim() === \"\") {\n return data;\n }\n if (data.children && data.children.length > 0) {\n var match = $2.extend(true, {}, data);\n for (var c = data.children.length - 1; c >= 0; c--) {\n var child = data.children[c];\n var matches = matcher(params, child);\n if (matches == null) {\n match.children.splice(c, 1);\n }\n }\n if (match.children.length > 0) {\n return match;\n }\n return matcher(params, match);\n }\n var original = stripDiacritics(data.text).toUpperCase();\n var term = stripDiacritics(params.term).toUpperCase();\n if (original.indexOf(term) > -1) {\n return data;\n }\n return null;\n }\n this.defaults = {\n amdLanguageBase: \"./i18n/\",\n autocomplete: \"off\",\n closeOnSelect: true,\n debug: false,\n dropdownAutoWidth: false,\n escapeMarkup: Utils.escapeMarkup,\n language: {},\n matcher,\n minimumInputLength: 0,\n maximumInputLength: 0,\n maximumSelectionLength: 0,\n minimumResultsForSearch: 0,\n selectOnClose: false,\n scrollAfterSelect: false,\n sorter: function(data) {\n return data;\n },\n templateResult: function(result) {\n return result.text;\n },\n templateSelection: function(selection) {\n return selection.text;\n },\n theme: \"default\",\n width: \"resolve\"\n };\n };\n Defaults.prototype.applyFromElement = function(options, $element) {\n var optionLanguage = options.language;\n var defaultLanguage = this.defaults.language;\n var elementLanguage = $element.prop(\"lang\");\n var parentLanguage = $element.closest(\"[lang]\").prop(\"lang\");\n var languages = Array.prototype.concat.call(\n this._resolveLanguage(elementLanguage),\n this._resolveLanguage(optionLanguage),\n this._resolveLanguage(defaultLanguage),\n this._resolveLanguage(parentLanguage)\n );\n options.language = languages;\n return options;\n };\n Defaults.prototype._resolveLanguage = function(language) {\n if (!language) {\n return [];\n }\n if ($2.isEmptyObject(language)) {\n return [];\n }\n if ($2.isPlainObject(language)) {\n return [language];\n }\n var languages;\n if (!Array.isArray(language)) {\n languages = [language];\n } else {\n languages = language;\n }\n var resolvedLanguages = [];\n for (var l = 0; l < languages.length; l++) {\n resolvedLanguages.push(languages[l]);\n if (typeof languages[l] === \"string\" && languages[l].indexOf(\"-\") > 0) {\n var languageParts = languages[l].split(\"-\");\n var baseLanguage = languageParts[0];\n resolvedLanguages.push(baseLanguage);\n }\n }\n return resolvedLanguages;\n };\n Defaults.prototype._processTranslations = function(languages, debug) {\n var translations = new Translation();\n for (var l = 0; l < languages.length; l++) {\n var languageData = new Translation();\n var language = languages[l];\n if (typeof language === \"string\") {\n try {\n languageData = Translation.loadPath(language);\n } catch (e) {\n try {\n language = this.defaults.amdLanguageBase + language;\n languageData = Translation.loadPath(language);\n } catch (ex) {\n if (debug && window.console && console.warn) {\n console.warn(\n 'Select2: The language file for \"' + language + '\" could not be automatically loaded. A fallback will be used instead.'\n );\n }\n }\n }\n } else if ($2.isPlainObject(language)) {\n languageData = new Translation(language);\n } else {\n languageData = language;\n }\n translations.extend(languageData);\n }\n return translations;\n };\n Defaults.prototype.set = function(key, value) {\n var camelKey = $2.camelCase(key);\n var data = {};\n data[camelKey] = value;\n var convertedData = Utils._convertData(data);\n $2.extend(true, this.defaults, convertedData);\n };\n var defaults = new Defaults();\n return defaults;\n });\n S22.define(\"select2/options\", [\n \"jquery\",\n \"./defaults\",\n \"./utils\"\n ], function($2, Defaults, Utils) {\n function Options(options, $element) {\n this.options = options;\n if ($element != null) {\n this.fromElement($element);\n }\n if ($element != null) {\n this.options = Defaults.applyFromElement(this.options, $element);\n }\n this.options = Defaults.apply(this.options);\n }\n Options.prototype.fromElement = function($e) {\n var excludedData = [\"select2\"];\n if (this.options.multiple == null) {\n this.options.multiple = $e.prop(\"multiple\");\n }\n if (this.options.disabled == null) {\n this.options.disabled = $e.prop(\"disabled\");\n }\n if (this.options.autocomplete == null && $e.prop(\"autocomplete\")) {\n this.options.autocomplete = $e.prop(\"autocomplete\");\n }\n if (this.options.dir == null) {\n if ($e.prop(\"dir\")) {\n this.options.dir = $e.prop(\"dir\");\n } else if ($e.closest(\"[dir]\").prop(\"dir\")) {\n this.options.dir = $e.closest(\"[dir]\").prop(\"dir\");\n } else {\n this.options.dir = \"ltr\";\n }\n }\n $e.prop(\"disabled\", this.options.disabled);\n $e.prop(\"multiple\", this.options.multiple);\n if (Utils.GetData($e[0], \"select2Tags\")) {\n if (this.options.debug && window.console && console.warn) {\n console.warn(\n 'Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags=\"true\"` attributes and will be removed in future versions of Select2.'\n );\n }\n Utils.StoreData($e[0], \"data\", Utils.GetData($e[0], \"select2Tags\"));\n Utils.StoreData($e[0], \"tags\", true);\n }\n if (Utils.GetData($e[0], \"ajaxUrl\")) {\n if (this.options.debug && window.console && console.warn) {\n console.warn(\n \"Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2.\"\n );\n }\n $e.attr(\"ajax--url\", Utils.GetData($e[0], \"ajaxUrl\"));\n Utils.StoreData($e[0], \"ajax-Url\", Utils.GetData($e[0], \"ajaxUrl\"));\n }\n var dataset = {};\n function upperCaseLetter(_, letter) {\n return letter.toUpperCase();\n }\n for (var attr = 0; attr < $e[0].attributes.length; attr++) {\n var attributeName = $e[0].attributes[attr].name;\n var prefix = \"data-\";\n if (attributeName.substr(0, prefix.length) == prefix) {\n var dataName = attributeName.substring(prefix.length);\n var dataValue = Utils.GetData($e[0], dataName);\n var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);\n dataset[camelDataName] = dataValue;\n }\n }\n if ($2.fn.jquery && $2.fn.jquery.substr(0, 2) == \"1.\" && $e[0].dataset) {\n dataset = $2.extend(true, {}, $e[0].dataset, dataset);\n }\n var data = $2.extend(true, {}, Utils.GetData($e[0]), dataset);\n data = Utils._convertData(data);\n for (var key in data) {\n if (excludedData.indexOf(key) > -1) {\n continue;\n }\n if ($2.isPlainObject(this.options[key])) {\n $2.extend(this.options[key], data[key]);\n } else {\n this.options[key] = data[key];\n }\n }\n return this;\n };\n Options.prototype.get = function(key) {\n return this.options[key];\n };\n Options.prototype.set = function(key, val) {\n this.options[key] = val;\n };\n return Options;\n });\n S22.define(\"select2/core\", [\n \"jquery\",\n \"./options\",\n \"./utils\",\n \"./keys\"\n ], function($2, Options, Utils, KEYS) {\n var Select2 = function($element, options) {\n if (Utils.GetData($element[0], \"select2\") != null) {\n Utils.GetData($element[0], \"select2\").destroy();\n }\n this.$element = $element;\n this.id = this._generateId($element);\n options = options || {};\n this.options = new Options(options, $element);\n Select2.__super__.constructor.call(this);\n var tabindex = $element.attr(\"tabindex\") || 0;\n Utils.StoreData($element[0], \"old-tabindex\", tabindex);\n $element.attr(\"tabindex\", \"-1\");\n var DataAdapter = this.options.get(\"dataAdapter\");\n this.dataAdapter = new DataAdapter($element, this.options);\n var $container = this.render();\n this._placeContainer($container);\n var SelectionAdapter = this.options.get(\"selectionAdapter\");\n this.selection = new SelectionAdapter($element, this.options);\n this.$selection = this.selection.render();\n this.selection.position(this.$selection, $container);\n var DropdownAdapter = this.options.get(\"dropdownAdapter\");\n this.dropdown = new DropdownAdapter($element, this.options);\n this.$dropdown = this.dropdown.render();\n this.dropdown.position(this.$dropdown, $container);\n var ResultsAdapter = this.options.get(\"resultsAdapter\");\n this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n this.$results = this.results.render();\n this.results.position(this.$results, this.$dropdown);\n var self = this;\n this._bindAdapters();\n this._registerDomEvents();\n this._registerDataEvents();\n this._registerSelectionEvents();\n this._registerDropdownEvents();\n this._registerResultsEvents();\n this._registerEvents();\n this.dataAdapter.current(function(initialData) {\n self.trigger(\"selection:update\", {\n data: initialData\n });\n });\n $element[0].classList.add(\"select2-hidden-accessible\");\n $element.attr(\"aria-hidden\", \"true\");\n this._syncAttributes();\n Utils.StoreData($element[0], \"select2\", this);\n $element.data(\"select2\", this);\n };\n Utils.Extend(Select2, Utils.Observable);\n Select2.prototype._generateId = function($element) {\n var id = \"\";\n if ($element.attr(\"id\") != null) {\n id = $element.attr(\"id\");\n } else if ($element.attr(\"name\") != null) {\n id = $element.attr(\"name\") + \"-\" + Utils.generateChars(2);\n } else {\n id = Utils.generateChars(4);\n }\n id = id.replace(/(:|\\.|\\[|\\]|,)/g, \"\");\n id = \"select2-\" + id;\n return id;\n };\n Select2.prototype._placeContainer = function($container) {\n $container.insertAfter(this.$element);\n var width = this._resolveWidth(this.$element, this.options.get(\"width\"));\n if (width != null) {\n $container.css(\"width\", width);\n }\n };\n Select2.prototype._resolveWidth = function($element, method) {\n var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n if (method == \"resolve\") {\n var styleWidth = this._resolveWidth($element, \"style\");\n if (styleWidth != null) {\n return styleWidth;\n }\n return this._resolveWidth($element, \"element\");\n }\n if (method == \"element\") {\n var elementWidth = $element.outerWidth(false);\n if (elementWidth <= 0) {\n return \"auto\";\n }\n return elementWidth + \"px\";\n }\n if (method == \"style\") {\n var style = $element.attr(\"style\");\n if (typeof style !== \"string\") {\n return null;\n }\n var attrs = style.split(\";\");\n for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n var attr = attrs[i].replace(/\\s/g, \"\");\n var matches = attr.match(WIDTH);\n if (matches !== null && matches.length >= 1) {\n return matches[1];\n }\n }\n return null;\n }\n if (method == \"computedstyle\") {\n var computedStyle = window.getComputedStyle($element[0]);\n return computedStyle.width;\n }\n return method;\n };\n Select2.prototype._bindAdapters = function() {\n this.dataAdapter.bind(this, this.$container);\n this.selection.bind(this, this.$container);\n this.dropdown.bind(this, this.$container);\n this.results.bind(this, this.$container);\n };\n Select2.prototype._registerDomEvents = function() {\n var self = this;\n this.$element.on(\"change.select2\", function() {\n self.dataAdapter.current(function(data) {\n self.trigger(\"selection:update\", {\n data\n });\n });\n });\n this.$element.on(\"focus.select2\", function(evt) {\n self.trigger(\"focus\", evt);\n });\n this._syncA = Utils.bind(this._syncAttributes, this);\n this._syncS = Utils.bind(this._syncSubtree, this);\n this._observer = new window.MutationObserver(function(mutations) {\n self._syncA();\n self._syncS(mutations);\n });\n this._observer.observe(this.$element[0], {\n attributes: true,\n childList: true,\n subtree: false\n });\n };\n Select2.prototype._registerDataEvents = function() {\n var self = this;\n this.dataAdapter.on(\"*\", function(name, params) {\n self.trigger(name, params);\n });\n };\n Select2.prototype._registerSelectionEvents = function() {\n var self = this;\n var nonRelayEvents = [\"toggle\", \"focus\"];\n this.selection.on(\"toggle\", function() {\n self.toggleDropdown();\n });\n this.selection.on(\"focus\", function(params) {\n self.focus(params);\n });\n this.selection.on(\"*\", function(name, params) {\n if (nonRelayEvents.indexOf(name) !== -1) {\n return;\n }\n self.trigger(name, params);\n });\n };\n Select2.prototype._registerDropdownEvents = function() {\n var self = this;\n this.dropdown.on(\"*\", function(name, params) {\n self.trigger(name, params);\n });\n };\n Select2.prototype._registerResultsEvents = function() {\n var self = this;\n this.results.on(\"*\", function(name, params) {\n self.trigger(name, params);\n });\n };\n Select2.prototype._registerEvents = function() {\n var self = this;\n this.on(\"open\", function() {\n self.$container[0].classList.add(\"select2-container--open\");\n });\n this.on(\"close\", function() {\n self.$container[0].classList.remove(\"select2-container--open\");\n });\n this.on(\"enable\", function() {\n self.$container[0].classList.remove(\"select2-container--disabled\");\n });\n this.on(\"disable\", function() {\n self.$container[0].classList.add(\"select2-container--disabled\");\n });\n this.on(\"blur\", function() {\n self.$container[0].classList.remove(\"select2-container--focus\");\n });\n this.on(\"query\", function(params) {\n if (!self.isOpen()) {\n self.trigger(\"open\", {});\n }\n this.dataAdapter.query(params, function(data) {\n self.trigger(\"results:all\", {\n data,\n query: params\n });\n });\n });\n this.on(\"query:append\", function(params) {\n this.dataAdapter.query(params, function(data) {\n self.trigger(\"results:append\", {\n data,\n query: params\n });\n });\n });\n this.on(\"keypress\", function(evt) {\n var key = evt.which;\n if (self.isOpen()) {\n if (key === KEYS.ESC || key === KEYS.UP && evt.altKey) {\n self.close(evt);\n evt.preventDefault();\n } else if (key === KEYS.ENTER || key === KEYS.TAB) {\n self.trigger(\"results:select\", {});\n evt.preventDefault();\n } else if (key === KEYS.SPACE && evt.ctrlKey) {\n self.trigger(\"results:toggle\", {});\n evt.preventDefault();\n } else if (key === KEYS.UP) {\n self.trigger(\"results:previous\", {});\n evt.preventDefault();\n } else if (key === KEYS.DOWN) {\n self.trigger(\"results:next\", {});\n evt.preventDefault();\n }\n } else {\n if (key === KEYS.ENTER || key === KEYS.SPACE || key === KEYS.DOWN && evt.altKey) {\n self.open();\n evt.preventDefault();\n }\n }\n });\n };\n Select2.prototype._syncAttributes = function() {\n this.options.set(\"disabled\", this.$element.prop(\"disabled\"));\n if (this.isDisabled()) {\n if (this.isOpen()) {\n this.close();\n }\n this.trigger(\"disable\", {});\n } else {\n this.trigger(\"enable\", {});\n }\n };\n Select2.prototype._isChangeMutation = function(mutations) {\n var self = this;\n if (mutations.addedNodes && mutations.addedNodes.length > 0) {\n for (var n = 0; n < mutations.addedNodes.length; n++) {\n var node = mutations.addedNodes[n];\n if (node.selected) {\n return true;\n }\n }\n } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {\n return true;\n } else if (Array.isArray(mutations)) {\n return mutations.some(function(mutation) {\n return self._isChangeMutation(mutation);\n });\n }\n return false;\n };\n Select2.prototype._syncSubtree = function(mutations) {\n var changed = this._isChangeMutation(mutations);\n var self = this;\n if (changed) {\n this.dataAdapter.current(function(currentData) {\n self.trigger(\"selection:update\", {\n data: currentData\n });\n });\n }\n };\n Select2.prototype.trigger = function(name, args) {\n var actualTrigger = Select2.__super__.trigger;\n var preTriggerMap = {\n \"open\": \"opening\",\n \"close\": \"closing\",\n \"select\": \"selecting\",\n \"unselect\": \"unselecting\",\n \"clear\": \"clearing\"\n };\n if (args === void 0) {\n args = {};\n }\n if (name in preTriggerMap) {\n var preTriggerName = preTriggerMap[name];\n var preTriggerArgs = {\n prevented: false,\n name,\n args\n };\n actualTrigger.call(this, preTriggerName, preTriggerArgs);\n if (preTriggerArgs.prevented) {\n args.prevented = true;\n return;\n }\n }\n actualTrigger.call(this, name, args);\n };\n Select2.prototype.toggleDropdown = function() {\n if (this.isDisabled()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n };\n Select2.prototype.open = function() {\n if (this.isOpen()) {\n return;\n }\n if (this.isDisabled()) {\n return;\n }\n this.trigger(\"query\", {});\n };\n Select2.prototype.close = function(evt) {\n if (!this.isOpen()) {\n return;\n }\n this.trigger(\"close\", { originalEvent: evt });\n };\n Select2.prototype.isEnabled = function() {\n return !this.isDisabled();\n };\n Select2.prototype.isDisabled = function() {\n return this.options.get(\"disabled\");\n };\n Select2.prototype.isOpen = function() {\n return this.$container[0].classList.contains(\"select2-container--open\");\n };\n Select2.prototype.hasFocus = function() {\n return this.$container[0].classList.contains(\"select2-container--focus\");\n };\n Select2.prototype.focus = function(data) {\n if (this.hasFocus()) {\n return;\n }\n this.$container[0].classList.add(\"select2-container--focus\");\n this.trigger(\"focus\", {});\n };\n Select2.prototype.enable = function(args) {\n if (this.options.get(\"debug\") && window.console && console.warn) {\n console.warn(\n 'Select2: The `select2(\"enable\")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop(\"disabled\") instead.'\n );\n }\n if (args == null || args.length === 0) {\n args = [true];\n }\n var disabled = !args[0];\n this.$element.prop(\"disabled\", disabled);\n };\n Select2.prototype.data = function() {\n if (this.options.get(\"debug\") && arguments.length > 0 && window.console && console.warn) {\n console.warn(\n 'Select2: Data can no longer be set using `select2(\"data\")`. You should consider setting the value instead using `$element.val()`.'\n );\n }\n var data = [];\n this.dataAdapter.current(function(currentData) {\n data = currentData;\n });\n return data;\n };\n Select2.prototype.val = function(args) {\n if (this.options.get(\"debug\") && window.console && console.warn) {\n console.warn(\n 'Select2: The `select2(\"val\")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'\n );\n }\n if (args == null || args.length === 0) {\n return this.$element.val();\n }\n var newVal = args[0];\n if (Array.isArray(newVal)) {\n newVal = newVal.map(function(obj) {\n return obj.toString();\n });\n }\n this.$element.val(newVal).trigger(\"input\").trigger(\"change\");\n };\n Select2.prototype.destroy = function() {\n Utils.RemoveData(this.$container[0]);\n this.$container.remove();\n this._observer.disconnect();\n this._observer = null;\n this._syncA = null;\n this._syncS = null;\n this.$element.off(\".select2\");\n this.$element.attr(\n \"tabindex\",\n Utils.GetData(this.$element[0], \"old-tabindex\")\n );\n this.$element[0].classList.remove(\"select2-hidden-accessible\");\n this.$element.attr(\"aria-hidden\", \"false\");\n Utils.RemoveData(this.$element[0]);\n this.$element.removeData(\"select2\");\n this.dataAdapter.destroy();\n this.selection.destroy();\n this.dropdown.destroy();\n this.results.destroy();\n this.dataAdapter = null;\n this.selection = null;\n this.dropdown = null;\n this.results = null;\n };\n Select2.prototype.render = function() {\n var $container = $2(\n ''\n );\n $container.attr(\"dir\", this.options.get(\"dir\"));\n this.$container = $container;\n this.$container[0].classList.add(\"select2-container--\" + this.options.get(\"theme\"));\n Utils.StoreData($container[0], \"element\", this.$element);\n return $container;\n };\n return Select2;\n });\n S22.define(\"jquery-mousewheel\", [\n \"jquery\"\n ], function($2) {\n return $2;\n });\n S22.define(\"jquery.select2\", [\n \"jquery\",\n \"jquery-mousewheel\",\n \"./select2/core\",\n \"./select2/defaults\",\n \"./select2/utils\"\n ], function($2, _, Select2, Defaults, Utils) {\n if ($2.fn.select2 == null) {\n var thisMethods = [\"open\", \"close\", \"destroy\"];\n $2.fn.select2 = function(options) {\n options = options || {};\n if (typeof options === \"object\") {\n this.each(function() {\n var instanceOptions = $2.extend(true, {}, options);\n var instance = new Select2($2(this), instanceOptions);\n });\n return this;\n } else if (typeof options === \"string\") {\n var ret;\n var args = Array.prototype.slice.call(arguments, 1);\n this.each(function() {\n var instance = Utils.GetData(this, \"select2\");\n if (instance == null && window.console && console.error) {\n console.error(\n \"The select2('\" + options + \"') method was called on an element that is not using Select2.\"\n );\n }\n ret = instance[options].apply(instance, args);\n });\n if (thisMethods.indexOf(options) > -1) {\n return this;\n }\n return ret;\n } else {\n throw new Error(\"Invalid arguments for Select2: \" + options);\n }\n };\n }\n if ($2.fn.select2.defaults == null) {\n $2.fn.select2.defaults = Defaults;\n }\n return Select2;\n });\n return {\n define: S22.define,\n require: S22.require\n };\n }();\n var select2 = S2.require(\"jquery.select2\");\n jQuery2.fn.select2.amd = S2;\n return select2;\n});\n","import OrderedMap from \"orderedmap\";\nfunction findDiffStart(a, b, pos) {\n for (let i = 0; ; i++) {\n if (i == a.childCount || i == b.childCount)\n return a.childCount == b.childCount ? null : pos;\n let childA = a.child(i), childB = b.child(i);\n if (childA == childB) {\n pos += childA.nodeSize;\n continue;\n }\n if (!childA.sameMarkup(childB))\n return pos;\n if (childA.isText && childA.text != childB.text) {\n for (let j = 0; childA.text[j] == childB.text[j]; j++)\n pos++;\n return pos;\n }\n if (childA.content.size || childB.content.size) {\n let inner = findDiffStart(childA.content, childB.content, pos + 1);\n if (inner != null)\n return inner;\n }\n pos += childA.nodeSize;\n }\n}\nfunction findDiffEnd(a, b, posA, posB) {\n for (let iA = a.childCount, iB = b.childCount; ; ) {\n if (iA == 0 || iB == 0)\n return iA == iB ? null : { a: posA, b: posB };\n let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n if (childA == childB) {\n posA -= size;\n posB -= size;\n continue;\n }\n if (!childA.sameMarkup(childB))\n return { a: posA, b: posB };\n if (childA.isText && childA.text != childB.text) {\n let same = 0, minSize = Math.min(childA.text.length, childB.text.length);\n while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) {\n same++;\n posA--;\n posB--;\n }\n return { a: posA, b: posB };\n }\n if (childA.content.size || childB.content.size) {\n let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n if (inner)\n return inner;\n }\n posA -= size;\n posB -= size;\n }\n}\nclass Fragment {\n /**\n @internal\n */\n constructor(content, size) {\n this.content = content;\n this.size = size || 0;\n if (size == null)\n for (let i = 0; i < content.length; i++)\n this.size += content[i].nodeSize;\n }\n /**\n Invoke a callback for all descendant nodes between the given two\n positions (relative to start of this fragment). Doesn't descend\n into a node when the callback returns `false`.\n */\n nodesBetween(from, to, f, nodeStart = 0, parent) {\n for (let i = 0, pos = 0; pos < to; i++) {\n let child = this.content[i], end = pos + child.nodeSize;\n if (end > from && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) {\n let start = pos + 1;\n child.nodesBetween(Math.max(0, from - start), Math.min(child.content.size, to - start), f, nodeStart + start);\n }\n pos = end;\n }\n }\n /**\n Call the given callback for every descendant node. `pos` will be\n relative to the start of the fragment. The callback may return\n `false` to prevent traversal of a given node's children.\n */\n descendants(f) {\n this.nodesBetween(0, this.size, f);\n }\n /**\n Extract the text between `from` and `to`. See the same method on\n [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween).\n */\n textBetween(from, to, blockSeparator, leafText) {\n let text = \"\", first = true;\n this.nodesBetween(from, to, (node, pos) => {\n let nodeText = node.isText ? node.text.slice(Math.max(from, pos) - pos, to - pos) : !node.isLeaf ? \"\" : leafText ? typeof leafText === \"function\" ? leafText(node) : leafText : node.type.spec.leafText ? node.type.spec.leafText(node) : \"\";\n if (node.isBlock && (node.isLeaf && nodeText || node.isTextblock) && blockSeparator) {\n if (first)\n first = false;\n else\n text += blockSeparator;\n }\n text += nodeText;\n }, 0);\n return text;\n }\n /**\n Create a new fragment containing the combined content of this\n fragment and the other.\n */\n append(other) {\n if (!other.size)\n return this;\n if (!this.size)\n return other;\n let last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n if (last.isText && last.sameMarkup(first)) {\n content[content.length - 1] = last.withText(last.text + first.text);\n i = 1;\n }\n for (; i < other.content.length; i++)\n content.push(other.content[i]);\n return new Fragment(content, this.size + other.size);\n }\n /**\n Cut out the sub-fragment between the two given positions.\n */\n cut(from, to = this.size) {\n if (from == 0 && to == this.size)\n return this;\n let result = [], size = 0;\n if (to > from)\n for (let i = 0, pos = 0; pos < to; i++) {\n let child = this.content[i], end = pos + child.nodeSize;\n if (end > from) {\n if (pos < from || end > to) {\n if (child.isText)\n child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos));\n else\n child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1));\n }\n result.push(child);\n size += child.nodeSize;\n }\n pos = end;\n }\n return new Fragment(result, size);\n }\n /**\n @internal\n */\n cutByIndex(from, to) {\n if (from == to)\n return Fragment.empty;\n if (from == 0 && to == this.content.length)\n return this;\n return new Fragment(this.content.slice(from, to));\n }\n /**\n Create a new fragment in which the node at the given index is\n replaced by the given node.\n */\n replaceChild(index, node) {\n let current = this.content[index];\n if (current == node)\n return this;\n let copy2 = this.content.slice();\n let size = this.size + node.nodeSize - current.nodeSize;\n copy2[index] = node;\n return new Fragment(copy2, size);\n }\n /**\n Create a new fragment by prepending the given node to this\n fragment.\n */\n addToStart(node) {\n return new Fragment([node].concat(this.content), this.size + node.nodeSize);\n }\n /**\n Create a new fragment by appending the given node to this\n fragment.\n */\n addToEnd(node) {\n return new Fragment(this.content.concat(node), this.size + node.nodeSize);\n }\n /**\n Compare this fragment to another one.\n */\n eq(other) {\n if (this.content.length != other.content.length)\n return false;\n for (let i = 0; i < this.content.length; i++)\n if (!this.content[i].eq(other.content[i]))\n return false;\n return true;\n }\n /**\n The first child of the fragment, or `null` if it is empty.\n */\n get firstChild() {\n return this.content.length ? this.content[0] : null;\n }\n /**\n The last child of the fragment, or `null` if it is empty.\n */\n get lastChild() {\n return this.content.length ? this.content[this.content.length - 1] : null;\n }\n /**\n The number of child nodes in this fragment.\n */\n get childCount() {\n return this.content.length;\n }\n /**\n Get the child node at the given index. Raise an error when the\n index is out of range.\n */\n child(index) {\n let found2 = this.content[index];\n if (!found2)\n throw new RangeError(\"Index \" + index + \" out of range for \" + this);\n return found2;\n }\n /**\n Get the child node at the given index, if it exists.\n */\n maybeChild(index) {\n return this.content[index] || null;\n }\n /**\n Call `f` for every child node, passing the node, its offset\n into this parent node, and its index.\n */\n forEach(f) {\n for (let i = 0, p = 0; i < this.content.length; i++) {\n let child = this.content[i];\n f(child, p, i);\n p += child.nodeSize;\n }\n }\n /**\n Find the first position at which this fragment and another\n fragment differ, or `null` if they are the same.\n */\n findDiffStart(other, pos = 0) {\n return findDiffStart(this, other, pos);\n }\n /**\n Find the first position, searching from the end, at which this\n fragment and the given fragment differ, or `null` if they are\n the same. Since this position will not be the same in both\n nodes, an object with two separate positions is returned.\n */\n findDiffEnd(other, pos = this.size, otherPos = other.size) {\n return findDiffEnd(this, other, pos, otherPos);\n }\n /**\n Find the index and inner offset corresponding to a given relative\n position in this fragment. The result object will be reused\n (overwritten) the next time the function is called. (Not public.)\n */\n findIndex(pos, round = -1) {\n if (pos == 0)\n return retIndex(0, pos);\n if (pos == this.size)\n return retIndex(this.content.length, pos);\n if (pos > this.size || pos < 0)\n throw new RangeError(`Position ${pos} outside of fragment (${this})`);\n for (let i = 0, curPos = 0; ; i++) {\n let cur = this.child(i), end = curPos + cur.nodeSize;\n if (end >= pos) {\n if (end == pos || round > 0)\n return retIndex(i + 1, end);\n return retIndex(i, curPos);\n }\n curPos = end;\n }\n }\n /**\n Return a debugging string that describes this fragment.\n */\n toString() {\n return \"<\" + this.toStringInner() + \">\";\n }\n /**\n @internal\n */\n toStringInner() {\n return this.content.join(\", \");\n }\n /**\n Create a JSON-serializeable representation of this fragment.\n */\n toJSON() {\n return this.content.length ? this.content.map((n) => n.toJSON()) : null;\n }\n /**\n Deserialize a fragment from its JSON representation.\n */\n static fromJSON(schema, value) {\n if (!value)\n return Fragment.empty;\n if (!Array.isArray(value))\n throw new RangeError(\"Invalid input for Fragment.fromJSON\");\n return new Fragment(value.map(schema.nodeFromJSON));\n }\n /**\n Build a fragment from an array of nodes. Ensures that adjacent\n text nodes with the same marks are joined together.\n */\n static fromArray(array) {\n if (!array.length)\n return Fragment.empty;\n let joined, size = 0;\n for (let i = 0; i < array.length; i++) {\n let node = array[i];\n size += node.nodeSize;\n if (i && node.isText && array[i - 1].sameMarkup(node)) {\n if (!joined)\n joined = array.slice(0, i);\n joined[joined.length - 1] = node.withText(joined[joined.length - 1].text + node.text);\n } else if (joined) {\n joined.push(node);\n }\n }\n return new Fragment(joined || array, size);\n }\n /**\n Create a fragment from something that can be interpreted as a\n set of nodes. For `null`, it returns the empty fragment. For a\n fragment, the fragment itself. For a node or array of nodes, a\n fragment containing those nodes.\n */\n static from(nodes) {\n if (!nodes)\n return Fragment.empty;\n if (nodes instanceof Fragment)\n return nodes;\n if (Array.isArray(nodes))\n return this.fromArray(nodes);\n if (nodes.attrs)\n return new Fragment([nodes], nodes.nodeSize);\n throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" + (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"));\n }\n}\nFragment.empty = new Fragment([], 0);\nconst found = { index: 0, offset: 0 };\nfunction retIndex(index, offset) {\n found.index = index;\n found.offset = offset;\n return found;\n}\nfunction compareDeep(a, b) {\n if (a === b)\n return true;\n if (!(a && typeof a == \"object\") || !(b && typeof b == \"object\"))\n return false;\n let array = Array.isArray(a);\n if (Array.isArray(b) != array)\n return false;\n if (array) {\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!compareDeep(a[i], b[i]))\n return false;\n } else {\n for (let p in a)\n if (!(p in b) || !compareDeep(a[p], b[p]))\n return false;\n for (let p in b)\n if (!(p in a))\n return false;\n }\n return true;\n}\nclass Mark {\n /**\n @internal\n */\n constructor(type, attrs) {\n this.type = type;\n this.attrs = attrs;\n }\n /**\n Given a set of marks, create a new set which contains this one as\n well, in the right position. If this mark is already in the set,\n the set itself is returned. If any marks that are set to be\n [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present,\n those are replaced by this one.\n */\n addToSet(set) {\n let copy2, placed = false;\n for (let i = 0; i < set.length; i++) {\n let other = set[i];\n if (this.eq(other))\n return set;\n if (this.type.excludes(other.type)) {\n if (!copy2)\n copy2 = set.slice(0, i);\n } else if (other.type.excludes(this.type)) {\n return set;\n } else {\n if (!placed && other.type.rank > this.type.rank) {\n if (!copy2)\n copy2 = set.slice(0, i);\n copy2.push(this);\n placed = true;\n }\n if (copy2)\n copy2.push(other);\n }\n }\n if (!copy2)\n copy2 = set.slice();\n if (!placed)\n copy2.push(this);\n return copy2;\n }\n /**\n Remove this mark from the given set, returning a new set. If this\n mark is not in the set, the set itself is returned.\n */\n removeFromSet(set) {\n for (let i = 0; i < set.length; i++)\n if (this.eq(set[i]))\n return set.slice(0, i).concat(set.slice(i + 1));\n return set;\n }\n /**\n Test whether this mark is in the given set of marks.\n */\n isInSet(set) {\n for (let i = 0; i < set.length; i++)\n if (this.eq(set[i]))\n return true;\n return false;\n }\n /**\n Test whether this mark has the same type and attributes as\n another mark.\n */\n eq(other) {\n return this == other || this.type == other.type && compareDeep(this.attrs, other.attrs);\n }\n /**\n Convert this mark to a JSON-serializeable representation.\n */\n toJSON() {\n let obj = { type: this.type.name };\n for (let _ in this.attrs) {\n obj.attrs = this.attrs;\n break;\n }\n return obj;\n }\n /**\n Deserialize a mark from JSON.\n */\n static fromJSON(schema, json) {\n if (!json)\n throw new RangeError(\"Invalid input for Mark.fromJSON\");\n let type = schema.marks[json.type];\n if (!type)\n throw new RangeError(`There is no mark type ${json.type} in this schema`);\n return type.create(json.attrs);\n }\n /**\n Test whether two sets of marks are identical.\n */\n static sameSet(a, b) {\n if (a == b)\n return true;\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!a[i].eq(b[i]))\n return false;\n return true;\n }\n /**\n Create a properly sorted mark set from null, a single mark, or an\n unsorted array of marks.\n */\n static setFrom(marks) {\n if (!marks || Array.isArray(marks) && marks.length == 0)\n return Mark.none;\n if (marks instanceof Mark)\n return [marks];\n let copy2 = marks.slice();\n copy2.sort((a, b) => a.type.rank - b.type.rank);\n return copy2;\n }\n}\nMark.none = [];\nclass ReplaceError extends Error {\n}\nclass Slice {\n /**\n Create a slice. When specifying a non-zero open depth, you must\n make sure that there are nodes of at least that depth at the\n appropriate side of the fragment—i.e. if the fragment is an\n empty paragraph node, `openStart` and `openEnd` can't be greater\n than 1.\n \n It is not necessary for the content of open nodes to conform to\n the schema's content constraints, though it should be a valid\n start/end/middle for such a node, depending on which sides are\n open.\n */\n constructor(content, openStart, openEnd) {\n this.content = content;\n this.openStart = openStart;\n this.openEnd = openEnd;\n }\n /**\n The size this slice would add when inserted into a document.\n */\n get size() {\n return this.content.size - this.openStart - this.openEnd;\n }\n /**\n @internal\n */\n insertAt(pos, fragment) {\n let content = insertInto(this.content, pos + this.openStart, fragment);\n return content && new Slice(content, this.openStart, this.openEnd);\n }\n /**\n @internal\n */\n removeBetween(from, to) {\n return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd);\n }\n /**\n Tests whether this slice is equal to another slice.\n */\n eq(other) {\n return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd;\n }\n /**\n @internal\n */\n toString() {\n return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\";\n }\n /**\n Convert a slice to a JSON-serializable representation.\n */\n toJSON() {\n if (!this.content.size)\n return null;\n let json = { content: this.content.toJSON() };\n if (this.openStart > 0)\n json.openStart = this.openStart;\n if (this.openEnd > 0)\n json.openEnd = this.openEnd;\n return json;\n }\n /**\n Deserialize a slice from its JSON representation.\n */\n static fromJSON(schema, json) {\n if (!json)\n return Slice.empty;\n let openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n throw new RangeError(\"Invalid input for Slice.fromJSON\");\n return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd);\n }\n /**\n Create a slice from a fragment by taking the maximum possible\n open value on both side of the fragment.\n */\n static maxOpen(fragment, openIsolating = true) {\n let openStart = 0, openEnd = 0;\n for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild)\n openStart++;\n for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild)\n openEnd++;\n return new Slice(fragment, openStart, openEnd);\n }\n}\nSlice.empty = new Slice(Fragment.empty, 0, 0);\nfunction removeRange(content, from, to) {\n let { index, offset } = content.findIndex(from), child = content.maybeChild(index);\n let { index: indexTo, offset: offsetTo } = content.findIndex(to);\n if (offset == from || child.isText) {\n if (offsetTo != to && !content.child(indexTo).isText)\n throw new RangeError(\"Removing non-flat range\");\n return content.cut(0, from).append(content.cut(to));\n }\n if (index != indexTo)\n throw new RangeError(\"Removing non-flat range\");\n return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)));\n}\nfunction insertInto(content, dist, insert, parent) {\n let { index, offset } = content.findIndex(dist), child = content.maybeChild(index);\n if (offset == dist || child.isText) {\n if (parent && !parent.canReplace(index, index, insert))\n return null;\n return content.cut(0, dist).append(insert).append(content.cut(dist));\n }\n let inner = insertInto(child.content, dist - offset - 1, insert);\n return inner && content.replaceChild(index, child.copy(inner));\n}\nfunction replace($from, $to, slice) {\n if (slice.openStart > $from.depth)\n throw new ReplaceError(\"Inserted content deeper than insertion position\");\n if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n throw new ReplaceError(\"Inconsistent open depths\");\n return replaceOuter($from, $to, slice, 0);\n}\nfunction replaceOuter($from, $to, slice, depth) {\n let index = $from.index(depth), node = $from.node(depth);\n if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n let inner = replaceOuter($from, $to, slice, depth + 1);\n return node.copy(node.content.replaceChild(index, inner));\n } else if (!slice.content.size) {\n return close(node, replaceTwoWay($from, $to, depth));\n } else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) {\n let parent = $from.parent, content = parent.content;\n return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)));\n } else {\n let { start, end } = prepareSliceForReplace(slice, $from);\n return close(node, replaceThreeWay($from, start, end, $to, depth));\n }\n}\nfunction checkJoin(main, sub) {\n if (!sub.type.compatibleContent(main.type))\n throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name);\n}\nfunction joinable($before, $after, depth) {\n let node = $before.node(depth);\n checkJoin(node, $after.node(depth));\n return node;\n}\nfunction addNode(child, target) {\n let last = target.length - 1;\n if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n target[last] = child.withText(target[last].text + child.text);\n else\n target.push(child);\n}\nfunction addRange($start, $end, depth, target) {\n let node = ($end || $start).node(depth);\n let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n if ($start) {\n startIndex = $start.index(depth);\n if ($start.depth > depth) {\n startIndex++;\n } else if ($start.textOffset) {\n addNode($start.nodeAfter, target);\n startIndex++;\n }\n }\n for (let i = startIndex; i < endIndex; i++)\n addNode(node.child(i), target);\n if ($end && $end.depth == depth && $end.textOffset)\n addNode($end.nodeBefore, target);\n}\nfunction close(node, content) {\n node.type.checkContent(content);\n return node.copy(content);\n}\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n let openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n let openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n let content = [];\n addRange(null, $from, depth, content);\n if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n checkJoin(openStart, openEnd);\n addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n } else {\n if (openStart)\n addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content);\n addRange($start, $end, depth, content);\n if (openEnd)\n addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content);\n}\nfunction replaceTwoWay($from, $to, depth) {\n let content = [];\n addRange(null, $from, depth, content);\n if ($from.depth > depth) {\n let type = joinable($from, $to, depth + 1);\n addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content);\n}\nfunction prepareSliceForReplace(slice, $along) {\n let extra = $along.depth - slice.openStart, parent = $along.node(extra);\n let node = parent.copy(slice.content);\n for (let i = extra - 1; i >= 0; i--)\n node = $along.node(i).copy(Fragment.from(node));\n return {\n start: node.resolveNoCache(slice.openStart + extra),\n end: node.resolveNoCache(node.content.size - slice.openEnd - extra)\n };\n}\nclass ResolvedPos {\n /**\n @internal\n */\n constructor(pos, path, parentOffset) {\n this.pos = pos;\n this.path = path;\n this.parentOffset = parentOffset;\n this.depth = path.length / 3 - 1;\n }\n /**\n @internal\n */\n resolveDepth(val) {\n if (val == null)\n return this.depth;\n if (val < 0)\n return this.depth + val;\n return val;\n }\n /**\n The parent node that the position points into. Note that even if\n a position points into a text node, that node is not considered\n the parent—text nodes are ‘flat’ in this model, and have no content.\n */\n get parent() {\n return this.node(this.depth);\n }\n /**\n The root node in which the position was resolved.\n */\n get doc() {\n return this.node(0);\n }\n /**\n The ancestor node at the given level. `p.node(p.depth)` is the\n same as `p.parent`.\n */\n node(depth) {\n return this.path[this.resolveDepth(depth) * 3];\n }\n /**\n The index into the ancestor at the given level. If this points\n at the 3rd node in the 2nd paragraph on the top level, for\n example, `p.index(0)` is 1 and `p.index(1)` is 2.\n */\n index(depth) {\n return this.path[this.resolveDepth(depth) * 3 + 1];\n }\n /**\n The index pointing after this position into the ancestor at the\n given level.\n */\n indexAfter(depth) {\n depth = this.resolveDepth(depth);\n return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1);\n }\n /**\n The (absolute) position at the start of the node at the given\n level.\n */\n start(depth) {\n depth = this.resolveDepth(depth);\n return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n }\n /**\n The (absolute) position at the end of the node at the given\n level.\n */\n end(depth) {\n depth = this.resolveDepth(depth);\n return this.start(depth) + this.node(depth).content.size;\n }\n /**\n The (absolute) position directly before the wrapping node at the\n given level, or, when `depth` is `this.depth + 1`, the original\n position.\n */\n before(depth) {\n depth = this.resolveDepth(depth);\n if (!depth)\n throw new RangeError(\"There is no position before the top-level node\");\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1];\n }\n /**\n The (absolute) position directly after the wrapping node at the\n given level, or the original position when `depth` is `this.depth + 1`.\n */\n after(depth) {\n depth = this.resolveDepth(depth);\n if (!depth)\n throw new RangeError(\"There is no position after the top-level node\");\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize;\n }\n /**\n When this position points into a text node, this returns the\n distance between the position and the start of the text node.\n Will be zero for positions that point between nodes.\n */\n get textOffset() {\n return this.pos - this.path[this.path.length - 1];\n }\n /**\n Get the node directly after the position, if any. If the position\n points into a text node, only the part of that node after the\n position is returned.\n */\n get nodeAfter() {\n let parent = this.parent, index = this.index(this.depth);\n if (index == parent.childCount)\n return null;\n let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n return dOff ? parent.child(index).cut(dOff) : child;\n }\n /**\n Get the node directly before the position, if any. If the\n position points into a text node, only the part of that node\n before the position is returned.\n */\n get nodeBefore() {\n let index = this.index(this.depth);\n let dOff = this.pos - this.path[this.path.length - 1];\n if (dOff)\n return this.parent.child(index).cut(0, dOff);\n return index == 0 ? null : this.parent.child(index - 1);\n }\n /**\n Get the position at the given index in the parent node at the\n given depth (which defaults to `this.depth`).\n */\n posAtIndex(index, depth) {\n depth = this.resolveDepth(depth);\n let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n for (let i = 0; i < index; i++)\n pos += node.child(i).nodeSize;\n return pos;\n }\n /**\n Get the marks at this position, factoring in the surrounding\n marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the\n position is at the start of a non-empty node, the marks of the\n node after it (if any) are returned.\n */\n marks() {\n let parent = this.parent, index = this.index();\n if (parent.content.size == 0)\n return Mark.none;\n if (this.textOffset)\n return parent.child(index).marks;\n let main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n if (!main) {\n let tmp = main;\n main = other;\n other = tmp;\n }\n let marks = main.marks;\n for (var i = 0; i < marks.length; i++)\n if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n marks = marks[i--].removeFromSet(marks);\n return marks;\n }\n /**\n Get the marks after the current position, if any, except those\n that are non-inclusive and not present at position `$end`. This\n is mostly useful for getting the set of marks to preserve after a\n deletion. Will return `null` if this position is at the end of\n its parent node or its parent node isn't a textblock (in which\n case no marks should be preserved).\n */\n marksAcross($end) {\n let after = this.parent.maybeChild(this.index());\n if (!after || !after.isInline)\n return null;\n let marks = after.marks, next = $end.parent.maybeChild($end.index());\n for (var i = 0; i < marks.length; i++)\n if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n marks = marks[i--].removeFromSet(marks);\n return marks;\n }\n /**\n The depth up to which this position and the given (non-resolved)\n position share the same parent nodes.\n */\n sharedDepth(pos) {\n for (let depth = this.depth; depth > 0; depth--)\n if (this.start(depth) <= pos && this.end(depth) >= pos)\n return depth;\n return 0;\n }\n /**\n Returns a range based on the place where this position and the\n given position diverge around block content. If both point into\n the same textblock, for example, a range around that textblock\n will be returned. If they point into different blocks, the range\n around those blocks in their shared ancestor is returned. You can\n pass in an optional predicate that will be called with a parent\n node to see if a range into that parent is acceptable.\n */\n blockRange(other = this, pred) {\n if (other.pos < this.pos)\n return other.blockRange(this);\n for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n return new NodeRange(this, other, d);\n return null;\n }\n /**\n Query whether the given position shares the same parent node.\n */\n sameParent(other) {\n return this.pos - this.parentOffset == other.pos - other.parentOffset;\n }\n /**\n Return the greater of this and the given position.\n */\n max(other) {\n return other.pos > this.pos ? other : this;\n }\n /**\n Return the smaller of this and the given position.\n */\n min(other) {\n return other.pos < this.pos ? other : this;\n }\n /**\n @internal\n */\n toString() {\n let str = \"\";\n for (let i = 1; i <= this.depth; i++)\n str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1);\n return str + \":\" + this.parentOffset;\n }\n /**\n @internal\n */\n static resolve(doc2, pos) {\n if (!(pos >= 0 && pos <= doc2.content.size))\n throw new RangeError(\"Position \" + pos + \" out of range\");\n let path = [];\n let start = 0, parentOffset = pos;\n for (let node = doc2; ; ) {\n let { index, offset } = node.content.findIndex(parentOffset);\n let rem = parentOffset - offset;\n path.push(node, index, start + offset);\n if (!rem)\n break;\n node = node.child(index);\n if (node.isText)\n break;\n parentOffset = rem - 1;\n start += offset + 1;\n }\n return new ResolvedPos(pos, path, parentOffset);\n }\n /**\n @internal\n */\n static resolveCached(doc2, pos) {\n for (let i = 0; i < resolveCache.length; i++) {\n let cached = resolveCache[i];\n if (cached.pos == pos && cached.doc == doc2)\n return cached;\n }\n let result = resolveCache[resolveCachePos] = ResolvedPos.resolve(doc2, pos);\n resolveCachePos = (resolveCachePos + 1) % resolveCacheSize;\n return result;\n }\n}\nlet resolveCache = [], resolveCachePos = 0, resolveCacheSize = 12;\nclass NodeRange {\n /**\n Construct a node range. `$from` and `$to` should point into the\n same node until at least the given `depth`, since a node range\n denotes an adjacent set of nodes in a single parent node.\n */\n constructor($from, $to, depth) {\n this.$from = $from;\n this.$to = $to;\n this.depth = depth;\n }\n /**\n The position at the start of the range.\n */\n get start() {\n return this.$from.before(this.depth + 1);\n }\n /**\n The position at the end of the range.\n */\n get end() {\n return this.$to.after(this.depth + 1);\n }\n /**\n The parent node that the range points into.\n */\n get parent() {\n return this.$from.node(this.depth);\n }\n /**\n The start index of the range in the parent node.\n */\n get startIndex() {\n return this.$from.index(this.depth);\n }\n /**\n The end index of the range in the parent node.\n */\n get endIndex() {\n return this.$to.indexAfter(this.depth);\n }\n}\nconst emptyAttrs = /* @__PURE__ */ Object.create(null);\nclass Node {\n /**\n @internal\n */\n constructor(type, attrs, content, marks = Mark.none) {\n this.type = type;\n this.attrs = attrs;\n this.marks = marks;\n this.content = content || Fragment.empty;\n }\n /**\n The size of this node, as defined by the integer-based [indexing\n scheme](/docs/guide/#doc.indexing). For text nodes, this is the\n amount of characters. For other leaf nodes, it is one. For\n non-leaf nodes, it is the size of the content plus two (the\n start and end token).\n */\n get nodeSize() {\n return this.isLeaf ? 1 : 2 + this.content.size;\n }\n /**\n The number of children that the node has.\n */\n get childCount() {\n return this.content.childCount;\n }\n /**\n Get the child node at the given index. Raises an error when the\n index is out of range.\n */\n child(index) {\n return this.content.child(index);\n }\n /**\n Get the child node at the given index, if it exists.\n */\n maybeChild(index) {\n return this.content.maybeChild(index);\n }\n /**\n Call `f` for every child node, passing the node, its offset\n into this parent node, and its index.\n */\n forEach(f) {\n this.content.forEach(f);\n }\n /**\n Invoke a callback for all descendant nodes recursively between\n the given two positions that are relative to start of this\n node's content. The callback is invoked with the node, its\n position relative to the original node (method receiver),\n its parent node, and its child index. When the callback returns\n false for a given node, that node's children will not be\n recursed over. The last parameter can be used to specify a\n starting position to count from.\n */\n nodesBetween(from, to, f, startPos = 0) {\n this.content.nodesBetween(from, to, f, startPos, this);\n }\n /**\n Call the given callback for every descendant node. Doesn't\n descend into a node when the callback returns `false`.\n */\n descendants(f) {\n this.nodesBetween(0, this.content.size, f);\n }\n /**\n Concatenates all the text nodes found in this fragment and its\n children.\n */\n get textContent() {\n return this.isLeaf && this.type.spec.leafText ? this.type.spec.leafText(this) : this.textBetween(0, this.content.size, \"\");\n }\n /**\n Get all text between positions `from` and `to`. When\n `blockSeparator` is given, it will be inserted to separate text\n from different block nodes. If `leafText` is given, it'll be\n inserted for every non-text leaf node encountered, otherwise\n [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec^leafText) will be used.\n */\n textBetween(from, to, blockSeparator, leafText) {\n return this.content.textBetween(from, to, blockSeparator, leafText);\n }\n /**\n Returns this node's first child, or `null` if there are no\n children.\n */\n get firstChild() {\n return this.content.firstChild;\n }\n /**\n Returns this node's last child, or `null` if there are no\n children.\n */\n get lastChild() {\n return this.content.lastChild;\n }\n /**\n Test whether two nodes represent the same piece of document.\n */\n eq(other) {\n return this == other || this.sameMarkup(other) && this.content.eq(other.content);\n }\n /**\n Compare the markup (type, attributes, and marks) of this node to\n those of another. Returns `true` if both have the same markup.\n */\n sameMarkup(other) {\n return this.hasMarkup(other.type, other.attrs, other.marks);\n }\n /**\n Check whether this node's markup correspond to the given type,\n attributes, and marks.\n */\n hasMarkup(type, attrs, marks) {\n return this.type == type && compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) && Mark.sameSet(this.marks, marks || Mark.none);\n }\n /**\n Create a new node with the same markup as this node, containing\n the given content (or empty, if no content is given).\n */\n copy(content = null) {\n if (content == this.content)\n return this;\n return new Node(this.type, this.attrs, content, this.marks);\n }\n /**\n Create a copy of this node, with the given set of marks instead\n of the node's own marks.\n */\n mark(marks) {\n return marks == this.marks ? this : new Node(this.type, this.attrs, this.content, marks);\n }\n /**\n Create a copy of this node with only the content between the\n given positions. If `to` is not given, it defaults to the end of\n the node.\n */\n cut(from, to = this.content.size) {\n if (from == 0 && to == this.content.size)\n return this;\n return this.copy(this.content.cut(from, to));\n }\n /**\n Cut out the part of the document between the given positions, and\n return it as a `Slice` object.\n */\n slice(from, to = this.content.size, includeParents = false) {\n if (from == to)\n return Slice.empty;\n let $from = this.resolve(from), $to = this.resolve(to);\n let depth = includeParents ? 0 : $from.sharedDepth(to);\n let start = $from.start(depth), node = $from.node(depth);\n let content = node.content.cut($from.pos - start, $to.pos - start);\n return new Slice(content, $from.depth - depth, $to.depth - depth);\n }\n /**\n Replace the part of the document between the given positions with\n the given slice. The slice must 'fit', meaning its open sides\n must be able to connect to the surrounding content, and its\n content nodes must be valid children for the node they are placed\n into. If any of this is violated, an error of type\n [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown.\n */\n replace(from, to, slice) {\n return replace(this.resolve(from), this.resolve(to), slice);\n }\n /**\n Find the node directly after the given position.\n */\n nodeAt(pos) {\n for (let node = this; ; ) {\n let { index, offset } = node.content.findIndex(pos);\n node = node.maybeChild(index);\n if (!node)\n return null;\n if (offset == pos || node.isText)\n return node;\n pos -= offset + 1;\n }\n }\n /**\n Find the (direct) child node after the given offset, if any,\n and return it along with its index and offset relative to this\n node.\n */\n childAfter(pos) {\n let { index, offset } = this.content.findIndex(pos);\n return { node: this.content.maybeChild(index), index, offset };\n }\n /**\n Find the (direct) child node before the given offset, if any,\n and return it along with its index and offset relative to this\n node.\n */\n childBefore(pos) {\n if (pos == 0)\n return { node: null, index: 0, offset: 0 };\n let { index, offset } = this.content.findIndex(pos);\n if (offset < pos)\n return { node: this.content.child(index), index, offset };\n let node = this.content.child(index - 1);\n return { node, index: index - 1, offset: offset - node.nodeSize };\n }\n /**\n Resolve the given position in the document, returning an\n [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context.\n */\n resolve(pos) {\n return ResolvedPos.resolveCached(this, pos);\n }\n /**\n @internal\n */\n resolveNoCache(pos) {\n return ResolvedPos.resolve(this, pos);\n }\n /**\n Test whether a given mark or mark type occurs in this document\n between the two given positions.\n */\n rangeHasMark(from, to, type) {\n let found2 = false;\n if (to > from)\n this.nodesBetween(from, to, (node) => {\n if (type.isInSet(node.marks))\n found2 = true;\n return !found2;\n });\n return found2;\n }\n /**\n True when this is a block (non-inline node)\n */\n get isBlock() {\n return this.type.isBlock;\n }\n /**\n True when this is a textblock node, a block node with inline\n content.\n */\n get isTextblock() {\n return this.type.isTextblock;\n }\n /**\n True when this node allows inline content.\n */\n get inlineContent() {\n return this.type.inlineContent;\n }\n /**\n True when this is an inline node (a text node or a node that can\n appear among text).\n */\n get isInline() {\n return this.type.isInline;\n }\n /**\n True when this is a text node.\n */\n get isText() {\n return this.type.isText;\n }\n /**\n True when this is a leaf node.\n */\n get isLeaf() {\n return this.type.isLeaf;\n }\n /**\n True when this is an atom, i.e. when it does not have directly\n editable content. This is usually the same as `isLeaf`, but can\n be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom)\n on a node's spec (typically used when the node is displayed as\n an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)).\n */\n get isAtom() {\n return this.type.isAtom;\n }\n /**\n Return a string representation of this node for debugging\n purposes.\n */\n toString() {\n if (this.type.spec.toDebugString)\n return this.type.spec.toDebugString(this);\n let name = this.type.name;\n if (this.content.size)\n name += \"(\" + this.content.toStringInner() + \")\";\n return wrapMarks(this.marks, name);\n }\n /**\n Get the content match in this node at the given index.\n */\n contentMatchAt(index) {\n let match = this.type.contentMatch.matchFragment(this.content, 0, index);\n if (!match)\n throw new Error(\"Called contentMatchAt on a node with invalid content\");\n return match;\n }\n /**\n Test whether replacing the range between `from` and `to` (by\n child index) with the given replacement fragment (which defaults\n to the empty fragment) would leave the node's content valid. You\n can optionally pass `start` and `end` indices into the\n replacement fragment.\n */\n canReplace(from, to, replacement = Fragment.empty, start = 0, end = replacement.childCount) {\n let one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n let two = one && one.matchFragment(this.content, to);\n if (!two || !two.validEnd)\n return false;\n for (let i = start; i < end; i++)\n if (!this.type.allowsMarks(replacement.child(i).marks))\n return false;\n return true;\n }\n /**\n Test whether replacing the range `from` to `to` (by index) with\n a node of the given type would leave the node's content valid.\n */\n canReplaceWith(from, to, type, marks) {\n if (marks && !this.type.allowsMarks(marks))\n return false;\n let start = this.contentMatchAt(from).matchType(type);\n let end = start && start.matchFragment(this.content, to);\n return end ? end.validEnd : false;\n }\n /**\n Test whether the given node's content could be appended to this\n node. If that node is empty, this will only return true if there\n is at least one node type that can appear in both nodes (to avoid\n merging completely incompatible nodes).\n */\n canAppend(other) {\n if (other.content.size)\n return this.canReplace(this.childCount, this.childCount, other.content);\n else\n return this.type.compatibleContent(other.type);\n }\n /**\n Check whether this node and its descendants conform to the\n schema, and raise error when they do not.\n */\n check() {\n this.type.checkContent(this.content);\n let copy2 = Mark.none;\n for (let i = 0; i < this.marks.length; i++)\n copy2 = this.marks[i].addToSet(copy2);\n if (!Mark.sameSet(copy2, this.marks))\n throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map((m) => m.type.name)}`);\n this.content.forEach((node) => node.check());\n }\n /**\n Return a JSON-serializeable representation of this node.\n */\n toJSON() {\n let obj = { type: this.type.name };\n for (let _ in this.attrs) {\n obj.attrs = this.attrs;\n break;\n }\n if (this.content.size)\n obj.content = this.content.toJSON();\n if (this.marks.length)\n obj.marks = this.marks.map((n) => n.toJSON());\n return obj;\n }\n /**\n Deserialize a node from its JSON representation.\n */\n static fromJSON(schema, json) {\n if (!json)\n throw new RangeError(\"Invalid input for Node.fromJSON\");\n let marks = null;\n if (json.marks) {\n if (!Array.isArray(json.marks))\n throw new RangeError(\"Invalid mark data for Node.fromJSON\");\n marks = json.marks.map(schema.markFromJSON);\n }\n if (json.type == \"text\") {\n if (typeof json.text != \"string\")\n throw new RangeError(\"Invalid text node in JSON\");\n return schema.text(json.text, marks);\n }\n let content = Fragment.fromJSON(schema, json.content);\n return schema.nodeType(json.type).create(json.attrs, content, marks);\n }\n}\nNode.prototype.text = void 0;\nclass TextNode extends Node {\n /**\n @internal\n */\n constructor(type, attrs, content, marks) {\n super(type, attrs, null, marks);\n if (!content)\n throw new RangeError(\"Empty text nodes are not allowed\");\n this.text = content;\n }\n toString() {\n if (this.type.spec.toDebugString)\n return this.type.spec.toDebugString(this);\n return wrapMarks(this.marks, JSON.stringify(this.text));\n }\n get textContent() {\n return this.text;\n }\n textBetween(from, to) {\n return this.text.slice(from, to);\n }\n get nodeSize() {\n return this.text.length;\n }\n mark(marks) {\n return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks);\n }\n withText(text) {\n if (text == this.text)\n return this;\n return new TextNode(this.type, this.attrs, text, this.marks);\n }\n cut(from = 0, to = this.text.length) {\n if (from == 0 && to == this.text.length)\n return this;\n return this.withText(this.text.slice(from, to));\n }\n eq(other) {\n return this.sameMarkup(other) && this.text == other.text;\n }\n toJSON() {\n let base = super.toJSON();\n base.text = this.text;\n return base;\n }\n}\nfunction wrapMarks(marks, str) {\n for (let i = marks.length - 1; i >= 0; i--)\n str = marks[i].type.name + \"(\" + str + \")\";\n return str;\n}\nclass ContentMatch {\n /**\n @internal\n */\n constructor(validEnd) {\n this.validEnd = validEnd;\n this.next = [];\n this.wrapCache = [];\n }\n /**\n @internal\n */\n static parse(string, nodeTypes) {\n let stream = new TokenStream(string, nodeTypes);\n if (stream.next == null)\n return ContentMatch.empty;\n let expr = parseExpr(stream);\n if (stream.next)\n stream.err(\"Unexpected trailing text\");\n let match = dfa(nfa(expr));\n checkForDeadEnds(match, stream);\n return match;\n }\n /**\n Match a node type, returning a match after that node if\n successful.\n */\n matchType(type) {\n for (let i = 0; i < this.next.length; i++)\n if (this.next[i].type == type)\n return this.next[i].next;\n return null;\n }\n /**\n Try to match a fragment. Returns the resulting match when\n successful.\n */\n matchFragment(frag, start = 0, end = frag.childCount) {\n let cur = this;\n for (let i = start; cur && i < end; i++)\n cur = cur.matchType(frag.child(i).type);\n return cur;\n }\n /**\n @internal\n */\n get inlineContent() {\n return this.next.length != 0 && this.next[0].type.isInline;\n }\n /**\n Get the first matching node type at this match position that can\n be generated.\n */\n get defaultType() {\n for (let i = 0; i < this.next.length; i++) {\n let { type } = this.next[i];\n if (!(type.isText || type.hasRequiredAttrs()))\n return type;\n }\n return null;\n }\n /**\n @internal\n */\n compatible(other) {\n for (let i = 0; i < this.next.length; i++)\n for (let j = 0; j < other.next.length; j++)\n if (this.next[i].type == other.next[j].type)\n return true;\n return false;\n }\n /**\n Try to match the given fragment, and if that fails, see if it can\n be made to match by inserting nodes in front of it. When\n successful, return a fragment of inserted nodes (which may be\n empty if nothing had to be inserted). When `toEnd` is true, only\n return a fragment if the resulting match goes to the end of the\n content expression.\n */\n fillBefore(after, toEnd = false, startIndex = 0) {\n let seen = [this];\n function search(match, types) {\n let finished = match.matchFragment(after, startIndex);\n if (finished && (!toEnd || finished.validEnd))\n return Fragment.from(types.map((tp) => tp.createAndFill()));\n for (let i = 0; i < match.next.length; i++) {\n let { type, next } = match.next[i];\n if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n seen.push(next);\n let found2 = search(next, types.concat(type));\n if (found2)\n return found2;\n }\n }\n return null;\n }\n return search(this, []);\n }\n /**\n Find a set of wrapping node types that would allow a node of the\n given type to appear at this position. The result may be empty\n (when it fits directly) and will be null when no such wrapping\n exists.\n */\n findWrapping(target) {\n for (let i = 0; i < this.wrapCache.length; i += 2)\n if (this.wrapCache[i] == target)\n return this.wrapCache[i + 1];\n let computed = this.computeWrapping(target);\n this.wrapCache.push(target, computed);\n return computed;\n }\n /**\n @internal\n */\n computeWrapping(target) {\n let seen = /* @__PURE__ */ Object.create(null), active = [{ match: this, type: null, via: null }];\n while (active.length) {\n let current = active.shift(), match = current.match;\n if (match.matchType(target)) {\n let result = [];\n for (let obj = current; obj.type; obj = obj.via)\n result.push(obj.type);\n return result.reverse();\n }\n for (let i = 0; i < match.next.length; i++) {\n let { type, next } = match.next[i];\n if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) {\n active.push({ match: type.contentMatch, type, via: current });\n seen[type.name] = true;\n }\n }\n }\n return null;\n }\n /**\n The number of outgoing edges this node has in the finite\n automaton that describes the content expression.\n */\n get edgeCount() {\n return this.next.length;\n }\n /**\n Get the _n_​th outgoing edge from this node in the finite\n automaton that describes the content expression.\n */\n edge(n) {\n if (n >= this.next.length)\n throw new RangeError(`There's no ${n}th edge in this content match`);\n return this.next[n];\n }\n /**\n @internal\n */\n toString() {\n let seen = [];\n function scan(m) {\n seen.push(m);\n for (let i = 0; i < m.next.length; i++)\n if (seen.indexOf(m.next[i].next) == -1)\n scan(m.next[i].next);\n }\n scan(this);\n return seen.map((m, i) => {\n let out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n for (let i2 = 0; i2 < m.next.length; i2++)\n out += (i2 ? \", \" : \"\") + m.next[i2].type.name + \"->\" + seen.indexOf(m.next[i2].next);\n return out;\n }).join(\"\\n\");\n }\n}\nContentMatch.empty = new ContentMatch(true);\nclass TokenStream {\n constructor(string, nodeTypes) {\n this.string = string;\n this.nodeTypes = nodeTypes;\n this.inline = null;\n this.pos = 0;\n this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n if (this.tokens[this.tokens.length - 1] == \"\")\n this.tokens.pop();\n if (this.tokens[0] == \"\")\n this.tokens.shift();\n }\n get next() {\n return this.tokens[this.pos];\n }\n eat(tok) {\n return this.next == tok && (this.pos++ || true);\n }\n err(str) {\n throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\");\n }\n}\nfunction parseExpr(stream) {\n let exprs = [];\n do {\n exprs.push(parseExprSeq(stream));\n } while (stream.eat(\"|\"));\n return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n}\nfunction parseExprSeq(stream) {\n let exprs = [];\n do {\n exprs.push(parseExprSubscript(stream));\n } while (stream.next && stream.next != \")\" && stream.next != \"|\");\n return exprs.length == 1 ? exprs[0] : { type: \"seq\", exprs };\n}\nfunction parseExprSubscript(stream) {\n let expr = parseExprAtom(stream);\n for (; ; ) {\n if (stream.eat(\"+\"))\n expr = { type: \"plus\", expr };\n else if (stream.eat(\"*\"))\n expr = { type: \"star\", expr };\n else if (stream.eat(\"?\"))\n expr = { type: \"opt\", expr };\n else if (stream.eat(\"{\"))\n expr = parseExprRange(stream, expr);\n else\n break;\n }\n return expr;\n}\nfunction parseNum(stream) {\n if (/\\D/.test(stream.next))\n stream.err(\"Expected number, got '\" + stream.next + \"'\");\n let result = Number(stream.next);\n stream.pos++;\n return result;\n}\nfunction parseExprRange(stream, expr) {\n let min = parseNum(stream), max = min;\n if (stream.eat(\",\")) {\n if (stream.next != \"}\")\n max = parseNum(stream);\n else\n max = -1;\n }\n if (!stream.eat(\"}\"))\n stream.err(\"Unclosed braced range\");\n return { type: \"range\", min, max, expr };\n}\nfunction resolveName(stream, name) {\n let types = stream.nodeTypes, type = types[name];\n if (type)\n return [type];\n let result = [];\n for (let typeName in types) {\n let type2 = types[typeName];\n if (type2.groups.indexOf(name) > -1)\n result.push(type2);\n }\n if (result.length == 0)\n stream.err(\"No node type or group '\" + name + \"' found\");\n return result;\n}\nfunction parseExprAtom(stream) {\n if (stream.eat(\"(\")) {\n let expr = parseExpr(stream);\n if (!stream.eat(\")\"))\n stream.err(\"Missing closing paren\");\n return expr;\n } else if (!/\\W/.test(stream.next)) {\n let exprs = resolveName(stream, stream.next).map((type) => {\n if (stream.inline == null)\n stream.inline = type.isInline;\n else if (stream.inline != type.isInline)\n stream.err(\"Mixing inline and block content\");\n return { type: \"name\", value: type };\n });\n stream.pos++;\n return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n } else {\n stream.err(\"Unexpected token '\" + stream.next + \"'\");\n }\n}\nfunction nfa(expr) {\n let nfa2 = [[]];\n connect(compile(expr, 0), node());\n return nfa2;\n function node() {\n return nfa2.push([]) - 1;\n }\n function edge(from, to, term) {\n let edge2 = { term, to };\n nfa2[from].push(edge2);\n return edge2;\n }\n function connect(edges, to) {\n edges.forEach((edge2) => edge2.to = to);\n }\n function compile(expr2, from) {\n if (expr2.type == \"choice\") {\n return expr2.exprs.reduce((out, expr3) => out.concat(compile(expr3, from)), []);\n } else if (expr2.type == \"seq\") {\n for (let i = 0; ; i++) {\n let next = compile(expr2.exprs[i], from);\n if (i == expr2.exprs.length - 1)\n return next;\n connect(next, from = node());\n }\n } else if (expr2.type == \"star\") {\n let loop = node();\n edge(from, loop);\n connect(compile(expr2.expr, loop), loop);\n return [edge(loop)];\n } else if (expr2.type == \"plus\") {\n let loop = node();\n connect(compile(expr2.expr, from), loop);\n connect(compile(expr2.expr, loop), loop);\n return [edge(loop)];\n } else if (expr2.type == \"opt\") {\n return [edge(from)].concat(compile(expr2.expr, from));\n } else if (expr2.type == \"range\") {\n let cur = from;\n for (let i = 0; i < expr2.min; i++) {\n let next = node();\n connect(compile(expr2.expr, cur), next);\n cur = next;\n }\n if (expr2.max == -1) {\n connect(compile(expr2.expr, cur), cur);\n } else {\n for (let i = expr2.min; i < expr2.max; i++) {\n let next = node();\n edge(cur, next);\n connect(compile(expr2.expr, cur), next);\n cur = next;\n }\n }\n return [edge(cur)];\n } else if (expr2.type == \"name\") {\n return [edge(from, void 0, expr2.value)];\n } else {\n throw new Error(\"Unknown expr type\");\n }\n }\n}\nfunction cmp(a, b) {\n return b - a;\n}\nfunction nullFrom(nfa2, node) {\n let result = [];\n scan(node);\n return result.sort(cmp);\n function scan(node2) {\n let edges = nfa2[node2];\n if (edges.length == 1 && !edges[0].term)\n return scan(edges[0].to);\n result.push(node2);\n for (let i = 0; i < edges.length; i++) {\n let { term, to } = edges[i];\n if (!term && result.indexOf(to) == -1)\n scan(to);\n }\n }\n}\nfunction dfa(nfa2) {\n let labeled = /* @__PURE__ */ Object.create(null);\n return explore(nullFrom(nfa2, 0));\n function explore(states) {\n let out = [];\n states.forEach((node) => {\n nfa2[node].forEach(({ term, to }) => {\n if (!term)\n return;\n let set;\n for (let i = 0; i < out.length; i++)\n if (out[i][0] == term)\n set = out[i][1];\n nullFrom(nfa2, to).forEach((node2) => {\n if (!set)\n out.push([term, set = []]);\n if (set.indexOf(node2) == -1)\n set.push(node2);\n });\n });\n });\n let state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa2.length - 1) > -1);\n for (let i = 0; i < out.length; i++) {\n let states2 = out[i][1].sort(cmp);\n state.next.push({ type: out[i][0], next: labeled[states2.join(\",\")] || explore(states2) });\n }\n return state;\n }\n}\nfunction checkForDeadEnds(match, stream) {\n for (let i = 0, work = [match]; i < work.length; i++) {\n let state = work[i], dead = !state.validEnd, nodes = [];\n for (let j = 0; j < state.next.length; j++) {\n let { type, next } = state.next[j];\n nodes.push(type.name);\n if (dead && !(type.isText || type.hasRequiredAttrs()))\n dead = false;\n if (work.indexOf(next) == -1)\n work.push(next);\n }\n if (dead)\n stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\");\n }\n}\nfunction defaultAttrs(attrs) {\n let defaults = /* @__PURE__ */ Object.create(null);\n for (let attrName in attrs) {\n let attr = attrs[attrName];\n if (!attr.hasDefault)\n return null;\n defaults[attrName] = attr.default;\n }\n return defaults;\n}\nfunction computeAttrs(attrs, value) {\n let built = /* @__PURE__ */ Object.create(null);\n for (let name in attrs) {\n let given = value && value[name];\n if (given === void 0) {\n let attr = attrs[name];\n if (attr.hasDefault)\n given = attr.default;\n else\n throw new RangeError(\"No value supplied for attribute \" + name);\n }\n built[name] = given;\n }\n return built;\n}\nfunction initAttrs(attrs) {\n let result = /* @__PURE__ */ Object.create(null);\n if (attrs)\n for (let name in attrs)\n result[name] = new Attribute(attrs[name]);\n return result;\n}\nclass NodeType {\n /**\n @internal\n */\n constructor(name, schema, spec) {\n this.name = name;\n this.schema = schema;\n this.spec = spec;\n this.markSet = null;\n this.groups = spec.group ? spec.group.split(\" \") : [];\n this.attrs = initAttrs(spec.attrs);\n this.defaultAttrs = defaultAttrs(this.attrs);\n this.contentMatch = null;\n this.inlineContent = null;\n this.isBlock = !(spec.inline || name == \"text\");\n this.isText = name == \"text\";\n }\n /**\n True if this is an inline type.\n */\n get isInline() {\n return !this.isBlock;\n }\n /**\n True if this is a textblock type, a block that contains inline\n content.\n */\n get isTextblock() {\n return this.isBlock && this.inlineContent;\n }\n /**\n True for node types that allow no content.\n */\n get isLeaf() {\n return this.contentMatch == ContentMatch.empty;\n }\n /**\n True when this node is an atom, i.e. when it does not have\n directly editable content.\n */\n get isAtom() {\n return this.isLeaf || !!this.spec.atom;\n }\n /**\n The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option.\n */\n get whitespace() {\n return this.spec.whitespace || (this.spec.code ? \"pre\" : \"normal\");\n }\n /**\n Tells you whether this node type has any required attributes.\n */\n hasRequiredAttrs() {\n for (let n in this.attrs)\n if (this.attrs[n].isRequired)\n return true;\n return false;\n }\n /**\n Indicates whether this node allows some of the same content as\n the given node type.\n */\n compatibleContent(other) {\n return this == other || this.contentMatch.compatible(other.contentMatch);\n }\n /**\n @internal\n */\n computeAttrs(attrs) {\n if (!attrs && this.defaultAttrs)\n return this.defaultAttrs;\n else\n return computeAttrs(this.attrs, attrs);\n }\n /**\n Create a `Node` of this type. The given attributes are\n checked and defaulted (you can pass `null` to use the type's\n defaults entirely, if no required attributes exist). `content`\n may be a `Fragment`, a node, an array of nodes, or\n `null`. Similarly `marks` may be `null` to default to the empty\n set of marks.\n */\n create(attrs = null, content, marks) {\n if (this.isText)\n throw new Error(\"NodeType.create can't construct text nodes\");\n return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks));\n }\n /**\n Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content\n against the node type's content restrictions, and throw an error\n if it doesn't match.\n */\n createChecked(attrs = null, content, marks) {\n content = Fragment.from(content);\n this.checkContent(content);\n return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks));\n }\n /**\n Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is\n necessary to add nodes to the start or end of the given fragment\n to make it fit the node. If no fitting wrapping can be found,\n return null. Note that, due to the fact that required nodes can\n always be created, this will always succeed if you pass null or\n `Fragment.empty` as content.\n */\n createAndFill(attrs = null, content, marks) {\n attrs = this.computeAttrs(attrs);\n content = Fragment.from(content);\n if (content.size) {\n let before = this.contentMatch.fillBefore(content);\n if (!before)\n return null;\n content = before.append(content);\n }\n let matched = this.contentMatch.matchFragment(content);\n let after = matched && matched.fillBefore(Fragment.empty, true);\n if (!after)\n return null;\n return new Node(this, attrs, content.append(after), Mark.setFrom(marks));\n }\n /**\n Returns true if the given fragment is valid content for this node\n type with the given attributes.\n */\n validContent(content) {\n let result = this.contentMatch.matchFragment(content);\n if (!result || !result.validEnd)\n return false;\n for (let i = 0; i < content.childCount; i++)\n if (!this.allowsMarks(content.child(i).marks))\n return false;\n return true;\n }\n /**\n Throws a RangeError if the given fragment is not valid content for this\n node type.\n @internal\n */\n checkContent(content) {\n if (!this.validContent(content))\n throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`);\n }\n /**\n Check whether the given mark type is allowed in this node.\n */\n allowsMarkType(markType) {\n return this.markSet == null || this.markSet.indexOf(markType) > -1;\n }\n /**\n Test whether the given set of marks are allowed in this node.\n */\n allowsMarks(marks) {\n if (this.markSet == null)\n return true;\n for (let i = 0; i < marks.length; i++)\n if (!this.allowsMarkType(marks[i].type))\n return false;\n return true;\n }\n /**\n Removes the marks that are not allowed in this node from the given set.\n */\n allowedMarks(marks) {\n if (this.markSet == null)\n return marks;\n let copy2;\n for (let i = 0; i < marks.length; i++) {\n if (!this.allowsMarkType(marks[i].type)) {\n if (!copy2)\n copy2 = marks.slice(0, i);\n } else if (copy2) {\n copy2.push(marks[i]);\n }\n }\n return !copy2 ? marks : copy2.length ? copy2 : Mark.none;\n }\n /**\n @internal\n */\n static compile(nodes, schema) {\n let result = /* @__PURE__ */ Object.create(null);\n nodes.forEach((name, spec) => result[name] = new NodeType(name, schema, spec));\n let topType = schema.spec.topNode || \"doc\";\n if (!result[topType])\n throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\");\n if (!result.text)\n throw new RangeError(\"Every schema needs a 'text' type\");\n for (let _ in result.text.attrs)\n throw new RangeError(\"The text node type should not have attributes\");\n return result;\n }\n}\nclass Attribute {\n constructor(options) {\n this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n this.default = options.default;\n }\n get isRequired() {\n return !this.hasDefault;\n }\n}\nclass MarkType {\n /**\n @internal\n */\n constructor(name, rank, schema, spec) {\n this.name = name;\n this.rank = rank;\n this.schema = schema;\n this.spec = spec;\n this.attrs = initAttrs(spec.attrs);\n this.excluded = null;\n let defaults = defaultAttrs(this.attrs);\n this.instance = defaults ? new Mark(this, defaults) : null;\n }\n /**\n Create a mark of this type. `attrs` may be `null` or an object\n containing only some of the mark's attributes. The others, if\n they have defaults, will be added.\n */\n create(attrs = null) {\n if (!attrs && this.instance)\n return this.instance;\n return new Mark(this, computeAttrs(this.attrs, attrs));\n }\n /**\n @internal\n */\n static compile(marks, schema) {\n let result = /* @__PURE__ */ Object.create(null), rank = 0;\n marks.forEach((name, spec) => result[name] = new MarkType(name, rank++, schema, spec));\n return result;\n }\n /**\n When there is a mark of this type in the given set, a new set\n without it is returned. Otherwise, the input set is returned.\n */\n removeFromSet(set) {\n for (var i = 0; i < set.length; i++)\n if (set[i].type == this) {\n set = set.slice(0, i).concat(set.slice(i + 1));\n i--;\n }\n return set;\n }\n /**\n Tests whether there is a mark of this type in the given set.\n */\n isInSet(set) {\n for (let i = 0; i < set.length; i++)\n if (set[i].type == this)\n return set[i];\n }\n /**\n Queries whether a given mark type is\n [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one.\n */\n excludes(other) {\n return this.excluded.indexOf(other) > -1;\n }\n}\nclass Schema {\n /**\n Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec).\n */\n constructor(spec) {\n this.cached = /* @__PURE__ */ Object.create(null);\n let instanceSpec = this.spec = {};\n for (let prop in spec)\n instanceSpec[prop] = spec[prop];\n instanceSpec.nodes = OrderedMap.from(spec.nodes), instanceSpec.marks = OrderedMap.from(spec.marks || {}), this.nodes = NodeType.compile(this.spec.nodes, this);\n this.marks = MarkType.compile(this.spec.marks, this);\n let contentExprCache = /* @__PURE__ */ Object.create(null);\n for (let prop in this.nodes) {\n if (prop in this.marks)\n throw new RangeError(prop + \" can not be both a node and a mark\");\n let type = this.nodes[prop], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n type.contentMatch = contentExprCache[contentExpr] || (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n type.inlineContent = type.contentMatch.inlineContent;\n type.markSet = markExpr == \"_\" ? null : markExpr ? gatherMarks(this, markExpr.split(\" \")) : markExpr == \"\" || !type.inlineContent ? [] : null;\n }\n for (let prop in this.marks) {\n let type = this.marks[prop], excl = type.spec.excludes;\n type.excluded = excl == null ? [type] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n }\n this.nodeFromJSON = this.nodeFromJSON.bind(this);\n this.markFromJSON = this.markFromJSON.bind(this);\n this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n this.cached.wrappings = /* @__PURE__ */ Object.create(null);\n }\n /**\n Create a node in this schema. The `type` may be a string or a\n `NodeType` instance. Attributes will be extended with defaults,\n `content` may be a `Fragment`, `null`, a `Node`, or an array of\n nodes.\n */\n node(type, attrs = null, content, marks) {\n if (typeof type == \"string\")\n type = this.nodeType(type);\n else if (!(type instanceof NodeType))\n throw new RangeError(\"Invalid node type: \" + type);\n else if (type.schema != this)\n throw new RangeError(\"Node type from different schema used (\" + type.name + \")\");\n return type.createChecked(attrs, content, marks);\n }\n /**\n Create a text node in the schema. Empty text nodes are not\n allowed.\n */\n text(text, marks) {\n let type = this.nodes.text;\n return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks));\n }\n /**\n Create a mark with the given type and attributes.\n */\n mark(type, attrs) {\n if (typeof type == \"string\")\n type = this.marks[type];\n return type.create(attrs);\n }\n /**\n Deserialize a node from its JSON representation. This method is\n bound.\n */\n nodeFromJSON(json) {\n return Node.fromJSON(this, json);\n }\n /**\n Deserialize a mark from its JSON representation. This method is\n bound.\n */\n markFromJSON(json) {\n return Mark.fromJSON(this, json);\n }\n /**\n @internal\n */\n nodeType(name) {\n let found2 = this.nodes[name];\n if (!found2)\n throw new RangeError(\"Unknown node type: \" + name);\n return found2;\n }\n}\nfunction gatherMarks(schema, marks) {\n let found2 = [];\n for (let i = 0; i < marks.length; i++) {\n let name = marks[i], mark = schema.marks[name], ok = mark;\n if (mark) {\n found2.push(mark);\n } else {\n for (let prop in schema.marks) {\n let mark2 = schema.marks[prop];\n if (name == \"_\" || mark2.spec.group && mark2.spec.group.split(\" \").indexOf(name) > -1)\n found2.push(ok = mark2);\n }\n }\n if (!ok)\n throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\");\n }\n return found2;\n}\nclass DOMParser {\n /**\n Create a parser that targets the given schema, using the given\n parsing rules.\n */\n constructor(schema, rules) {\n this.schema = schema;\n this.rules = rules;\n this.tags = [];\n this.styles = [];\n rules.forEach((rule) => {\n if (rule.tag)\n this.tags.push(rule);\n else if (rule.style)\n this.styles.push(rule);\n });\n this.normalizeLists = !this.tags.some((r) => {\n if (!/^(ul|ol)\\b/.test(r.tag) || !r.node)\n return false;\n let node = schema.nodes[r.node];\n return node.contentMatch.matchType(node);\n });\n }\n /**\n Parse a document from the content of a DOM node.\n */\n parse(dom, options = {}) {\n let context = new ParseContext(this, options, false);\n context.addAll(dom, options.from, options.to);\n return context.finish();\n }\n /**\n Parses the content of the given DOM node, like\n [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of\n options. But unlike that method, which produces a whole node,\n this one returns a slice that is open at the sides, meaning that\n the schema constraints aren't applied to the start of nodes to\n the left of the input and the end of nodes at the end.\n */\n parseSlice(dom, options = {}) {\n let context = new ParseContext(this, options, true);\n context.addAll(dom, options.from, options.to);\n return Slice.maxOpen(context.finish());\n }\n /**\n @internal\n */\n matchTag(dom, context, after) {\n for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n let rule = this.tags[i];\n if (matches(dom, rule.tag) && (rule.namespace === void 0 || dom.namespaceURI == rule.namespace) && (!rule.context || context.matchesContext(rule.context))) {\n if (rule.getAttrs) {\n let result = rule.getAttrs(dom);\n if (result === false)\n continue;\n rule.attrs = result || void 0;\n }\n return rule;\n }\n }\n }\n /**\n @internal\n */\n matchStyle(prop, value, context, after) {\n for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n let rule = this.styles[i], style = rule.style;\n if (style.indexOf(prop) != 0 || rule.context && !context.matchesContext(rule.context) || // Test that the style string either precisely matches the prop,\n // or has an '=' sign after the prop, followed by the given\n // value.\n style.length > prop.length && (style.charCodeAt(prop.length) != 61 || style.slice(prop.length + 1) != value))\n continue;\n if (rule.getAttrs) {\n let result = rule.getAttrs(value);\n if (result === false)\n continue;\n rule.attrs = result || void 0;\n }\n return rule;\n }\n }\n /**\n @internal\n */\n static schemaRules(schema) {\n let result = [];\n function insert(rule) {\n let priority = rule.priority == null ? 50 : rule.priority, i = 0;\n for (; i < result.length; i++) {\n let next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n if (nextPriority < priority)\n break;\n }\n result.splice(i, 0, rule);\n }\n for (let name in schema.marks) {\n let rules = schema.marks[name].spec.parseDOM;\n if (rules)\n rules.forEach((rule) => {\n insert(rule = copy(rule));\n if (!(rule.mark || rule.ignore || rule.clearMark))\n rule.mark = name;\n });\n }\n for (let name in schema.nodes) {\n let rules = schema.nodes[name].spec.parseDOM;\n if (rules)\n rules.forEach((rule) => {\n insert(rule = copy(rule));\n if (!(rule.node || rule.ignore || rule.mark))\n rule.node = name;\n });\n }\n return result;\n }\n /**\n Construct a DOM parser using the parsing rules listed in a\n schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by\n [priority](https://prosemirror.net/docs/ref/#model.ParseRule.priority).\n */\n static fromSchema(schema) {\n return schema.cached.domParser || (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)));\n }\n}\nconst blockTags = {\n address: true,\n article: true,\n aside: true,\n blockquote: true,\n canvas: true,\n dd: true,\n div: true,\n dl: true,\n fieldset: true,\n figcaption: true,\n figure: true,\n footer: true,\n form: true,\n h1: true,\n h2: true,\n h3: true,\n h4: true,\n h5: true,\n h6: true,\n header: true,\n hgroup: true,\n hr: true,\n li: true,\n noscript: true,\n ol: true,\n output: true,\n p: true,\n pre: true,\n section: true,\n table: true,\n tfoot: true,\n ul: true\n};\nconst ignoreTags = {\n head: true,\n noscript: true,\n object: true,\n script: true,\n style: true,\n title: true\n};\nconst listTags = { ol: true, ul: true };\nconst OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\nfunction wsOptionsFor(type, preserveWhitespace, base) {\n if (preserveWhitespace != null)\n return (preserveWhitespace ? OPT_PRESERVE_WS : 0) | (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0);\n return type && type.whitespace == \"pre\" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base & ~OPT_OPEN_LEFT;\n}\nclass NodeContext {\n constructor(type, attrs, marks, pendingMarks, solid, match, options) {\n this.type = type;\n this.attrs = attrs;\n this.marks = marks;\n this.pendingMarks = pendingMarks;\n this.solid = solid;\n this.options = options;\n this.content = [];\n this.activeMarks = Mark.none;\n this.stashMarks = [];\n this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n }\n findWrapping(node) {\n if (!this.match) {\n if (!this.type)\n return [];\n let fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n if (fill) {\n this.match = this.type.contentMatch.matchFragment(fill);\n } else {\n let start = this.type.contentMatch, wrap;\n if (wrap = start.findWrapping(node.type)) {\n this.match = start;\n return wrap;\n } else {\n return null;\n }\n }\n }\n return this.match.findWrapping(node.type);\n }\n finish(openEnd) {\n if (!(this.options & OPT_PRESERVE_WS)) {\n let last = this.content[this.content.length - 1], m;\n if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n let text = last;\n if (last.text.length == m[0].length)\n this.content.pop();\n else\n this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length));\n }\n }\n let content = Fragment.from(this.content);\n if (!openEnd && this.match)\n content = content.append(this.match.fillBefore(Fragment.empty, true));\n return this.type ? this.type.create(this.attrs, content, this.marks) : content;\n }\n popFromStashMark(mark) {\n for (let i = this.stashMarks.length - 1; i >= 0; i--)\n if (mark.eq(this.stashMarks[i]))\n return this.stashMarks.splice(i, 1)[0];\n }\n applyPending(nextType) {\n for (let i = 0, pending = this.pendingMarks; i < pending.length; i++) {\n let mark = pending[i];\n if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) && !mark.isInSet(this.activeMarks)) {\n this.activeMarks = mark.addToSet(this.activeMarks);\n this.pendingMarks = mark.removeFromSet(this.pendingMarks);\n }\n }\n }\n inlineContext(node) {\n if (this.type)\n return this.type.inlineContent;\n if (this.content.length)\n return this.content[0].isInline;\n return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase());\n }\n}\nclass ParseContext {\n constructor(parser, options, isOpen) {\n this.parser = parser;\n this.options = options;\n this.isOpen = isOpen;\n this.open = 0;\n let topNode = options.topNode, topContext;\n let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0);\n if (topNode)\n topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions);\n else if (isOpen)\n topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions);\n else\n topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions);\n this.nodes = [topContext];\n this.find = options.findPositions;\n this.needsBlock = false;\n }\n get top() {\n return this.nodes[this.open];\n }\n // Add a DOM node to the content. Text is inserted as text node,\n // otherwise, the node is passed to `addElement` or, if it has a\n // `style` attribute, `addElementWithStyles`.\n addDOM(dom) {\n if (dom.nodeType == 3)\n this.addTextNode(dom);\n else if (dom.nodeType == 1)\n this.addElement(dom);\n }\n withStyleRules(dom, f) {\n let style = dom.getAttribute(\"style\");\n if (!style)\n return f();\n let marks = this.readStyles(parseStyles(style));\n if (!marks)\n return;\n let [addMarks, removeMarks] = marks, top = this.top;\n for (let i = 0; i < removeMarks.length; i++)\n this.removePendingMark(removeMarks[i], top);\n for (let i = 0; i < addMarks.length; i++)\n this.addPendingMark(addMarks[i]);\n f();\n for (let i = 0; i < addMarks.length; i++)\n this.removePendingMark(addMarks[i], top);\n for (let i = 0; i < removeMarks.length; i++)\n this.addPendingMark(removeMarks[i]);\n }\n addTextNode(dom) {\n let value = dom.nodeValue;\n let top = this.top;\n if (top.options & OPT_PRESERVE_WS_FULL || top.inlineContext(dom) || /[^ \\t\\r\\n\\u000c]/.test(value)) {\n if (!(top.options & OPT_PRESERVE_WS)) {\n value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n let nodeBefore = top.content[top.content.length - 1];\n let domNodeBefore = dom.previousSibling;\n if (!nodeBefore || domNodeBefore && domNodeBefore.nodeName == \"BR\" || nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text))\n value = value.slice(1);\n }\n } else if (!(top.options & OPT_PRESERVE_WS_FULL)) {\n value = value.replace(/\\r?\\n|\\r/g, \" \");\n } else {\n value = value.replace(/\\r\\n?/g, \"\\n\");\n }\n if (value)\n this.insertNode(this.parser.schema.text(value));\n this.findInText(dom);\n } else {\n this.findInside(dom);\n }\n }\n // Try to find a handler for the given tag and use that to parse. If\n // none is found, the element's content nodes are added directly.\n addElement(dom, matchAfter) {\n let name = dom.nodeName.toLowerCase(), ruleID;\n if (listTags.hasOwnProperty(name) && this.parser.normalizeLists)\n normalizeList(dom);\n let rule = this.options.ruleFromNode && this.options.ruleFromNode(dom) || (ruleID = this.parser.matchTag(dom, this, matchAfter));\n if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n this.findInside(dom);\n this.ignoreFallback(dom);\n } else if (!rule || rule.skip || rule.closeParent) {\n if (rule && rule.closeParent)\n this.open = Math.max(0, this.open - 1);\n else if (rule && rule.skip.nodeType)\n dom = rule.skip;\n let sync, top = this.top, oldNeedsBlock = this.needsBlock;\n if (blockTags.hasOwnProperty(name)) {\n if (top.content.length && top.content[0].isInline && this.open) {\n this.open--;\n top = this.top;\n }\n sync = true;\n if (!top.type)\n this.needsBlock = true;\n } else if (!dom.firstChild) {\n this.leafFallback(dom);\n return;\n }\n if (rule && rule.skip)\n this.addAll(dom);\n else\n this.withStyleRules(dom, () => this.addAll(dom));\n if (sync)\n this.sync(top);\n this.needsBlock = oldNeedsBlock;\n } else {\n this.withStyleRules(dom, () => {\n this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : void 0);\n });\n }\n }\n // Called for leaf DOM nodes that would otherwise be ignored\n leafFallback(dom) {\n if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\"));\n }\n // Called for ignored nodes\n ignoreFallback(dom) {\n if (dom.nodeName == \"BR\" && (!this.top.type || !this.top.type.inlineContent))\n this.findPlace(this.parser.schema.text(\"-\"));\n }\n // Run any style parser associated with the node's styles. Either\n // return an array of marks, or null to indicate some of the styles\n // had a rule with `ignore` set.\n readStyles(styles) {\n let add = Mark.none, remove = Mark.none;\n for (let i = 0; i < styles.length; i += 2) {\n for (let after = void 0; ; ) {\n let rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after);\n if (!rule)\n break;\n if (rule.ignore)\n return null;\n if (rule.clearMark) {\n this.top.pendingMarks.concat(this.top.activeMarks).forEach((m) => {\n if (rule.clearMark(m))\n remove = m.addToSet(remove);\n });\n } else {\n add = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(add);\n }\n if (rule.consuming === false)\n after = rule;\n else\n break;\n }\n }\n return [add, remove];\n }\n // Look up a handler for the given node. If none are found, return\n // false. Otherwise, apply it, use its return value to drive the way\n // the node's content is wrapped, and return true.\n addElementByRule(dom, rule, continueAfter) {\n let sync, nodeType, mark;\n if (rule.node) {\n nodeType = this.parser.schema.nodes[rule.node];\n if (!nodeType.isLeaf) {\n sync = this.enter(nodeType, rule.attrs || null, rule.preserveWhitespace);\n } else if (!this.insertNode(nodeType.create(rule.attrs))) {\n this.leafFallback(dom);\n }\n } else {\n let markType = this.parser.schema.marks[rule.mark];\n mark = markType.create(rule.attrs);\n this.addPendingMark(mark);\n }\n let startIn = this.top;\n if (nodeType && nodeType.isLeaf) {\n this.findInside(dom);\n } else if (continueAfter) {\n this.addElement(dom, continueAfter);\n } else if (rule.getContent) {\n this.findInside(dom);\n rule.getContent(dom, this.parser.schema).forEach((node) => this.insertNode(node));\n } else {\n let contentDOM = dom;\n if (typeof rule.contentElement == \"string\")\n contentDOM = dom.querySelector(rule.contentElement);\n else if (typeof rule.contentElement == \"function\")\n contentDOM = rule.contentElement(dom);\n else if (rule.contentElement)\n contentDOM = rule.contentElement;\n this.findAround(dom, contentDOM, true);\n this.addAll(contentDOM);\n }\n if (sync && this.sync(startIn))\n this.open--;\n if (mark)\n this.removePendingMark(mark, startIn);\n }\n // Add all child nodes between `startIndex` and `endIndex` (or the\n // whole node, if not given). If `sync` is passed, use it to\n // synchronize after every block element.\n addAll(parent, startIndex, endIndex) {\n let index = startIndex || 0;\n for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end = endIndex == null ? null : parent.childNodes[endIndex]; dom != end; dom = dom.nextSibling, ++index) {\n this.findAtPoint(parent, index);\n this.addDOM(dom);\n }\n this.findAtPoint(parent, index);\n }\n // Try to find a way to fit the given node type into the current\n // context. May add intermediate wrappers and/or leave non-solid\n // nodes that we're in.\n findPlace(node) {\n let route, sync;\n for (let depth = this.open; depth >= 0; depth--) {\n let cx = this.nodes[depth];\n let found2 = cx.findWrapping(node);\n if (found2 && (!route || route.length > found2.length)) {\n route = found2;\n sync = cx;\n if (!found2.length)\n break;\n }\n if (cx.solid)\n break;\n }\n if (!route)\n return false;\n this.sync(sync);\n for (let i = 0; i < route.length; i++)\n this.enterInner(route[i], null, false);\n return true;\n }\n // Try to insert the given node, adjusting the context when needed.\n insertNode(node) {\n if (node.isInline && this.needsBlock && !this.top.type) {\n let block = this.textblockFromContext();\n if (block)\n this.enterInner(block);\n }\n if (this.findPlace(node)) {\n this.closeExtra();\n let top = this.top;\n top.applyPending(node.type);\n if (top.match)\n top.match = top.match.matchType(node.type);\n let marks = top.activeMarks;\n for (let i = 0; i < node.marks.length; i++)\n if (!top.type || top.type.allowsMarkType(node.marks[i].type))\n marks = node.marks[i].addToSet(marks);\n top.content.push(node.mark(marks));\n return true;\n }\n return false;\n }\n // Try to start a node of the given type, adjusting the context when\n // necessary.\n enter(type, attrs, preserveWS) {\n let ok = this.findPlace(type.create(attrs));\n if (ok)\n this.enterInner(type, attrs, true, preserveWS);\n return ok;\n }\n // Open a node of the given type\n enterInner(type, attrs = null, solid = false, preserveWS) {\n this.closeExtra();\n let top = this.top;\n top.applyPending(type);\n top.match = top.match && top.match.matchType(type);\n let options = wsOptionsFor(type, preserveWS, top.options);\n if (top.options & OPT_OPEN_LEFT && top.content.length == 0)\n options |= OPT_OPEN_LEFT;\n this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));\n this.open++;\n }\n // Make sure all nodes above this.open are finished and added to\n // their parents\n closeExtra(openEnd = false) {\n let i = this.nodes.length - 1;\n if (i > this.open) {\n for (; i > this.open; i--)\n this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd));\n this.nodes.length = this.open + 1;\n }\n }\n finish() {\n this.open = 0;\n this.closeExtra(this.isOpen);\n return this.nodes[0].finish(this.isOpen || this.options.topOpen);\n }\n sync(to) {\n for (let i = this.open; i >= 0; i--)\n if (this.nodes[i] == to) {\n this.open = i;\n return true;\n }\n return false;\n }\n get currentPos() {\n this.closeExtra();\n let pos = 0;\n for (let i = this.open; i >= 0; i--) {\n let content = this.nodes[i].content;\n for (let j = content.length - 1; j >= 0; j--)\n pos += content[j].nodeSize;\n if (i)\n pos++;\n }\n return pos;\n }\n findAtPoint(parent, offset) {\n if (this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].node == parent && this.find[i].offset == offset)\n this.find[i].pos = this.currentPos;\n }\n }\n findInside(parent) {\n if (this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n this.find[i].pos = this.currentPos;\n }\n }\n findAround(parent, content, before) {\n if (parent != content && this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n let pos = content.compareDocumentPosition(this.find[i].node);\n if (pos & (before ? 2 : 4))\n this.find[i].pos = this.currentPos;\n }\n }\n }\n findInText(textNode) {\n if (this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].node == textNode)\n this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset);\n }\n }\n // Determines whether the given context string matches this context.\n matchesContext(context) {\n if (context.indexOf(\"|\") > -1)\n return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this);\n let parts = context.split(\"/\");\n let option = this.options.context;\n let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n let match = (i, depth) => {\n for (; i >= 0; i--) {\n let part = parts[i];\n if (part == \"\") {\n if (i == parts.length - 1 || i == 0)\n continue;\n for (; depth >= minDepth; depth--)\n if (match(i - 1, depth))\n return true;\n return false;\n } else {\n let next = depth > 0 || depth == 0 && useRoot ? this.nodes[depth].type : option && depth >= minDepth ? option.node(depth - minDepth).type : null;\n if (!next || next.name != part && next.groups.indexOf(part) == -1)\n return false;\n depth--;\n }\n }\n return true;\n };\n return match(parts.length - 1, this.open);\n }\n textblockFromContext() {\n let $context = this.options.context;\n if ($context)\n for (let d = $context.depth; d >= 0; d--) {\n let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n if (deflt && deflt.isTextblock && deflt.defaultAttrs)\n return deflt;\n }\n for (let name in this.parser.schema.nodes) {\n let type = this.parser.schema.nodes[name];\n if (type.isTextblock && type.defaultAttrs)\n return type;\n }\n }\n addPendingMark(mark) {\n let found2 = findSameMarkInSet(mark, this.top.pendingMarks);\n if (found2)\n this.top.stashMarks.push(found2);\n this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);\n }\n removePendingMark(mark, upto) {\n for (let depth = this.open; depth >= 0; depth--) {\n let level = this.nodes[depth];\n let found2 = level.pendingMarks.lastIndexOf(mark);\n if (found2 > -1) {\n level.pendingMarks = mark.removeFromSet(level.pendingMarks);\n } else {\n level.activeMarks = mark.removeFromSet(level.activeMarks);\n let stashMark = level.popFromStashMark(mark);\n if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))\n level.activeMarks = stashMark.addToSet(level.activeMarks);\n }\n if (level == upto)\n break;\n }\n }\n}\nfunction normalizeList(dom) {\n for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n if (name && listTags.hasOwnProperty(name) && prevItem) {\n prevItem.appendChild(child);\n child = prevItem;\n } else if (name == \"li\") {\n prevItem = child;\n } else if (name) {\n prevItem = null;\n }\n }\n}\nfunction matches(dom, selector) {\n return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector);\n}\nfunction parseStyles(style) {\n let re = /\\s*([\\w-]+)\\s*:\\s*([^;]+)/g, m, result = [];\n while (m = re.exec(style))\n result.push(m[1], m[2].trim());\n return result;\n}\nfunction copy(obj) {\n let copy2 = {};\n for (let prop in obj)\n copy2[prop] = obj[prop];\n return copy2;\n}\nfunction markMayApply(markType, nodeType) {\n let nodes = nodeType.schema.nodes;\n for (let name in nodes) {\n let parent = nodes[name];\n if (!parent.allowsMarkType(markType))\n continue;\n let seen = [], scan = (match) => {\n seen.push(match);\n for (let i = 0; i < match.edgeCount; i++) {\n let { type, next } = match.edge(i);\n if (type == nodeType)\n return true;\n if (seen.indexOf(next) < 0 && scan(next))\n return true;\n }\n };\n if (scan(parent.contentMatch))\n return true;\n }\n}\nfunction findSameMarkInSet(mark, set) {\n for (let i = 0; i < set.length; i++) {\n if (mark.eq(set[i]))\n return set[i];\n }\n}\nclass DOMSerializer {\n /**\n Create a serializer. `nodes` should map node names to functions\n that take a node and return a description of the corresponding\n DOM. `marks` does the same for mark names, but also gets an\n argument that tells it whether the mark's content is block or\n inline content (for typical use, it'll always be inline). A mark\n serializer may be `null` to indicate that marks of that type\n should not be serialized.\n */\n constructor(nodes, marks) {\n this.nodes = nodes;\n this.marks = marks;\n }\n /**\n Serialize the content of this fragment to a DOM fragment. When\n not in the browser, the `document` option, containing a DOM\n document, should be passed so that the serializer can create\n nodes.\n */\n serializeFragment(fragment, options = {}, target) {\n if (!target)\n target = doc(options).createDocumentFragment();\n let top = target, active = [];\n fragment.forEach((node) => {\n if (active.length || node.marks.length) {\n let keep = 0, rendered = 0;\n while (keep < active.length && rendered < node.marks.length) {\n let next = node.marks[rendered];\n if (!this.marks[next.type.name]) {\n rendered++;\n continue;\n }\n if (!next.eq(active[keep][0]) || next.type.spec.spanning === false)\n break;\n keep++;\n rendered++;\n }\n while (keep < active.length)\n top = active.pop()[1];\n while (rendered < node.marks.length) {\n let add = node.marks[rendered++];\n let markDOM = this.serializeMark(add, node.isInline, options);\n if (markDOM) {\n active.push([add, top]);\n top.appendChild(markDOM.dom);\n top = markDOM.contentDOM || markDOM.dom;\n }\n }\n }\n top.appendChild(this.serializeNodeInner(node, options));\n });\n return target;\n }\n /**\n @internal\n */\n serializeNodeInner(node, options) {\n let { dom, contentDOM } = DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node));\n if (contentDOM) {\n if (node.isLeaf)\n throw new RangeError(\"Content hole not allowed in a leaf node spec\");\n this.serializeFragment(node.content, options, contentDOM);\n }\n return dom;\n }\n /**\n Serialize this node to a DOM node. This can be useful when you\n need to serialize a part of a document, as opposed to the whole\n document. To serialize a whole document, use\n [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on\n its [content](https://prosemirror.net/docs/ref/#model.Node.content).\n */\n serializeNode(node, options = {}) {\n let dom = this.serializeNodeInner(node, options);\n for (let i = node.marks.length - 1; i >= 0; i--) {\n let wrap = this.serializeMark(node.marks[i], node.isInline, options);\n if (wrap) {\n (wrap.contentDOM || wrap.dom).appendChild(dom);\n dom = wrap.dom;\n }\n }\n return dom;\n }\n /**\n @internal\n */\n serializeMark(mark, inline, options = {}) {\n let toDOM = this.marks[mark.type.name];\n return toDOM && DOMSerializer.renderSpec(doc(options), toDOM(mark, inline));\n }\n /**\n Render an [output spec](https://prosemirror.net/docs/ref/#model.DOMOutputSpec) to a DOM node. If\n the spec has a hole (zero) in it, `contentDOM` will point at the\n node with the hole.\n */\n static renderSpec(doc2, structure, xmlNS = null) {\n if (typeof structure == \"string\")\n return { dom: doc2.createTextNode(structure) };\n if (structure.nodeType != null)\n return { dom: structure };\n if (structure.dom && structure.dom.nodeType != null)\n return structure;\n let tagName = structure[0], space = tagName.indexOf(\" \");\n if (space > 0) {\n xmlNS = tagName.slice(0, space);\n tagName = tagName.slice(space + 1);\n }\n let contentDOM;\n let dom = xmlNS ? doc2.createElementNS(xmlNS, tagName) : doc2.createElement(tagName);\n let attrs = structure[1], start = 1;\n if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n start = 2;\n for (let name in attrs)\n if (attrs[name] != null) {\n let space2 = name.indexOf(\" \");\n if (space2 > 0)\n dom.setAttributeNS(name.slice(0, space2), name.slice(space2 + 1), attrs[name]);\n else\n dom.setAttribute(name, attrs[name]);\n }\n }\n for (let i = start; i < structure.length; i++) {\n let child = structure[i];\n if (child === 0) {\n if (i < structure.length - 1 || i > start)\n throw new RangeError(\"Content hole must be the only child of its parent node\");\n return { dom, contentDOM: dom };\n } else {\n let { dom: inner, contentDOM: innerContent } = DOMSerializer.renderSpec(doc2, child, xmlNS);\n dom.appendChild(inner);\n if (innerContent) {\n if (contentDOM)\n throw new RangeError(\"Multiple content holes\");\n contentDOM = innerContent;\n }\n }\n }\n return { dom, contentDOM };\n }\n /**\n Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM)\n properties in a schema's node and mark specs.\n */\n static fromSchema(schema) {\n return schema.cached.domSerializer || (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)));\n }\n /**\n Gather the serializers in a schema's node specs into an object.\n This can be useful as a base to build a custom serializer from.\n */\n static nodesFromSchema(schema) {\n let result = gatherToDOM(schema.nodes);\n if (!result.text)\n result.text = (node) => node.text;\n return result;\n }\n /**\n Gather the serializers in a schema's mark specs into an object.\n */\n static marksFromSchema(schema) {\n return gatherToDOM(schema.marks);\n }\n}\nfunction gatherToDOM(obj) {\n let result = {};\n for (let name in obj) {\n let toDOM = obj[name].spec.toDOM;\n if (toDOM)\n result[name] = toDOM;\n }\n return result;\n}\nfunction doc(options) {\n return options.document || window.document;\n}\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n","import { TextSelection, NodeSelection, AllSelection, Selection } from \"prosemirror-state\";\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from \"prosemirror-model\";\nimport { dropPoint } from \"prosemirror-transform\";\nconst domIndex = function(node) {\n for (var index = 0; ; index++) {\n node = node.previousSibling;\n if (!node)\n return index;\n }\n};\nconst parentNode = function(node) {\n let parent = node.assignedSlot || node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\nconst textRange = function(node, from, to) {\n let range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range;\n};\nconst isEquivalentPosition = function(node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) || scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (; ; ) {\n if (node == targetNode && off == targetOff)\n return true;\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n let parent = node.parentNode;\n if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == \"false\")\n return false;\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n } else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\")\n return false;\n off = dir < 0 ? nodeSize(node) : 0;\n } else {\n return false;\n }\n }\n}\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isOnEdge(node, offset, parent) {\n for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd; ) {\n if (node == parent)\n return true;\n let index = domIndex(node);\n node = node.parentNode;\n if (!node)\n return false;\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\nfunction hasBlockDesc(dom) {\n let desc;\n for (let cur = dom; cur; cur = cur.parentNode)\n if (desc = cur.pmViewDesc)\n break;\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\nconst selectionCollapsed = function(domSel) {\n return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n let event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event;\n}\nfunction deepActiveElement(doc2) {\n let elt = doc2.activeElement;\n while (elt && elt.shadowRoot)\n elt = elt.shadowRoot.activeElement;\n return elt;\n}\nfunction caretFromPoint(doc2, x, y) {\n if (doc2.caretPositionFromPoint) {\n try {\n let pos = doc2.caretPositionFromPoint(x, y);\n if (pos)\n return { node: pos.offsetNode, offset: pos.offset };\n } catch (_) {\n }\n }\n if (doc2.caretRangeFromPoint) {\n let range = doc2.caretRangeFromPoint(x, y);\n if (range)\n return { node: range.startContainer, offset: range.startOffset };\n }\n}\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = nav && nav.userAgent || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst windows = nav ? /Win/.test(nav.platform) : false;\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\nfunction windowRect(doc2) {\n return {\n left: 0,\n right: doc2.documentElement.clientWidth,\n top: 0,\n bottom: doc2.documentElement.clientHeight\n };\n}\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n let rect = node.getBoundingClientRect();\n let scaleX = rect.width / node.offsetWidth || 1;\n let scaleY = rect.height / node.offsetHeight || 1;\n return {\n left: rect.left,\n right: rect.left + node.clientWidth * scaleX,\n top: rect.top,\n bottom: rect.top + node.clientHeight * scaleY\n };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n let doc2 = view.dom.ownerDocument;\n for (let parent = startDOM || view.dom; ; parent = parentNode(parent)) {\n if (!parent)\n break;\n if (parent.nodeType != 1)\n continue;\n let elt = parent;\n let atTop = elt == doc2.body;\n let bounding = atTop ? windowRect(doc2) : clientRect(elt);\n let moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n moveY = rect.bottom - rect.top > bounding.bottom - bounding.top ? rect.top + getSide(scrollMargin, \"top\") - bounding.top : rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n if (moveX || moveY) {\n if (atTop) {\n doc2.defaultView.scrollBy(moveX, moveY);\n } else {\n let startX = elt.scrollLeft, startY = elt.scrollTop;\n if (moveY)\n elt.scrollTop += moveY;\n if (moveX)\n elt.scrollLeft += moveX;\n let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n }\n }\n if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent).position))\n break;\n }\n}\nfunction storeScrollPos(view) {\n let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n let refDOM, refTop;\n for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n let dom = view.root.elementFromPoint(x, y);\n if (!dom || dom == view.dom || !view.dom.contains(dom))\n continue;\n let localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break;\n }\n }\n return { refDOM, refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n let stack = [], doc2 = dom.ownerDocument;\n for (let cur = dom; cur; cur = parentNode(cur)) {\n stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n if (dom == doc2)\n break;\n }\n return stack;\n}\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n for (let i = 0; i < stack.length; i++) {\n let { dom, top, left } = stack[i];\n if (dom.scrollTop != top + dTop)\n dom.scrollTop = top + dTop;\n if (dom.scrollLeft != left)\n dom.scrollLeft = left;\n }\n}\nlet preventScrollSupported = null;\nfunction focusPreventScroll(dom) {\n if (dom.setActive)\n return dom.setActive();\n if (preventScrollSupported)\n return dom.focus(preventScrollSupported);\n let stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = { preventScroll: true };\n return true;\n }\n } : void 0);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\nfunction findOffsetInNode(node, coords) {\n let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n let rowBot = coords.top, rowTop = coords.top;\n let firstBelow, coordsBelow;\n for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n let rects;\n if (child.nodeType == 1)\n rects = child.getClientRects();\n else if (child.nodeType == 3)\n rects = textRange(child).getClientRects();\n else\n continue;\n for (let i = 0; i < rects.length; i++) {\n let rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n let dx = rect.left > coords.left ? rect.left - coords.left : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {\n left: rect.right < coords.left ? rect.right : rect.left,\n top: coords.top\n } : coords;\n if (child.nodeType == 1 && dx)\n offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n continue;\n }\n } else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) {\n firstBelow = child;\n coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top };\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top || coords.left >= rect.left && coords.top >= rect.bottom))\n offset = childIndex + 1;\n }\n }\n if (!closest && firstBelow) {\n closest = firstBelow;\n coordsClosest = coordsBelow;\n dxClosest = 0;\n }\n if (closest && closest.nodeType == 3)\n return findOffsetInText(closest, coordsClosest);\n if (!closest || dxClosest && closest.nodeType == 1)\n return { node, offset };\n return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n let len = node.nodeValue.length;\n let range = document.createRange();\n for (let i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n let rect = singleRect(range, 1);\n if (rect.top == rect.bottom)\n continue;\n if (inRect(coords, rect))\n return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n }\n return { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 && coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n let parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n return parent;\n return dom;\n}\nfunction posFromElement(view, elt, coords) {\n let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n let rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n let outsideBlock = -1;\n for (let cur = node, sawBlock = false; ; ) {\n if (cur == view.dom)\n break;\n let desc = view.docView.nearestDesc(cur, true);\n if (!desc)\n return null;\n if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent && !sawBlock || !desc.contentDOM)) {\n let rect = desc.dom.getBoundingClientRect();\n if (desc.node.isBlock && desc.parent && !sawBlock) {\n sawBlock = true;\n if (rect.left > coords.left || rect.top > coords.top)\n outsideBlock = desc.posBefore;\n else if (rect.right < coords.left || rect.bottom < coords.top)\n outsideBlock = desc.posAfter;\n }\n if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) {\n let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2 : coords.left < (rect.left + rect.right) / 2;\n return before ? desc.posBefore : desc.posAfter;\n }\n }\n cur = desc.dom.parentNode;\n }\n return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n let len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI; ; ) {\n let child = element.childNodes[i];\n if (child.nodeType == 1) {\n let rects = child.getClientRects();\n for (let j = 0; j < rects.length; j++) {\n let rect = rects[j];\n if (inRect(coords, rect))\n return elementFromPoint(child, coords, rect);\n }\n }\n if ((i = (i + 1) % len) == startI)\n break;\n }\n }\n return element;\n}\nfunction posAtCoords(view, coords) {\n let doc2 = view.dom.ownerDocument, node, offset = 0;\n let caret = caretFromPoint(doc2, coords.left, coords.top);\n if (caret)\n ({ node, offset } = caret);\n let elt = (view.root.elementFromPoint ? view.root : doc2).elementFromPoint(coords.left, coords.top);\n let pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n let box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box))\n return null;\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt)\n return null;\n }\n if (safari) {\n for (let p = elt; node && p; p = parentNode(p))\n if (p.draggable)\n node = void 0;\n }\n elt = targetKludge(elt, coords);\n if (node) {\n if (gecko && node.nodeType == 1) {\n offset = Math.min(offset, node.childNodes.length);\n if (offset < node.childNodes.length) {\n let next = node.childNodes[offset], box;\n if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left && box.bottom > coords.top)\n offset++;\n }\n }\n let prev;\n if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 && prev.contentEditable == \"false\" && prev.getBoundingClientRect().top >= coords.top)\n offset--;\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 && coords.top > node.lastChild.getBoundingClientRect().bottom)\n pos = view.state.doc.content.size;\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n pos = posFromCaret(view, node, offset, coords);\n }\n if (pos == null)\n pos = posFromElement(view, elt, coords);\n let desc = view.docView.nearestDesc(elt, true);\n return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction nonZero(rect) {\n return rect.top < rect.bottom || rect.left < rect.right;\n}\nfunction singleRect(target, bias) {\n let rects = target.getClientRects();\n if (rects.length) {\n let first = rects[bias < 0 ? 0 : rects.length - 1];\n if (nonZero(first))\n return first;\n }\n return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect();\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\nfunction coordsAtPos(view, pos, side) {\n let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n let supportEmptyRange = webkit || gecko;\n if (node.nodeType == 3) {\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n let rect = singleRect(textRange(node, offset, offset), side);\n if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n }\n }\n return rect;\n } else {\n let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) {\n to++;\n takeSide = -1;\n } else if (side >= 0 && offset == node.nodeValue.length) {\n from--;\n takeSide = 1;\n } else if (side < 0) {\n from--;\n } else {\n to++;\n }\n return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n }\n }\n let $dom = view.state.doc.resolve(pos - (atom || 0));\n if (!$dom.parent.inlineContent) {\n if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n if (before.nodeType == 1)\n return flattenH(before.getBoundingClientRect(), false);\n }\n if (atom == null && offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n if (after.nodeType == 1)\n return flattenH(after.getBoundingClientRect(), true);\n }\n return flattenH(node.getBoundingClientRect(), side >= 0);\n }\n if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1)) : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n if (target)\n return flattenV(singleRect(target, 1), false);\n }\n if (atom == null && offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n after = after.nextSibling;\n let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, supportEmptyRange ? 0 : 1) : after.nodeType == 1 ? after : null;\n if (target)\n return flattenV(singleRect(target, -1), true);\n }\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n if (rect.width == 0)\n return rect;\n let x = left ? rect.left : rect.right;\n return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n if (rect.height == 0)\n return rect;\n let y = top ? rect.top : rect.bottom;\n return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n let viewState = view.state, active = view.root.activeElement;\n if (viewState != state)\n view.updateState(state);\n if (active != view.dom)\n view.focus();\n try {\n return f();\n } finally {\n if (viewState != state)\n view.updateState(viewState);\n if (active != view.dom && active)\n active.focus();\n }\n}\nfunction endOfTextblockVertical(view, state, dir) {\n let sel = state.selection;\n let $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, () => {\n let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n for (; ; ) {\n let nearest = view.docView.nearestDesc(dom, true);\n if (!nearest)\n break;\n if (nearest.node.isBlock) {\n dom = nearest.contentDOM || nearest.dom;\n break;\n }\n dom = nearest.dom.parentNode;\n }\n let coords = coordsAtPos(view, $pos.pos, 1);\n for (let child = dom.firstChild; child; child = child.nextSibling) {\n let boxes;\n if (child.nodeType == 1)\n boxes = child.getClientRects();\n else if (child.nodeType == 3)\n boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n else\n continue;\n for (let i = 0; i < boxes.length; i++) {\n let box = boxes[i];\n if (box.bottom > box.top + 1 && (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2 : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n return false;\n }\n }\n return true;\n });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n let { $head } = state.selection;\n if (!$head.parent.isTextblock)\n return false;\n let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n let sel = view.domSelection();\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n return withFlushedState(view, state, () => {\n let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n let oldBidiLevel = sel.caretBidiLevel;\n sel.modify(\"move\", dir, \"character\");\n let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) || oldNode == newNode && oldOff == newOff;\n try {\n sel.collapse(anchorNode, anchorOffset);\n if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n sel.extend(oldNode, oldOff);\n } catch (_) {\n }\n if (oldBidiLevel != null)\n sel.caretBidiLevel = oldBidiLevel;\n return result;\n });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir)\n return cachedResult;\n cachedState = state;\n cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\" ? endOfTextblockVertical(view, state, dir) : endOfTextblockHorizontal(view, state, dir);\n}\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\nclass ViewDesc {\n constructor(parent, children, dom, contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n dom.pmViewDesc = this;\n }\n // Used to check whether a given description corresponds to a\n // widget/mark/node.\n matchesWidget(widget) {\n return false;\n }\n matchesMark(mark) {\n return false;\n }\n matchesNode(node, outerDeco, innerDeco) {\n return false;\n }\n matchesHack(nodeName) {\n return false;\n }\n // When parsing in-editor content (in domchange.js), we allow\n // descriptions to determine the parse rules that should be used to\n // parse them.\n parseRule() {\n return null;\n }\n // Used by the editor's event handler to ignore events that come\n // from certain descs.\n stopEvent(event) {\n return false;\n }\n // The size of the content represented by this desc.\n get size() {\n let size = 0;\n for (let i = 0; i < this.children.length; i++)\n size += this.children[i].size;\n return size;\n }\n // For block nodes, this represents the space taken up by their\n // start/end tokens.\n get border() {\n return 0;\n }\n destroy() {\n this.parent = void 0;\n if (this.dom.pmViewDesc == this)\n this.dom.pmViewDesc = void 0;\n for (let i = 0; i < this.children.length; i++)\n this.children[i].destroy();\n }\n posBeforeChild(child) {\n for (let i = 0, pos = this.posAtStart; ; i++) {\n let cur = this.children[i];\n if (cur == child)\n return pos;\n pos += cur.size;\n }\n }\n get posBefore() {\n return this.parent.posBeforeChild(this);\n }\n get posAtStart() {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n }\n get posAfter() {\n return this.posBefore + this.size;\n }\n get posAtEnd() {\n return this.posAtStart + this.size - 2 * this.border;\n }\n localPosFromDOM(dom, offset, bias) {\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n let domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n } else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n domBefore = domBefore.previousSibling;\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n } else {\n let domAfter, desc;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n } else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n domAfter = domAfter.nextSibling;\n return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n }\n }\n let atEnd;\n if (dom == this.dom && this.contentDOM) {\n atEnd = offset > domIndex(this.contentDOM);\n } else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n } else if (this.dom.firstChild) {\n if (offset == 0)\n for (let search = dom; ; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = false;\n break;\n }\n if (search.previousSibling)\n break;\n }\n if (atEnd == null && offset == dom.childNodes.length)\n for (let search = dom; ; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = true;\n break;\n }\n if (search.nextSibling)\n break;\n }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n }\n nearestDesc(dom, onlyNodes = false) {\n for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n let desc = this.getDesc(cur), nodeDOM;\n if (desc && (!onlyNodes || desc.node)) {\n if (first && (nodeDOM = desc.nodeDOM) && !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n first = false;\n else\n return desc;\n }\n }\n }\n getDesc(dom) {\n let desc = dom.pmViewDesc;\n for (let cur = desc; cur; cur = cur.parent)\n if (cur == this)\n return desc;\n }\n posFromDOM(dom, offset, bias) {\n for (let scan = dom; scan; scan = scan.parentNode) {\n let desc = this.getDesc(scan);\n if (desc)\n return desc.localPosFromDOM(dom, offset, bias);\n }\n return -1;\n }\n // Find the desc for the node after the given pos, if any. (When a\n // parent node overrode rendering, there might not be one.)\n descAt(pos) {\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length)\n child = child.children[0];\n return child;\n }\n if (pos < end)\n return child.descAt(pos - offset - child.border);\n offset = end;\n }\n }\n domFromPos(pos, side) {\n if (!this.contentDOM)\n return { node: this.dom, offset: 0, atom: pos + 1 };\n let i = 0, offset = 0;\n for (let curPos = 0; i < this.children.length; i++) {\n let child = this.children[i], end = curPos + child.size;\n if (end > pos || child instanceof TrailingHackViewDesc) {\n offset = pos - curPos;\n break;\n }\n curPos = end;\n }\n if (offset)\n return this.children[i].domFromPos(offset - this.children[i].border, side);\n for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) {\n }\n if (side <= 0) {\n let prev, enter = true;\n for (; ; i--, enter = false) {\n prev = i ? this.children[i - 1] : null;\n if (!prev || prev.dom.parentNode == this.contentDOM)\n break;\n }\n if (prev && side && enter && !prev.border && !prev.domAtom)\n return prev.domFromPos(prev.size, side);\n return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n } else {\n let next, enter = true;\n for (; ; i++, enter = false) {\n next = i < this.children.length ? this.children[i] : null;\n if (!next || next.dom.parentNode == this.contentDOM)\n break;\n }\n if (next && enter && !next.border && !next.domAtom)\n return next.domFromPos(0, side);\n return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n }\n }\n // Used to find a DOM range in a single parent for a given changed\n // range.\n parseRange(from, to, base = 0) {\n if (this.children.length == 0)\n return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n let fromOffset = -1, toOffset = -1;\n for (let offset = base, i = 0; ; i++) {\n let child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n let childBase = offset + child.border;\n if (from >= childBase && to <= end - child.border && child.node && child.contentDOM && this.contentDOM.contains(child.contentDOM))\n return child.parseRange(from, to, childBase);\n from = offset;\n for (let j = i; j > 0; j--) {\n let prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break;\n }\n from -= prev.size;\n }\n if (fromOffset == -1)\n fromOffset = 0;\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (let j = i + 1; j < this.children.length; j++) {\n let next = this.children[j];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break;\n }\n to += next.size;\n }\n if (toOffset == -1)\n toOffset = this.contentDOM.childNodes.length;\n break;\n }\n offset = end;\n }\n return { node: this.contentDOM, from, to, fromOffset, toOffset };\n }\n emptyChildAt(side) {\n if (this.border || !this.contentDOM || !this.children.length)\n return false;\n let child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side);\n }\n domAfterPos(pos) {\n let { node, offset } = this.domFromPos(pos, 0);\n if (node.nodeType != 1 || offset == node.childNodes.length)\n throw new RangeError(\"No node after pos \" + pos);\n return node.childNodes[offset];\n }\n // View descs are responsible for setting any selection that falls\n // entirely inside of them, so that custom implementations can do\n // custom things with the selection. Note that this falls apart when\n // a selection starts in such a node and ends in another, in which\n // case we just use whatever domFromPos produces as a best effort.\n setSelection(anchor, head, root, force = false) {\n let from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force);\n offset = end;\n }\n let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n let domSel = root.getSelection();\n let brKludge = false;\n if ((gecko || safari) && anchor == head) {\n let { node, offset } = anchorDOM;\n if (node.nodeType == 3) {\n brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n if (brKludge && offset == node.nodeValue.length) {\n for (let scan = node, after; scan; scan = scan.parentNode) {\n if (after = scan.nextSibling) {\n if (after.nodeName == \"BR\")\n anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n break;\n }\n let desc = scan.pmViewDesc;\n if (desc && desc.node && desc.node.isBlock)\n break;\n }\n }\n } else {\n let prev = node.childNodes[offset - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) {\n let after = domSel.focusNode.childNodes[domSel.focusOffset];\n if (after && after.contentEditable == \"false\")\n force = true;\n }\n if (!(force || brKludge && safari) && isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) && isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n return;\n let domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head)\n domSel.extend(headDOM.node, headDOM.offset);\n domSelExtended = true;\n } catch (_) {\n }\n }\n if (!domSelExtended) {\n if (anchor > head) {\n let tmp = anchorDOM;\n anchorDOM = headDOM;\n headDOM = tmp;\n }\n let range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n }\n ignoreMutation(mutation) {\n return !this.contentDOM && mutation.type != \"selection\";\n }\n get contentLost() {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n }\n // Remove a subtree of the element tree that has been touched\n // by a DOM change, so that the next update will redraw it.\n markDirty(from, to) {\n for (let offset = 0, i = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n let startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside && (child.contentLost || child.dom.parentNode != this.contentDOM))\n child.dirty = NODE_DIRTY;\n else\n child.markDirty(from - startInside, to - startInside);\n return;\n } else {\n child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length ? CONTENT_DIRTY : NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n }\n markParentsDirty() {\n let level = 1;\n for (let node = this.parent; node; node = node.parent, level++) {\n let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty)\n node.dirty = dirty;\n }\n }\n get domAtom() {\n return false;\n }\n get ignoreForCoords() {\n return false;\n }\n}\nclass WidgetViewDesc extends ViewDesc {\n constructor(parent, widget, view, pos) {\n let self, dom = widget.type.toDOM;\n if (typeof dom == \"function\")\n dom = dom(view, () => {\n if (!self)\n return pos;\n if (self.parent)\n return self.parent.posBeforeChild(self);\n });\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n let wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = \"false\";\n dom.classList.add(\"ProseMirror-widget\");\n }\n super(parent, [], dom, null);\n this.widget = widget;\n this.widget = widget;\n self = this;\n }\n matchesWidget(widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n }\n parseRule() {\n return { ignore: true };\n }\n stopEvent(event) {\n let stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false;\n }\n ignoreMutation(mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n }\n destroy() {\n this.widget.type.destroy(this.dom);\n super.destroy();\n }\n get domAtom() {\n return true;\n }\n get side() {\n return this.widget.type.side;\n }\n}\nclass CompositionViewDesc extends ViewDesc {\n constructor(parent, dom, textDOM, text) {\n super(parent, [], dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n get size() {\n return this.text.length;\n }\n localPosFromDOM(dom, offset) {\n if (dom != this.textDOM)\n return this.posAtStart + (offset ? this.size : 0);\n return this.posAtStart + offset;\n }\n domFromPos(pos) {\n return { node: this.textDOM, offset: pos };\n }\n ignoreMutation(mut) {\n return mut.type === \"characterData\" && mut.target.nodeValue == mut.oldValue;\n }\n}\nclass MarkViewDesc extends ViewDesc {\n constructor(parent, mark, dom, contentDOM) {\n super(parent, [], dom, contentDOM);\n this.mark = mark;\n }\n static create(parent, mark, inline, view) {\n let custom = view.nodeViews[mark.type.name];\n let spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline));\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom);\n }\n parseRule() {\n if (this.dirty & NODE_DIRTY || this.mark.type.spec.reparseInView)\n return null;\n return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM };\n }\n matchesMark(mark) {\n return this.dirty != NODE_DIRTY && this.mark.eq(mark);\n }\n markDirty(from, to) {\n super.markDirty(from, to);\n if (this.dirty != NOT_DIRTY) {\n let parent = this.parent;\n while (!parent.node)\n parent = parent.parent;\n if (parent.dirty < this.dirty)\n parent.dirty = this.dirty;\n this.dirty = NOT_DIRTY;\n }\n }\n slice(from, to, view) {\n let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n let nodes = this.children, size = this.size;\n if (to < size)\n nodes = replaceNodes(nodes, to, size, view);\n if (from > 0)\n nodes = replaceNodes(nodes, 0, from, view);\n for (let i = 0; i < nodes.length; i++)\n nodes[i].parent = copy;\n copy.children = nodes;\n return copy;\n }\n}\nclass NodeViewDesc extends ViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n super(parent, [], dom, contentDOM);\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n this.nodeDOM = nodeDOM;\n }\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finicky\n // implementation details to the user code that they probably will\n // never need.)\n static create(parent, node, outerDeco, innerDeco, view, pos) {\n let custom = view.nodeViews[node.type.name], descObj;\n let spec = custom && custom(node, view, () => {\n if (!descObj)\n return pos;\n if (descObj.parent)\n return descObj.parent.posBeforeChild(descObj);\n }, outerDeco, innerDeco);\n let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom)\n dom = document.createTextNode(node.text);\n else if (dom.nodeType != 3)\n throw new RangeError(\"Text must be rendered as a DOM text node\");\n } else if (!dom) {\n ({ dom, contentDOM } = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)));\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") {\n if (!dom.hasAttribute(\"contenteditable\"))\n dom.contentEditable = \"false\";\n if (node.type.spec.draggable)\n dom.draggable = true;\n }\n let nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n if (spec)\n return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);\n else if (node.isText)\n return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);\n else\n return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);\n }\n parseRule() {\n if (this.node.type.spec.reparseInView)\n return null;\n let rule = { node: this.node.type.name, attrs: this.node.attrs };\n if (this.node.type.whitespace == \"pre\")\n rule.preserveWhitespace = \"full\";\n if (!this.contentDOM) {\n rule.getContent = () => this.node.content;\n } else if (!this.contentLost) {\n rule.contentElement = this.contentDOM;\n } else {\n for (let i = this.children.length - 1; i >= 0; i--) {\n let child = this.children[i];\n if (this.dom.contains(child.dom.parentNode)) {\n rule.contentElement = child.dom.parentNode;\n break;\n }\n }\n if (!rule.contentElement)\n rule.getContent = () => Fragment.empty;\n }\n return rule;\n }\n matchesNode(node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) && sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n }\n get size() {\n return this.node.nodeSize;\n }\n get border() {\n return this.node.isLeaf ? 0 : 1;\n }\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n updateChildren(view, pos) {\n let inline = this.node.inlineContent, off = pos;\n let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n let localComposition = composition && composition.pos > -1 ? composition : null;\n let compositionInChild = composition && composition.pos < 0;\n let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n if (widget.spec.marks)\n updater.syncToMarks(widget.spec.marks, inline, view);\n else if (widget.type.side >= 0 && !insideNode)\n updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view);\n updater.placeWidget(widget, view, off);\n }, (child, outerDeco, innerDeco, i) => {\n updater.syncToMarks(child.marks, inline, view);\n let compIndex;\n if (updater.findNodeMatch(child, outerDeco, innerDeco, i))\n ;\n else if (compositionInChild && view.state.selection.from > off && view.state.selection.to < off + child.nodeSize && (compIndex = updater.findIndexWithChild(composition.node)) > -1 && updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view))\n ;\n else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off))\n ;\n else {\n updater.addNode(child, outerDeco, innerDeco, view, off);\n }\n off += child.nodeSize;\n });\n updater.syncToMarks([], inline, view);\n if (this.node.isTextblock)\n updater.addTextblockHacks();\n updater.destroyRest();\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n if (localComposition)\n this.protectLocalComposition(view, localComposition);\n renderDescs(this.contentDOM, this.children, view);\n if (ios)\n iosHacks(this.dom);\n }\n }\n localCompositionInfo(view, pos) {\n let { from, to } = view.state.selection;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n return null;\n let sel = view.domSelectionRange();\n let textNode = nearbyTextNode(sel.focusNode, sel.focusOffset);\n if (!textNode || !this.dom.contains(textNode.parentNode))\n return null;\n if (this.node.inlineContent) {\n let text = textNode.nodeValue;\n let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n } else {\n return { node: textNode, pos: -1, text: \"\" };\n }\n }\n protectLocalComposition(view, { node, pos, text }) {\n if (this.getDesc(node))\n return;\n let topNode = node;\n for (; ; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM)\n break;\n while (topNode.previousSibling)\n topNode.parentNode.removeChild(topNode.previousSibling);\n while (topNode.nextSibling)\n topNode.parentNode.removeChild(topNode.nextSibling);\n if (topNode.pmViewDesc)\n topNode.pmViewDesc = void 0;\n }\n let desc = new CompositionViewDesc(this, topNode, node, text);\n view.input.compositionNodes.push(desc);\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n }\n // If this desc must be updated to match the given node decoration,\n // do so and return true.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY || !node.sameMarkup(this.node))\n return false;\n this.updateInner(node, outerDeco, innerDeco, view);\n return true;\n }\n updateInner(node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM)\n this.updateChildren(view, this.posAtStart);\n this.dirty = NOT_DIRTY;\n }\n updateOuterDeco(outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco))\n return;\n let needsWrap = this.nodeDOM.nodeType != 1;\n let oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = void 0;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n }\n // Mark this node as being the selected node.\n selectNode() {\n if (this.nodeDOM.nodeType == 1)\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.draggable = true;\n }\n // Remove selected node marking from this node.\n deselectNode() {\n if (this.nodeDOM.nodeType == 1)\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.removeAttribute(\"draggable\");\n }\n get domAtom() {\n return this.node.isAtom;\n }\n}\nfunction docViewDesc(doc2, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc2);\n let docView = new NodeViewDesc(void 0, doc2, outerDeco, innerDeco, dom, dom, dom, view, 0);\n if (docView.contentDOM)\n docView.updateChildren(view, 0);\n return docView;\n}\nclass TextViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);\n }\n parseRule() {\n let skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco)\n skip = skip.parentNode;\n return { skip: skip || true };\n }\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY || this.dirty != NOT_DIRTY && !this.inParent() || !node.sameMarkup(this.node))\n return false;\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM)\n view.trackWrites = null;\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true;\n }\n inParent() {\n let parentDOM = this.parent.contentDOM;\n for (let n = this.nodeDOM; n; n = n.parentNode)\n if (n == parentDOM)\n return true;\n return false;\n }\n domFromPos(pos) {\n return { node: this.nodeDOM, offset: pos };\n }\n localPosFromDOM(dom, offset, bias) {\n if (dom == this.nodeDOM)\n return this.posAtStart + Math.min(offset, this.node.text.length);\n return super.localPosFromDOM(dom, offset, bias);\n }\n ignoreMutation(mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\";\n }\n slice(from, to, view) {\n let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);\n }\n markDirty(from, to) {\n super.markDirty(from, to);\n if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n this.dirty = NODE_DIRTY;\n }\n get domAtom() {\n return false;\n }\n}\nclass TrailingHackViewDesc extends ViewDesc {\n parseRule() {\n return { ignore: true };\n }\n matchesHack(nodeName) {\n return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName;\n }\n get domAtom() {\n return true;\n }\n get ignoreForCoords() {\n return this.dom.nodeName == \"IMG\";\n }\n}\nclass CustomNodeViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY)\n return false;\n if (this.spec.update) {\n let result = this.spec.update(node, outerDeco, innerDeco);\n if (result)\n this.updateInner(node, outerDeco, innerDeco, view);\n return result;\n } else if (!this.contentDOM && !node.isLeaf) {\n return false;\n } else {\n return super.update(node, outerDeco, innerDeco, view);\n }\n }\n selectNode() {\n this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n }\n deselectNode() {\n this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n }\n setSelection(anchor, head, root, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, root) : super.setSelection(anchor, head, root, force);\n }\n destroy() {\n if (this.spec.destroy)\n this.spec.destroy();\n super.destroy();\n }\n stopEvent(event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n }\n ignoreMutation(mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n }\n}\nfunction renderDescs(parentDOM, descs, view) {\n let dom = parentDOM.firstChild, written = false;\n for (let i = 0; i < descs.length; i++) {\n let desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) {\n dom = rm(dom);\n written = true;\n }\n dom = dom.nextSibling;\n } else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) {\n dom = rm(dom);\n written = true;\n }\n if (written && view.trackWrites == parentDOM)\n view.trackWrites = null;\n}\nconst OuterDecoLevel = function(nodeName) {\n if (nodeName)\n this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = /* @__PURE__ */ Object.create(null);\nconst noDeco = [new OuterDecoLevel()];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0)\n return noDeco;\n let top = needsWrap ? noDeco[0] : new OuterDecoLevel(), result = [top];\n for (let i = 0; i < outerDeco.length; i++) {\n let attrs = outerDeco[i].type.attrs;\n if (!attrs)\n continue;\n if (attrs.nodeName)\n result.push(top = new OuterDecoLevel(attrs.nodeName));\n for (let name in attrs) {\n let val = attrs[name];\n if (val == null)\n continue;\n if (needsWrap && result.length == 1)\n result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n if (name == \"class\")\n top.class = (top.class ? top.class + \" \" : \"\") + val;\n else if (name == \"style\")\n top.style = (top.style ? top.style + \";\" : \"\") + val;\n else if (name != \"nodeName\")\n top[name] = val;\n }\n }\n return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n if (prevComputed == noDeco && curComputed == noDeco)\n return nodeDOM;\n let curDOM = nodeDOM;\n for (let i = 0; i < curComputed.length; i++) {\n let deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n let parent;\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM && (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n } else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n for (let name in prev)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n dom.removeAttribute(name);\n for (let name in cur)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n dom.setAttribute(name, cur[name]);\n if (prev.class != cur.class) {\n let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n for (let i = 0; i < prevList.length; i++)\n if (curList.indexOf(prevList[i]) == -1)\n dom.classList.remove(prevList[i]);\n for (let i = 0; i < curList.length; i++)\n if (prevList.indexOf(curList[i]) == -1)\n dom.classList.add(curList[i]);\n if (dom.classList.length == 0)\n dom.removeAttribute(\"class\");\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n dom.style.removeProperty(m[1]);\n }\n if (cur.style)\n dom.style.cssText += cur.style;\n }\n}\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!a[i].type.eq(b[i].type))\n return false;\n return true;\n}\nfunction rm(dom) {\n let next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next;\n}\nclass ViewTreeUpdater {\n constructor(top, lock, view) {\n this.lock = lock;\n this.view = view;\n this.index = 0;\n this.stack = [];\n this.changed = false;\n this.top = top;\n this.preMatch = preMatch(top.node.content, top);\n }\n // Destroy and remove the children between the given indices in\n // `this.top`.\n destroyBetween(start, end) {\n if (start == end)\n return;\n for (let i = start; i < end; i++)\n this.top.children[i].destroy();\n this.top.children.splice(start, end - start);\n this.changed = true;\n }\n // Destroy all remaining children in `this.top`.\n destroyRest() {\n this.destroyBetween(this.index, this.top.children.length);\n }\n // Sync the current stack of mark descs with the given array of\n // marks, reusing existing mark descs when possible.\n syncToMarks(marks, inline, view) {\n let keep = 0, depth = this.stack.length >> 1;\n let maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep && (keep == depth - 1 ? this.top : this.stack[keep + 1 << 1]).matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n keep++;\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n let found = -1;\n for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n let next = this.top.children[i];\n if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n found = i;\n break;\n }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n } else {\n let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n }\n // Try to find a node desc matching the given data. Skip over it and\n // return true when successful.\n findNodeMatch(node, outerDeco, innerDeco, index) {\n let found = -1, targetDesc;\n if (index >= this.preMatch.index && (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top && targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n found = this.top.children.indexOf(targetDesc, this.index);\n } else {\n for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n let child = this.top.children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n found = i;\n break;\n }\n }\n }\n if (found < 0)\n return false;\n this.destroyBetween(this.index, found);\n this.index++;\n return true;\n }\n updateNodeAt(node, outerDeco, innerDeco, index, view) {\n let child = this.top.children[index];\n if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n child.dirty = CONTENT_DIRTY;\n if (!child.update(node, outerDeco, innerDeco, view))\n return false;\n this.destroyBetween(this.index, index);\n this.index++;\n return true;\n }\n findIndexWithChild(domNode) {\n for (; ; ) {\n let parent = domNode.parentNode;\n if (!parent)\n return -1;\n if (parent == this.top.contentDOM) {\n let desc = domNode.pmViewDesc;\n if (desc)\n for (let i = this.index; i < this.top.children.length; i++) {\n if (this.top.children[i] == desc)\n return i;\n }\n return -1;\n }\n domNode = parent;\n }\n }\n // Try to update the next node, if any, to the given data. Checks\n // pre-matches to avoid overwriting nodes that could still be used.\n updateNextNode(node, outerDeco, innerDeco, view, index, pos) {\n for (let i = this.index; i < this.top.children.length; i++) {\n let next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n let preMatch2 = this.preMatch.matched.get(next);\n if (preMatch2 != null && preMatch2 != index)\n return false;\n let nextDOM = next.dom, updated;\n let locked = this.isLocked(nextDOM) && !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text && next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM)\n this.changed = true;\n this.index++;\n return true;\n } else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) {\n this.top.children[this.index] = updated;\n if (updated.contentDOM) {\n updated.dirty = CONTENT_DIRTY;\n updated.updateChildren(view, pos + 1);\n updated.dirty = NOT_DIRTY;\n }\n this.changed = true;\n this.index++;\n return true;\n }\n break;\n }\n }\n return false;\n }\n // When a node with content is replaced by a different node with\n // identical content, move over its children.\n recreateWrapper(next, node, outerDeco, innerDeco, view, pos) {\n if (next.dirty || node.isAtom || !next.children.length || !next.node.content.eq(node.content))\n return null;\n let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n if (wrapper.contentDOM) {\n wrapper.children = next.children;\n next.children = [];\n for (let ch of wrapper.children)\n ch.parent = wrapper;\n }\n next.destroy();\n return wrapper;\n }\n // Insert the node as a newly created node desc.\n addNode(node, outerDeco, innerDeco, view, pos) {\n let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n if (desc.contentDOM)\n desc.updateChildren(view, pos + 1);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n placeWidget(widget, view, pos) {\n let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) && (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n } else {\n let desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n }\n // Make sure a textblock looks and behaves correctly in\n // contentEditable.\n addTextblockHacks() {\n let lastChild = this.top.children[this.index - 1], parent = this.top;\n while (lastChild instanceof MarkViewDesc) {\n parent = lastChild;\n lastChild = parent.children[parent.children.length - 1];\n }\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) || /\\n$/.test(lastChild.node.text) || this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text)) {\n if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n this.addHackNode(\"IMG\", parent);\n this.addHackNode(\"BR\", this.top);\n }\n }\n addHackNode(nodeName, parent) {\n if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n this.index++;\n } else {\n let dom = document.createElement(nodeName);\n if (nodeName == \"IMG\") {\n dom.className = \"ProseMirror-separator\";\n dom.alt = \"\";\n }\n if (nodeName == \"BR\")\n dom.className = \"ProseMirror-trailingBreak\";\n let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n if (parent != this.top)\n parent.children.push(hack);\n else\n parent.children.splice(this.index++, 0, hack);\n this.changed = true;\n }\n }\n isLocked(node) {\n return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n }\n}\nfunction preMatch(frag, parentDesc) {\n let curDesc = parentDesc, descI = curDesc.children.length;\n let fI = frag.childCount, matched = /* @__PURE__ */ new Map(), matches = [];\n outer:\n while (fI > 0) {\n let desc;\n for (; ; ) {\n if (descI) {\n let next = curDesc.children[descI - 1];\n if (next instanceof MarkViewDesc) {\n curDesc = next;\n descI = next.children.length;\n } else {\n desc = next;\n descI--;\n break;\n }\n } else if (curDesc == parentDesc) {\n break outer;\n } else {\n descI = curDesc.parent.children.indexOf(curDesc);\n curDesc = curDesc.parent;\n }\n }\n let node = desc.node;\n if (!node)\n continue;\n if (node != frag.child(fI - 1))\n break;\n --fI;\n matched.set(desc, fI);\n matches.push(desc);\n }\n return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n return a.type.side - b.type.side;\n}\nfunction iterDeco(parent, deco, onWidget, onNode) {\n let locals = deco.locals(parent), offset = 0;\n if (locals.length == 0) {\n for (let i = 0; i < parent.childCount; i++) {\n let child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return;\n }\n let decoIndex = 0, active = [], restNode = null;\n for (let parentIndex = 0; ; ) {\n let widget, widgets;\n while (decoIndex < locals.length && locals[decoIndex].to == offset) {\n let next = locals[decoIndex++];\n if (next.widget) {\n if (!widget)\n widget = next;\n else\n (widgets || (widgets = [widget])).push(next);\n }\n }\n if (widget) {\n if (widgets) {\n widgets.sort(compareSide);\n for (let i = 0; i < widgets.length; i++)\n onWidget(widgets[i], parentIndex, !!restNode);\n } else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n let child, index;\n if (restNode) {\n index = -1;\n child = restNode;\n restNode = null;\n } else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child = parent.child(parentIndex++);\n } else {\n break;\n }\n for (let i = 0; i < active.length; i++)\n if (active[i].to <= offset)\n active.splice(i--, 1);\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n active.push(locals[decoIndex++]);\n let end = offset + child.nodeSize;\n if (child.isText) {\n let cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n cutAt = locals[decoIndex].from;\n for (let i = 0; i < active.length; i++)\n if (active[i].to < cutAt)\n cutAt = active[i].to;\n if (cutAt < end) {\n restNode = child.cut(cutAt - offset);\n child = child.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n } else {\n while (decoIndex < locals.length && locals[decoIndex].to < end)\n decoIndex++;\n }\n let outerDeco = child.isInline && !child.isLeaf ? active.filter((d) => !d.inline) : active.slice();\n onNode(child, outerDeco, deco.forChild(offset, child), index);\n offset = end;\n }\n}\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n let oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\nfunction nearbyTextNode(node, offset) {\n for (; ; ) {\n if (node.nodeType == 3)\n return node;\n if (node.nodeType == 1 && offset > 0) {\n if (node.childNodes.length > offset && node.childNodes[offset].nodeType == 3)\n return node.childNodes[offset];\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n } else if (node.nodeType == 1 && offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n } else {\n return null;\n }\n }\n}\nfunction findTextInFragment(frag, text, from, to) {\n for (let i = 0, pos = 0; i < frag.childCount && pos <= to; ) {\n let child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText)\n continue;\n let str = child.text;\n while (i < frag.childCount) {\n let next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText)\n break;\n str += next.text;\n }\n if (pos >= from) {\n if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text)\n return to - text.length;\n let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n if (found >= 0 && found + text.length + childStart >= from)\n return childStart + found;\n if (from == to && str.length >= to + text.length - childStart && str.slice(to - childStart, to - childStart + text.length) == text)\n return to;\n }\n }\n return -1;\n}\nfunction replaceNodes(nodes, from, to, view, replacement) {\n let result = [];\n for (let i = 0, off = 0; i < nodes.length; i++) {\n let child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n } else {\n if (start < from)\n result.push(child.slice(0, from - start, view));\n if (replacement) {\n result.push(replacement);\n replacement = void 0;\n }\n if (end > to)\n result.push(child.slice(to - start, child.size, view));\n }\n }\n return result;\n}\nfunction selectionFromDOM(view, origin = null) {\n let domSel = view.domSelectionRange(), doc2 = view.state.doc;\n if (!domSel.focusNode)\n return null;\n let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n if (head < 0)\n return null;\n let $head = doc2.resolve(head), $anchor, selection;\n if (selectionCollapsed(domSel)) {\n $anchor = $head;\n while (nearestDesc && !nearestDesc.node)\n nearestDesc = nearestDesc.parent;\n let nearestDescNode = nearestDesc.node;\n if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n let pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc2.resolve(pos));\n }\n } else {\n let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n if (anchor < 0)\n return null;\n $anchor = doc2.resolve(anchor);\n }\n if (!selection) {\n let bias = origin == \"pointer\" || view.state.selection.head < $head.pos && !inWidget ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection;\n}\nfunction editorOwnsSelection(view) {\n return view.editable ? view.hasFocus() : hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n let sel = view.state.selection;\n syncNodeSelection(view, sel);\n if (!editorOwnsSelection(view))\n return;\n if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {\n let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n if (domSel.anchorNode && curSel.anchorNode && isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {\n view.input.mouseDown.delayedSelectionSync = true;\n view.domObserver.setCurSelection();\n return;\n }\n }\n view.domObserver.disconnectSelection();\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n } else {\n let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n resetEditableFrom = temporarilyEditableNear(view, sel.from);\n if (!sel.empty && !sel.$from.parent.inlineContent)\n resetEditableTo = temporarilyEditableNear(view, sel.to);\n }\n view.docView.setSelection(anchor, head, view.root, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom)\n resetEditable(resetEditableFrom);\n if (resetEditableTo)\n resetEditable(resetEditableTo);\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n } else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document)\n removeClassOnSelectionChange(view);\n }\n }\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n let { node, offset } = view.docView.domFromPos(pos, 0);\n let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n let before = offset ? node.childNodes[offset - 1] : null;\n if (safari && after && after.contentEditable == \"false\")\n return setEditable(after);\n if ((!after || after.contentEditable == \"false\") && (!before || before.contentEditable == \"false\")) {\n if (after)\n return setEditable(after);\n else if (before)\n return setEditable(before);\n }\n}\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (safari && element.draggable) {\n element.draggable = false;\n element.wasDraggable = true;\n }\n return element;\n}\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) {\n element.draggable = true;\n element.wasDraggable = null;\n }\n}\nfunction removeClassOnSelectionChange(view) {\n let doc2 = view.dom.ownerDocument;\n doc2.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n let domSel = view.domSelectionRange();\n let node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc2.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc2.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n setTimeout(() => {\n if (!editorOwnsSelection(view) || view.state.selection.visible)\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }, 20);\n }\n });\n}\nfunction selectCursorWrapper(view) {\n let domSel = view.domSelection(), range = document.createRange();\n let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img)\n range.setEnd(node.parentNode, domIndex(node) + 1);\n else\n range.setEnd(node, 0);\n range.collapse(false);\n domSel.removeAllRanges();\n domSel.addRange(range);\n if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n let desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc)\n desc.selectNode();\n view.lastSelectedViewDesc = desc;\n }\n } else {\n clearNodeSelection(view);\n }\n}\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n view.lastSelectedViewDesc.deselectNode();\n view.lastSelectedViewDesc = void 0;\n }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", (f) => f(view, $anchor, $head)) || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n if (view.editable && !view.hasFocus())\n return false;\n return hasSelection(view);\n}\nfunction hasSelection(view) {\n let sel = view.domSelectionRange();\n if (!sel.anchorNode)\n return false;\n try {\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) && (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n } catch (_) {\n return false;\n }\n}\nfunction anchorInRightPlace(view) {\n let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n let domSel = view.domSelectionRange();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\nfunction moveSelectionBlock(state, dir) {\n let { $anchor, $head } = state.selection;\n let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (mods.indexOf(\"s\") > -1) {\n let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter;\n if (!node || node.isText || !node.isLeaf)\n return false;\n let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1));\n return apply(view, new TextSelection(sel.$anchor, $newHead));\n } else if (!sel.empty) {\n return false;\n } else if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && next instanceof NodeSelection)\n return apply(view, next);\n return false;\n } else if (!(mac && mods.indexOf(\"m\") > -1)) {\n let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText)\n return false;\n let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n return false;\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n } else if (webkit) {\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n } else {\n return false;\n }\n }\n } else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n } else {\n let next = moveSelectionBlock(view.state, dir);\n if (next)\n return apply(view, next);\n return false;\n }\n}\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom, dir) {\n let desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != \"BR\");\n}\nfunction skipIgnoredNodes(view, dir) {\n return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);\n}\nfunction skipIgnoredNodesBefore(view) {\n let sel = view.domSelectionRange();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let moveNode, moveOffset, force = false;\n if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))\n force = true;\n for (; ; ) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break;\n } else {\n let before = node.childNodes[offset - 1];\n if (isIgnorable(before, -1)) {\n moveNode = node;\n moveOffset = --offset;\n } else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n } else\n break;\n }\n } else if (isBlockNode(node)) {\n break;\n } else {\n let prev = node.previousSibling;\n while (prev && isIgnorable(prev, -1)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = 0;\n } else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force)\n setSelFocus(view, node, offset);\n else if (moveNode)\n setSelFocus(view, moveNode, moveOffset);\n}\nfunction skipIgnoredNodesAfter(view) {\n let sel = view.domSelectionRange();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let len = nodeLen(node);\n let moveNode, moveOffset;\n for (; ; ) {\n if (offset < len) {\n if (node.nodeType != 1)\n break;\n let after = node.childNodes[offset];\n if (isIgnorable(after, 1)) {\n moveNode = node;\n moveOffset = ++offset;\n } else\n break;\n } else if (isBlockNode(node)) {\n break;\n } else {\n let next = node.nextSibling;\n while (next && isIgnorable(next, 1)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = len = 0;\n } else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode)\n setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n let desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock;\n}\nfunction textNodeAfter(node, offset) {\n while (node && offset == node.childNodes.length && !hasBlockDesc(node)) {\n offset = domIndex(node) + 1;\n node = node.parentNode;\n }\n while (node && offset < node.childNodes.length) {\n let next = node.childNodes[offset];\n if (next.nodeType == 3)\n return next;\n if (next.nodeType == 1 && next.contentEditable == \"false\")\n break;\n node = next;\n offset = 0;\n }\n}\nfunction textNodeBefore(node, offset) {\n while (node && !offset && !hasBlockDesc(node)) {\n offset = domIndex(node);\n node = node.parentNode;\n }\n while (node && offset) {\n let next = node.childNodes[offset - 1];\n if (next.nodeType == 3)\n return next;\n if (next.nodeType == 1 && next.contentEditable == \"false\")\n break;\n node = next;\n offset = node.childNodes.length;\n }\n}\nfunction setSelFocus(view, node, offset) {\n if (node.nodeType != 3) {\n let before, after;\n if (after = textNodeAfter(node, offset)) {\n node = after;\n offset = 0;\n } else if (before = textNodeBefore(node, offset)) {\n node = before;\n offset = before.nodeValue.length;\n }\n }\n let sel = view.domSelection();\n if (selectionCollapsed(sel)) {\n let range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n let { state } = view;\n setTimeout(() => {\n if (view.state == state)\n selectionToDOM(view);\n }, 50);\n}\nfunction findDirection(view, pos) {\n let $pos = view.state.doc.resolve(pos);\n if (!(chrome || windows) && $pos.parent.inlineContent) {\n let coords = view.coordsAtPos(pos);\n if (pos > $pos.start()) {\n let before = view.coordsAtPos(pos - 1);\n let mid = (before.top + before.bottom) / 2;\n if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1)\n return before.left < coords.left ? \"ltr\" : \"rtl\";\n }\n if (pos < $pos.end()) {\n let after = view.coordsAtPos(pos + 1);\n let mid = (after.top + after.bottom) / 2;\n if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1)\n return after.left > coords.left ? \"ltr\" : \"rtl\";\n }\n }\n let computed = getComputedStyle(view.dom).direction;\n return computed == \"rtl\" ? \"rtl\" : \"ltr\";\n}\nfunction selectVertically(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n return false;\n if (mac && mods.indexOf(\"m\") > -1)\n return false;\n let { $from, $to } = sel;\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && next instanceof NodeSelection)\n return apply(view, next);\n }\n if (!$from.parent.inlineContent) {\n let side = dir < 0 ? $from : $to;\n let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n return beyond ? apply(view, beyond) : false;\n }\n return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection))\n return true;\n let { $head, $anchor, empty: empty2 } = view.state.selection;\n if (!$head.sameParent($anchor))\n return true;\n if (!empty2)\n return false;\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n return true;\n let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n let tr = view.state.tr;\n if (dir < 0)\n tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n else\n tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n view.dispatch(tr);\n return true;\n }\n return false;\n}\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\nfunction safariDownArrowBug(view) {\n if (!safari || view.state.selection.$head.parentOffset > 0)\n return false;\n let { focusNode, focusOffset } = view.domSelectionRange();\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 && focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n let child = focusNode.firstChild;\n switchEditable(view, child, \"true\");\n setTimeout(() => switchEditable(view, child, \"false\"), 20);\n }\n return false;\n}\nfunction getMods(event) {\n let result = \"\";\n if (event.ctrlKey)\n result += \"c\";\n if (event.metaKey)\n result += \"m\";\n if (event.altKey)\n result += \"a\";\n if (event.shiftKey)\n result += \"s\";\n return result;\n}\nfunction captureKeyDown(view, event) {\n let code = event.keyCode, mods = getMods(event);\n if (code == 8 || mac && code == 72 && mods == \"c\") {\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);\n } else if (code == 46 && !event.shiftKey || mac && code == 68 && mods == \"c\") {\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);\n } else if (code == 13 || code == 27) {\n return true;\n } else if (code == 37 || mac && code == 66 && mods == \"c\") {\n let dir = code == 37 ? findDirection(view, view.state.selection.from) == \"ltr\" ? -1 : 1 : -1;\n return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n } else if (code == 39 || mac && code == 70 && mods == \"c\") {\n let dir = code == 39 ? findDirection(view, view.state.selection.from) == \"ltr\" ? 1 : -1 : 1;\n return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n } else if (code == 38 || mac && code == 80 && mods == \"c\") {\n return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1);\n } else if (code == 40 || mac && code == 78 && mods == \"c\") {\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1);\n } else if (mods == (mac ? \"m\" : \"c\") && (code == 66 || code == 73 || code == 89 || code == 90)) {\n return true;\n }\n return false;\n}\nfunction serializeForClipboard(view, slice) {\n view.someProp(\"transformCopied\", (f) => {\n slice = f(slice, view);\n });\n let context = [], { content, openStart, openEnd } = slice;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n let node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n let doc2 = detachedDoc(), wrap = doc2.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, { document: doc2 }));\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n let wrapper = doc2.createElement(needsWrap[i]);\n while (wrap.firstChild)\n wrapper.appendChild(wrap.firstChild);\n wrap.appendChild(wrapper);\n wrappers++;\n }\n firstChild = wrap.firstChild;\n }\n if (firstChild && firstChild.nodeType == 1)\n firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n let text = view.someProp(\"clipboardTextSerializer\", (f) => f(slice, view)) || slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n return { dom: wrap, text };\n}\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n let inCode = $context.parent.type.spec.code;\n let dom, slice;\n if (!html && !text)\n return null;\n let asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", (f) => {\n text = f(text, inCode || plainText, view);\n });\n if (inCode)\n return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0) : Slice.empty;\n let parsed = view.someProp(\"clipboardTextParser\", (f) => f(text, $context, plainText, view));\n if (parsed) {\n slice = parsed;\n } else {\n let marks = $context.marks();\n let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n dom = document.createElement(\"div\");\n text.split(/(?:\\r\\n?|\\n)+/).forEach((block) => {\n let p = dom.appendChild(document.createElement(\"p\"));\n if (block)\n p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n });\n }\n } else {\n view.someProp(\"transformPastedHTML\", (f) => {\n html = f(html, view);\n });\n dom = readHTML(html);\n if (webkit)\n restoreReplacedSpaces(dom);\n }\n let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n if (sliceData && sliceData[3])\n for (let i = +sliceData[3]; i > 0; i--) {\n let child = dom.firstChild;\n while (child && child.nodeType != 1)\n child = child.nextSibling;\n if (!child)\n break;\n dom = child;\n }\n if (!slice) {\n let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {\n preserveWhitespace: !!(asText || sliceData),\n context: $context,\n ruleFromNode(dom2) {\n if (dom2.nodeName == \"BR\" && !dom2.nextSibling && dom2.parentNode && !inlineParents.test(dom2.parentNode.nodeName))\n return { ignore: true };\n return null;\n }\n });\n }\n if (sliceData) {\n slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n } else {\n slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n if (slice.openStart || slice.openEnd) {\n let openStart = 0, openEnd = 0;\n for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) {\n }\n for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) {\n }\n slice = closeSlice(slice, openStart, openEnd);\n }\n }\n view.someProp(\"transformPasted\", (f) => {\n slice = f(slice, view);\n });\n return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2)\n return fragment;\n for (let d = $context.depth; d >= 0; d--) {\n let parent = $context.node(d);\n let match = parent.contentMatchAt($context.index(d));\n let lastWrap, result = [];\n fragment.forEach((node) => {\n if (!result)\n return;\n let wrap = match.findWrapping(node.type), inLast;\n if (!wrap)\n return result = null;\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n } else {\n if (result.length)\n result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n let wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type);\n lastWrap = wrap;\n }\n });\n if (result)\n return Fragment.from(result);\n }\n return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n for (let i = wrap.length - 1; i >= from; i--)\n node = wrap[i].create(null, Fragment.from(node));\n return node;\n}\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner)\n return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n let match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n }\n}\nfunction closeRight(node, depth) {\n if (depth == 0)\n return node;\n let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (fragment.childCount > 1)\n openEnd = 0;\n if (depth < to - 1)\n inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n if (depth >= from)\n inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner) : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n if (openEnd < slice.openEnd)\n slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n return slice;\n}\nconst wrapMap = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n};\nlet _detachedDoc = null;\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"));\n}\nfunction readHTML(html) {\n let metas = /^(\\s*]*>)*/.exec(html);\n if (metas)\n html = html.slice(metas[0].length);\n let elt = detachedDoc().createElement(\"div\");\n let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n html = wrap.map((n) => \"<\" + n + \">\").join(\"\") + html + wrap.map((n) => \"\").reverse().join(\"\");\n elt.innerHTML = html;\n if (wrap)\n for (let i = 0; i < wrap.length; i++)\n elt = elt.querySelector(wrap[i]) || elt;\n return elt;\n}\nfunction restoreReplacedSpaces(dom) {\n let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n for (let i = 0; i < nodes.length; i++) {\n let node = nodes[i];\n if (node.childNodes.length == 1 && node.textContent == \"\\xA0\" && node.parentNode)\n node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n }\n}\nfunction addContext(slice, context) {\n if (!slice.size)\n return slice;\n let schema = slice.content.firstChild.type.schema, array;\n try {\n array = JSON.parse(context);\n } catch (e) {\n return slice;\n }\n let { content, openStart, openEnd } = slice;\n for (let i = array.length - 2; i >= 0; i -= 2) {\n let type = schema.nodes[array[i]];\n if (!type || type.hasRequiredAttrs())\n break;\n content = Fragment.from(type.create(array[i + 1], content));\n openStart++;\n openEnd++;\n }\n return new Slice(content, openStart, openEnd);\n}\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n constructor() {\n this.shiftKey = false;\n this.mouseDown = null;\n this.lastKeyCode = null;\n this.lastKeyCodeTime = 0;\n this.lastClick = { time: 0, x: 0, y: 0, type: \"\" };\n this.lastSelectionOrigin = null;\n this.lastSelectionTime = 0;\n this.lastIOSEnter = 0;\n this.lastIOSEnterFallbackTimeout = -1;\n this.lastFocus = 0;\n this.lastTouch = 0;\n this.lastAndroidDelete = 0;\n this.composing = false;\n this.composingTimeout = -1;\n this.compositionNodes = [];\n this.compositionEndedAt = -2e8;\n this.compositionID = 1;\n this.compositionPendingChanges = 0;\n this.domChangeCount = 0;\n this.eventHandlers = /* @__PURE__ */ Object.create(null);\n this.hideSelectionGuard = null;\n }\n}\nfunction initInput(view) {\n for (let event in handlers) {\n let handler = handlers[event];\n view.dom.addEventListener(event, view.input.eventHandlers[event] = (event2) => {\n if (eventBelongsToView(view, event2) && !runCustomHandler(view, event2) && (view.editable || !(event2.type in editHandlers)))\n handler(view, event2);\n }, passiveHandlers[event] ? { passive: true } : void 0);\n }\n if (safari)\n view.dom.addEventListener(\"input\", () => null);\n ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n view.input.lastSelectionOrigin = origin;\n view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n view.domObserver.stop();\n for (let type in view.input.eventHandlers)\n view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n clearTimeout(view.input.composingTimeout);\n clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n view.someProp(\"handleDOMEvents\", (currentHandlers) => {\n for (let type in currentHandlers)\n if (!view.input.eventHandlers[type])\n view.dom.addEventListener(type, view.input.eventHandlers[type] = (event) => runCustomHandler(view, event));\n });\n}\nfunction runCustomHandler(view, event) {\n return view.someProp(\"handleDOMEvents\", (handlers2) => {\n let handler = handlers2[event.type];\n return handler ? handler(view, event) || event.defaultPrevented : false;\n });\n}\nfunction eventBelongsToView(view, event) {\n if (!event.bubbles)\n return true;\n if (event.defaultPrevented)\n return false;\n for (let node = event.target; node != view.dom; node = node.parentNode)\n if (!node || node.nodeType == 11 || node.pmViewDesc && node.pmViewDesc.stopEvent(event))\n return false;\n return true;\n}\nfunction dispatchEvent(view, event) {\n if (!runCustomHandler(view, event) && handlers[event.type] && (view.editable || !(event.type in editHandlers)))\n handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n let event = _event;\n view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n if (inOrNearComposition(view, event))\n return;\n view.input.lastKeyCode = event.keyCode;\n view.input.lastKeyCodeTime = Date.now();\n if (android && chrome && event.keyCode == 13)\n return;\n if (event.keyCode != 229)\n view.domObserver.forceFlush();\n if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n let now = Date.now();\n view.input.lastIOSEnter = now;\n view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n if (view.input.lastIOSEnter == now) {\n view.someProp(\"handleKeyDown\", (f) => f(view, keyEvent(13, \"Enter\")));\n view.input.lastIOSEnter = 0;\n }\n }, 200);\n } else if (view.someProp(\"handleKeyDown\", (f) => f(view, event)) || captureKeyDown(view, event)) {\n event.preventDefault();\n } else {\n setSelectionOrigin(view, \"key\");\n }\n};\neditHandlers.keyup = (view, event) => {\n if (event.keyCode == 16)\n view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n let event = _event;\n if (inOrNearComposition(view, event) || !event.charCode || event.ctrlKey && !event.altKey || mac && event.metaKey)\n return;\n if (view.someProp(\"handleKeyPress\", (f) => f(view, event))) {\n event.preventDefault();\n return;\n }\n let sel = view.state.selection;\n if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n let text = String.fromCharCode(event.charCode);\n if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", (f) => f(view, sel.$from.pos, sel.$to.pos, text)))\n view.dispatch(view.state.tr.insertText(text).scrollIntoView());\n event.preventDefault();\n }\n};\nfunction eventCoords(event) {\n return { left: event.clientX, top: event.clientY };\n}\nfunction isNear(event, click) {\n let dx = click.x - event.clientX, dy = click.y - event.clientY;\n return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n if (inside == -1)\n return false;\n let $pos = view.state.doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n if (view.someProp(propName, (f) => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true) : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n return true;\n }\n return false;\n}\nfunction updateSelection(view, selection, origin) {\n if (!view.focused)\n view.focus();\n let tr = view.state.tr.setSelection(selection);\n if (origin == \"pointer\")\n tr.setMeta(\"pointer\", true);\n view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n if (inside == -1)\n return false;\n let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n updateSelection(view, new NodeSelection($pos), \"pointer\");\n return true;\n }\n return false;\n}\nfunction selectClickedNode(view, inside) {\n if (inside == -1)\n return false;\n let sel = view.state.selection, selectedNode, selectAt;\n if (sel instanceof NodeSelection)\n selectedNode = sel.node;\n let $pos = view.state.doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n if (NodeSelection.isSelectable(node)) {\n if (selectedNode && sel.$from.depth > 0 && i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n selectAt = $pos.before(sel.$from.depth);\n else\n selectAt = $pos.before(i);\n break;\n }\n }\n if (selectAt != null) {\n updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n return true;\n } else {\n return false;\n }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) || view.someProp(\"handleClick\", (f) => f(view, pos, event)) || (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) || view.someProp(\"handleDoubleClick\", (f) => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) || view.someProp(\"handleTripleClick\", (f) => f(view, pos, event)) || defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n if (event.button != 0)\n return false;\n let doc2 = view.state.doc;\n if (inside == -1) {\n if (doc2.inlineContent) {\n updateSelection(view, TextSelection.create(doc2, 0, doc2.content.size), \"pointer\");\n return true;\n }\n return false;\n }\n let $pos = doc2.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n let nodePos = $pos.before(i);\n if (node.inlineContent)\n updateSelection(view, TextSelection.create(doc2, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\");\n else if (NodeSelection.isSelectable(node))\n updateSelection(view, NodeSelection.create(doc2, nodePos), \"pointer\");\n else\n continue;\n return true;\n }\n}\nfunction forceDOMFlush(view) {\n return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n let event = _event;\n view.input.shiftKey = event.shiftKey;\n let flushed = forceDOMFlush(view);\n let now = Date.now(), type = \"singleClick\";\n if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier]) {\n if (view.input.lastClick.type == \"singleClick\")\n type = \"doubleClick\";\n else if (view.input.lastClick.type == \"doubleClick\")\n type = \"tripleClick\";\n }\n view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type };\n let pos = view.posAtCoords(eventCoords(event));\n if (!pos)\n return;\n if (type == \"singleClick\") {\n if (view.input.mouseDown)\n view.input.mouseDown.done();\n view.input.mouseDown = new MouseDown(view, pos, event, !!flushed);\n } else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n event.preventDefault();\n } else {\n setSelectionOrigin(view, \"pointer\");\n }\n};\nclass MouseDown {\n constructor(view, pos, event, flushed) {\n this.view = view;\n this.pos = pos;\n this.event = event;\n this.flushed = flushed;\n this.delayedSelectionSync = false;\n this.mightDrag = null;\n this.startDoc = view.state.doc;\n this.selectNode = !!event[selectNodeModifier];\n this.allowDefault = event.shiftKey;\n let targetNode, targetPos;\n if (pos.inside > -1) {\n targetNode = view.state.doc.nodeAt(pos.inside);\n targetPos = pos.inside;\n } else {\n let $pos = view.state.doc.resolve(pos.pos);\n targetNode = $pos.parent;\n targetPos = $pos.depth ? $pos.before() : 0;\n }\n const target = flushed ? null : event.target;\n const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n this.target = targetDesc ? targetDesc.dom : null;\n let { selection } = view.state;\n if (event.button == 0 && targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false || selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos)\n this.mightDrag = {\n node: targetNode,\n pos: targetPos,\n addAttr: !!(this.target && !this.target.draggable),\n setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n };\n if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr)\n this.target.draggable = true;\n if (this.mightDrag.setUneditable)\n setTimeout(() => {\n if (this.view.input.mouseDown == this)\n this.target.setAttribute(\"contentEditable\", \"false\");\n }, 20);\n this.view.domObserver.start();\n }\n view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n setSelectionOrigin(view, \"pointer\");\n }\n done() {\n this.view.root.removeEventListener(\"mouseup\", this.up);\n this.view.root.removeEventListener(\"mousemove\", this.move);\n if (this.mightDrag && this.target) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr)\n this.target.removeAttribute(\"draggable\");\n if (this.mightDrag.setUneditable)\n this.target.removeAttribute(\"contentEditable\");\n this.view.domObserver.start();\n }\n if (this.delayedSelectionSync)\n setTimeout(() => selectionToDOM(this.view));\n this.view.input.mouseDown = null;\n }\n up(event) {\n this.done();\n if (!this.view.dom.contains(event.target))\n return;\n let pos = this.pos;\n if (this.view.state.doc != this.startDoc)\n pos = this.view.posAtCoords(eventCoords(event));\n this.updateAllowDefault(event);\n if (this.allowDefault || !pos) {\n setSelectionOrigin(this.view, \"pointer\");\n } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n event.preventDefault();\n } else if (event.button == 0 && (this.flushed || // Safari ignores clicks on draggable elements\n safari && this.mightDrag && !this.mightDrag.node.isAtom || // Chrome will sometimes treat a node selection as a\n // cursor, but still report that the node is selected\n // when asked through getSelection. You'll then get a\n // situation where clicking at the point where that\n // (hidden) cursor is doesn't change the selection, and\n // thus doesn't get a reaction from ProseMirror. This\n // works around that.\n chrome && !this.view.state.selection.visible && Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2)) {\n updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n event.preventDefault();\n } else {\n setSelectionOrigin(this.view, \"pointer\");\n }\n }\n move(event) {\n this.updateAllowDefault(event);\n setSelectionOrigin(this.view, \"pointer\");\n if (event.buttons == 0)\n this.done();\n }\n updateAllowDefault(event) {\n if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 || Math.abs(this.event.y - event.clientY) > 4))\n this.allowDefault = true;\n }\n}\nhandlers.touchstart = (view) => {\n view.input.lastTouch = Date.now();\n forceDOMFlush(view);\n setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = (view) => {\n view.input.lastTouch = Date.now();\n setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = (view) => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n if (view.composing)\n return true;\n if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) {\n view.input.compositionEndedAt = -2e8;\n return true;\n }\n return false;\n}\nconst timeoutComposition = android ? 5e3 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = (view) => {\n if (!view.composing) {\n view.domObserver.flush();\n let { state } = view, $pos = state.selection.$from;\n if (state.selection.empty && (state.storedMarks || !$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some((m) => m.type.spec.inclusive === false))) {\n view.markCursor = view.state.storedMarks || $pos.marks();\n endComposition(view, true);\n view.markCursor = null;\n } else {\n endComposition(view);\n if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n let sel = view.domSelectionRange();\n for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0; ) {\n let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n if (!before)\n break;\n if (before.nodeType == 3) {\n view.domSelection().collapse(before, before.nodeValue.length);\n break;\n } else {\n node = before;\n offset = -1;\n }\n }\n }\n }\n view.input.composing = true;\n }\n scheduleComposeEnd(view, timeoutComposition);\n};\neditHandlers.compositionend = (view, event) => {\n if (view.composing) {\n view.input.composing = false;\n view.input.compositionEndedAt = event.timeStamp;\n view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;\n if (view.input.compositionPendingChanges)\n Promise.resolve().then(() => view.domObserver.flush());\n view.input.compositionID++;\n scheduleComposeEnd(view, 20);\n }\n};\nfunction scheduleComposeEnd(view, delay) {\n clearTimeout(view.input.composingTimeout);\n if (delay > -1)\n view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n if (view.composing) {\n view.input.composing = false;\n view.input.compositionEndedAt = timestampFromCustomEvent();\n }\n while (view.input.compositionNodes.length > 0)\n view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction timestampFromCustomEvent() {\n let event = document.createEvent(\"Event\");\n event.initEvent(\"event\", true, true);\n return event.timeStamp;\n}\nfunction endComposition(view, forceUpdate = false) {\n if (android && view.domObserver.flushingSoon >= 0)\n return;\n view.domObserver.forceFlush();\n clearComposition(view);\n if (forceUpdate || view.docView && view.docView.dirty) {\n let sel = selectionFromDOM(view);\n if (sel && !sel.eq(view.state.selection))\n view.dispatch(view.state.tr.setSelection(sel));\n else\n view.updateState(view.state);\n return true;\n }\n return false;\n}\nfunction captureCopy(view, dom) {\n if (!view.dom.parentNode)\n return;\n let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n wrap.appendChild(dom);\n wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n let sel = getSelection(), range = document.createRange();\n range.selectNodeContents(dom);\n view.dom.blur();\n sel.removeAllRanges();\n sel.addRange(range);\n setTimeout(() => {\n if (wrap.parentNode)\n wrap.parentNode.removeChild(wrap);\n view.focus();\n }, 50);\n}\nconst brokenClipboardAPI = ie && ie_version < 15 || ios && webkit_version < 604;\nhandlers.copy = editHandlers.cut = (view, _event) => {\n let event = _event;\n let sel = view.state.selection, cut = event.type == \"cut\";\n if (sel.empty)\n return;\n let data = brokenClipboardAPI ? null : event.clipboardData;\n let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n if (data) {\n event.preventDefault();\n data.clearData();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n } else {\n captureCopy(view, dom);\n }\n if (cut)\n view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n if (!view.dom.parentNode)\n return;\n let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n if (!plainText)\n target.contentEditable = \"true\";\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n setTimeout(() => {\n view.focus();\n if (target.parentNode)\n target.parentNode.removeChild(target);\n if (plainText)\n doPaste(view, target.value, null, plain, event);\n else\n doPaste(view, target.textContent, target.innerHTML, plain, event);\n }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n if (view.someProp(\"handlePaste\", (f) => f(view, event, slice || Slice.empty)))\n return true;\n if (!slice)\n return false;\n let singleNode = sliceSingleNode(slice);\n let tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, preferPlain) : view.state.tr.replaceSelection(slice);\n view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n return true;\n}\nfunction getText(clipboardData) {\n let text = clipboardData.getData(\"text/plain\") || clipboardData.getData(\"Text\");\n if (text)\n return text;\n let uris = clipboardData.getData(\"text/uri-list\");\n return uris ? uris.replace(/\\r?\\n/g, \" \") : \"\";\n}\neditHandlers.paste = (view, _event) => {\n let event = _event;\n if (view.composing && !android)\n return;\n let data = brokenClipboardAPI ? null : event.clipboardData;\n let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n if (data && doPaste(view, getText(data), data.getData(\"text/html\"), plain, event))\n event.preventDefault();\n else\n capturePaste(view, event);\n};\nclass Dragging {\n constructor(slice, move, node) {\n this.slice = slice;\n this.move = move;\n this.node = node;\n }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nhandlers.dragstart = (view, _event) => {\n let event = _event;\n let mouseDown = view.input.mouseDown;\n if (mouseDown)\n mouseDown.done();\n if (!event.dataTransfer)\n return;\n let sel = view.state.selection;\n let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n let node;\n if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to))\n ;\n else if (mouseDown && mouseDown.mightDrag) {\n node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);\n } else if (event.target && event.target.nodeType == 1) {\n let desc = view.docView.nearestDesc(event.target, true);\n if (desc && desc.node.type.spec.draggable && desc != view.docView)\n node = NodeSelection.create(view.state.doc, desc.posBefore);\n }\n let slice = (node || view.state.selection).content(), { dom, text } = serializeForClipboard(view, slice);\n event.dataTransfer.clearData();\n event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n event.dataTransfer.effectAllowed = \"copyMove\";\n if (!brokenClipboardAPI)\n event.dataTransfer.setData(\"text/plain\", text);\n view.dragging = new Dragging(slice, !event[dragCopyModifier], node);\n};\nhandlers.dragend = (view) => {\n let dragging = view.dragging;\n window.setTimeout(() => {\n if (view.dragging == dragging)\n view.dragging = null;\n }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, _event) => {\n let event = _event;\n let dragging = view.dragging;\n view.dragging = null;\n if (!event.dataTransfer)\n return;\n let eventPos = view.posAtCoords(eventCoords(event));\n if (!eventPos)\n return;\n let $mouse = view.state.doc.resolve(eventPos.pos);\n let slice = dragging && dragging.slice;\n if (slice) {\n view.someProp(\"transformPasted\", (f) => {\n slice = f(slice, view);\n });\n } else {\n slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n }\n let move = !!(dragging && !event[dragCopyModifier]);\n if (view.someProp(\"handleDrop\", (f) => f(view, event, slice || Slice.empty, move))) {\n event.preventDefault();\n return;\n }\n if (!slice)\n return;\n event.preventDefault();\n let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n if (insertPos == null)\n insertPos = $mouse.pos;\n let tr = view.state.tr;\n if (move) {\n let { node } = dragging;\n if (node)\n node.replace(tr);\n else\n tr.deleteSelection();\n }\n let pos = tr.mapping.map(insertPos);\n let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n let beforeInsert = tr.doc;\n if (isNode)\n tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n else\n tr.replaceRange(pos, pos, slice);\n if (tr.doc.eq(beforeInsert))\n return;\n let $pos = tr.doc.resolve(pos);\n if (isNode && NodeSelection.isSelectable(slice.content.firstChild) && $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n tr.setSelection(new NodeSelection($pos));\n } else {\n let end = tr.mapping.map(insertPos);\n tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n }\n view.focus();\n view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\nhandlers.focus = (view) => {\n view.input.lastFocus = Date.now();\n if (!view.focused) {\n view.domObserver.stop();\n view.dom.classList.add(\"ProseMirror-focused\");\n view.domObserver.start();\n view.focused = true;\n setTimeout(() => {\n if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n selectionToDOM(view);\n }, 20);\n }\n};\nhandlers.blur = (view, _event) => {\n let event = _event;\n if (view.focused) {\n view.domObserver.stop();\n view.dom.classList.remove(\"ProseMirror-focused\");\n view.domObserver.start();\n if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n view.domObserver.currentSelection.clear();\n view.focused = false;\n }\n};\nhandlers.beforeinput = (view, _event) => {\n let event = _event;\n if (chrome && android && event.inputType == \"deleteContentBackward\") {\n view.domObserver.flushSoon();\n let { domChangeCount } = view.input;\n setTimeout(() => {\n if (view.input.domChangeCount != domChangeCount)\n return;\n view.dom.blur();\n view.focus();\n if (view.someProp(\"handleKeyDown\", (f) => f(view, keyEvent(8, \"Backspace\"))))\n return;\n let { $cursor } = view.state.selection;\n if ($cursor && $cursor.pos > 0)\n view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n }, 50);\n }\n};\nfor (let prop in editHandlers)\n handlers[prop] = editHandlers[prop];\nfunction compareObjs(a, b) {\n if (a == b)\n return true;\n for (let p in a)\n if (a[p] !== b[p])\n return false;\n for (let p in b)\n if (!(p in a))\n return false;\n return true;\n}\nclass WidgetType {\n constructor(toDOM, spec) {\n this.toDOM = toDOM;\n this.spec = spec || noSpec;\n this.side = this.spec.side || 0;\n }\n map(mapping, span, offset, oldOffset) {\n let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n }\n valid() {\n return true;\n }\n eq(other) {\n return this == other || other instanceof WidgetType && (this.spec.key && this.spec.key == other.spec.key || this.toDOM == other.toDOM && compareObjs(this.spec, other.spec));\n }\n destroy(node) {\n if (this.spec.destroy)\n this.spec.destroy(node);\n }\n}\nclass InlineType {\n constructor(attrs, spec) {\n this.attrs = attrs;\n this.spec = spec || noSpec;\n }\n map(mapping, span, offset, oldOffset) {\n let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n return from >= to ? null : new Decoration(from, to, this);\n }\n valid(_, span) {\n return span.from < span.to;\n }\n eq(other) {\n return this == other || other instanceof InlineType && compareObjs(this.attrs, other.attrs) && compareObjs(this.spec, other.spec);\n }\n static is(span) {\n return span.type instanceof InlineType;\n }\n destroy() {\n }\n}\nclass NodeType {\n constructor(attrs, spec) {\n this.attrs = attrs;\n this.spec = spec || noSpec;\n }\n map(mapping, span, offset, oldOffset) {\n let from = mapping.mapResult(span.from + oldOffset, 1);\n if (from.deleted)\n return null;\n let to = mapping.mapResult(span.to + oldOffset, -1);\n if (to.deleted || to.pos <= from.pos)\n return null;\n return new Decoration(from.pos - offset, to.pos - offset, this);\n }\n valid(node, span) {\n let { index, offset } = node.content.findIndex(span.from), child;\n return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n }\n eq(other) {\n return this == other || other instanceof NodeType && compareObjs(this.attrs, other.attrs) && compareObjs(this.spec, other.spec);\n }\n destroy() {\n }\n}\nclass Decoration {\n /**\n @internal\n */\n constructor(from, to, type) {\n this.from = from;\n this.to = to;\n this.type = type;\n }\n /**\n @internal\n */\n copy(from, to) {\n return new Decoration(from, to, this.type);\n }\n /**\n @internal\n */\n eq(other, offset = 0) {\n return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n }\n /**\n @internal\n */\n map(mapping, offset, oldOffset) {\n return this.type.map(mapping, this, offset, oldOffset);\n }\n /**\n Creates a widget decoration, which is a DOM node that's shown in\n the document at the given position. It is recommended that you\n delay rendering the widget by passing a function that will be\n called when the widget is actually drawn in a view, but you can\n also directly pass a DOM node. `getPos` can be used to find the\n widget's current document position.\n */\n static widget(pos, toDOM, spec) {\n return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n }\n /**\n Creates an inline decoration, which adds the given attributes to\n each inline node between `from` and `to`.\n */\n static inline(from, to, attrs, spec) {\n return new Decoration(from, to, new InlineType(attrs, spec));\n }\n /**\n Creates a node decoration. `from` and `to` should point precisely\n before and after a node in the document. That node, and only that\n node, will receive the given attributes.\n */\n static node(from, to, attrs, spec) {\n return new Decoration(from, to, new NodeType(attrs, spec));\n }\n /**\n The spec provided when creating this decoration. Can be useful\n if you've stored extra information in that object.\n */\n get spec() {\n return this.type.spec;\n }\n /**\n @internal\n */\n get inline() {\n return this.type instanceof InlineType;\n }\n /**\n @internal\n */\n get widget() {\n return this.type instanceof WidgetType;\n }\n}\nconst none = [], noSpec = {};\nclass DecorationSet {\n /**\n @internal\n */\n constructor(local, children) {\n this.local = local.length ? local : none;\n this.children = children.length ? children : none;\n }\n /**\n Create a set of decorations, using the structure of the given\n document. This will consume (modify) the `decorations` array, so\n you must make a copy if you want need to preserve that.\n */\n static create(doc2, decorations) {\n return decorations.length ? buildTree(decorations, doc2, 0, noSpec) : empty;\n }\n /**\n Find all decorations in this set which touch the given range\n (including decorations that start or end directly at the\n boundaries) and match the given predicate on their spec. When\n `start` and `end` are omitted, all decorations in the set are\n considered. When `predicate` isn't given, all decorations are\n assumed to match.\n */\n find(start, end, predicate) {\n let result = [];\n this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n return result;\n }\n findInner(start, end, result, offset, predicate) {\n for (let i = 0; i < this.local.length; i++) {\n let span = this.local[i];\n if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n result.push(span.copy(span.from + offset, span.to + offset));\n }\n for (let i = 0; i < this.children.length; i += 3) {\n if (this.children[i] < end && this.children[i + 1] > start) {\n let childOff = this.children[i] + 1;\n this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n }\n }\n }\n /**\n Map the set of decorations in response to a change in the\n document.\n */\n map(mapping, doc2, options) {\n if (this == empty || mapping.maps.length == 0)\n return this;\n return this.mapInner(mapping, doc2, 0, 0, options || noSpec);\n }\n /**\n @internal\n */\n mapInner(mapping, node, offset, oldOffset, options) {\n let newLocal;\n for (let i = 0; i < this.local.length; i++) {\n let mapped = this.local[i].map(mapping, offset, oldOffset);\n if (mapped && mapped.type.valid(node, mapped))\n (newLocal || (newLocal = [])).push(mapped);\n else if (options.onRemove)\n options.onRemove(this.local[i].spec);\n }\n if (this.children.length)\n return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n else\n return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n }\n /**\n Add the given array of decorations to the ones in the set,\n producing a new set. Consumes the `decorations` array. Needs\n access to the current document to create the appropriate tree\n structure.\n */\n add(doc2, decorations) {\n if (!decorations.length)\n return this;\n if (this == empty)\n return DecorationSet.create(doc2, decorations);\n return this.addInner(doc2, decorations, 0);\n }\n addInner(doc2, decorations, offset) {\n let children, childIndex = 0;\n doc2.forEach((childNode, childOffset) => {\n let baseOffset = childOffset + offset, found;\n if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n return;\n if (!children)\n children = this.children.slice();\n while (childIndex < children.length && children[childIndex] < childOffset)\n childIndex += 3;\n if (children[childIndex] == childOffset)\n children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n else\n children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n childIndex += 3;\n });\n let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n for (let i = 0; i < local.length; i++)\n if (!local[i].type.valid(doc2, local[i]))\n local.splice(i--, 1);\n return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n }\n /**\n Create a new set that contains the decorations in this set, minus\n the ones in the given array.\n */\n remove(decorations) {\n if (decorations.length == 0 || this == empty)\n return this;\n return this.removeInner(decorations, 0);\n }\n removeInner(decorations, offset) {\n let children = this.children, local = this.local;\n for (let i = 0; i < children.length; i += 3) {\n let found;\n let from = children[i] + offset, to = children[i + 1] + offset;\n for (let j = 0, span; j < decorations.length; j++)\n if (span = decorations[j]) {\n if (span.from > from && span.to < to) {\n decorations[j] = null;\n (found || (found = [])).push(span);\n }\n }\n if (!found)\n continue;\n if (children == this.children)\n children = this.children.slice();\n let removed = children[i + 2].removeInner(found, from + 1);\n if (removed != empty) {\n children[i + 2] = removed;\n } else {\n children.splice(i, 3);\n i -= 3;\n }\n }\n if (local.length) {\n for (let i = 0, span; i < decorations.length; i++)\n if (span = decorations[i]) {\n for (let j = 0; j < local.length; j++)\n if (local[j].eq(span, offset)) {\n if (local == this.local)\n local = this.local.slice();\n local.splice(j--, 1);\n }\n }\n }\n if (children == this.children && local == this.local)\n return this;\n return local.length || children.length ? new DecorationSet(local, children) : empty;\n }\n /**\n @internal\n */\n forChild(offset, node) {\n if (this == empty)\n return this;\n if (node.isLeaf)\n return DecorationSet.empty;\n let child, local;\n for (let i = 0; i < this.children.length; i += 3)\n if (this.children[i] >= offset) {\n if (this.children[i] == offset)\n child = this.children[i + 2];\n break;\n }\n let start = offset + 1, end = start + node.content.size;\n for (let i = 0; i < this.local.length; i++) {\n let dec = this.local[i];\n if (dec.from < end && dec.to > start && dec.type instanceof InlineType) {\n let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n if (from < to)\n (local || (local = [])).push(dec.copy(from, to));\n }\n }\n if (local) {\n let localSet = new DecorationSet(local.sort(byPos), none);\n return child ? new DecorationGroup([localSet, child]) : localSet;\n }\n return child || empty;\n }\n /**\n @internal\n */\n eq(other) {\n if (this == other)\n return true;\n if (!(other instanceof DecorationSet) || this.local.length != other.local.length || this.children.length != other.children.length)\n return false;\n for (let i = 0; i < this.local.length; i++)\n if (!this.local[i].eq(other.local[i]))\n return false;\n for (let i = 0; i < this.children.length; i += 3)\n if (this.children[i] != other.children[i] || this.children[i + 1] != other.children[i + 1] || !this.children[i + 2].eq(other.children[i + 2]))\n return false;\n return true;\n }\n /**\n @internal\n */\n locals(node) {\n return removeOverlap(this.localsInner(node));\n }\n /**\n @internal\n */\n localsInner(node) {\n if (this == empty)\n return none;\n if (node.inlineContent || !this.local.some(InlineType.is))\n return this.local;\n let result = [];\n for (let i = 0; i < this.local.length; i++) {\n if (!(this.local[i].type instanceof InlineType))\n result.push(this.local[i]);\n }\n return result;\n }\n}\nDecorationSet.empty = new DecorationSet([], []);\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\nclass DecorationGroup {\n constructor(members) {\n this.members = members;\n }\n map(mapping, doc2) {\n const mappedDecos = this.members.map((member) => member.map(mapping, doc2, noSpec));\n return DecorationGroup.from(mappedDecos);\n }\n forChild(offset, child) {\n if (child.isLeaf)\n return DecorationSet.empty;\n let found = [];\n for (let i = 0; i < this.members.length; i++) {\n let result = this.members[i].forChild(offset, child);\n if (result == empty)\n continue;\n if (result instanceof DecorationGroup)\n found = found.concat(result.members);\n else\n found.push(result);\n }\n return DecorationGroup.from(found);\n }\n eq(other) {\n if (!(other instanceof DecorationGroup) || other.members.length != this.members.length)\n return false;\n for (let i = 0; i < this.members.length; i++)\n if (!this.members[i].eq(other.members[i]))\n return false;\n return true;\n }\n locals(node) {\n let result, sorted = true;\n for (let i = 0; i < this.members.length; i++) {\n let locals = this.members[i].localsInner(node);\n if (!locals.length)\n continue;\n if (!result) {\n result = locals;\n } else {\n if (sorted) {\n result = result.slice();\n sorted = false;\n }\n for (let j = 0; j < locals.length; j++)\n result.push(locals[j]);\n }\n }\n return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n }\n // Create a group for the given array of decoration sets, or return\n // a single set when possible.\n static from(members) {\n switch (members.length) {\n case 0:\n return empty;\n case 1:\n return members[0];\n default:\n return new DecorationGroup(members.every((m) => m instanceof DecorationSet) ? members : members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n }\n }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n let children = oldChildren.slice();\n for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n let moved = 0;\n mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n let dSize = newEnd - newStart - (oldEnd - oldStart);\n for (let i2 = 0; i2 < children.length; i2 += 3) {\n let end = children[i2 + 1];\n if (end < 0 || oldStart > end + baseOffset - moved)\n continue;\n let start = children[i2] + baseOffset - moved;\n if (oldEnd >= start) {\n children[i2 + 1] = oldStart <= start ? -2 : -1;\n } else if (oldStart >= baseOffset && dSize) {\n children[i2] += dSize;\n children[i2 + 1] += dSize;\n }\n }\n moved += dSize;\n });\n baseOffset = mapping.maps[i].map(baseOffset, -1);\n }\n let mustRebuild = false;\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] < 0) {\n if (children[i + 1] == -2) {\n mustRebuild = true;\n children[i + 1] = -1;\n continue;\n }\n let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n if (fromLocal < 0 || fromLocal >= node.content.size) {\n mustRebuild = true;\n continue;\n }\n let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n let childNode = node.maybeChild(index);\n if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n let mapped = children[i + 2].mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n if (mapped != empty) {\n children[i] = fromLocal;\n children[i + 1] = toLocal;\n children[i + 2] = mapped;\n } else {\n children[i + 1] = -2;\n mustRebuild = true;\n }\n } else {\n mustRebuild = true;\n }\n }\n if (mustRebuild) {\n let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n let built = buildTree(decorations, node, 0, options);\n newLocal = built.local;\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] < 0) {\n children.splice(i, 3);\n i -= 3;\n }\n for (let i = 0, j = 0; i < built.children.length; i += 3) {\n let from = built.children[i];\n while (j < children.length && children[j] < from)\n j += 3;\n children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n }\n }\n return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n if (!offset || !spans.length)\n return spans;\n let result = [];\n for (let i = 0; i < spans.length; i++) {\n let span = spans[i];\n result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n }\n return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n function gather(set, oldOffset2) {\n for (let i = 0; i < set.local.length; i++) {\n let mapped = set.local[i].map(mapping, offset, oldOffset2);\n if (mapped)\n decorations.push(mapped);\n else if (options.onRemove)\n options.onRemove(set.local[i].spec);\n }\n for (let i = 0; i < set.children.length; i += 3)\n gather(set.children[i + 2], set.children[i] + oldOffset2 + 1);\n }\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] == -1)\n gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n if (node.isLeaf)\n return null;\n let end = offset + node.nodeSize, found = null;\n for (let i = 0, span; i < spans.length; i++) {\n if ((span = spans[i]) && span.from > offset && span.to < end) {\n (found || (found = [])).push(span);\n spans[i] = null;\n }\n }\n return found;\n}\nfunction withoutNulls(array) {\n let result = [];\n for (let i = 0; i < array.length; i++)\n if (array[i] != null)\n result.push(array[i]);\n return result;\n}\nfunction buildTree(spans, node, offset, options) {\n let children = [], hasNulls = false;\n node.forEach((childNode, localStart) => {\n let found = takeSpansForNode(spans, childNode, localStart + offset);\n if (found) {\n hasNulls = true;\n let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n if (subtree != empty)\n children.push(localStart, localStart + childNode.nodeSize, subtree);\n }\n });\n let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n for (let i = 0; i < locals.length; i++)\n if (!locals[i].type.valid(node, locals[i])) {\n if (options.onRemove)\n options.onRemove(locals[i].spec);\n locals.splice(i--, 1);\n }\n return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\nfunction byPos(a, b) {\n return a.from - b.from || a.to - b.to;\n}\nfunction removeOverlap(spans) {\n let working = spans;\n for (let i = 0; i < working.length - 1; i++) {\n let span = working[i];\n if (span.from != span.to)\n for (let j = i + 1; j < working.length; j++) {\n let next = working[j];\n if (next.from == span.from) {\n if (next.to != span.to) {\n if (working == spans)\n working = spans.slice();\n working[j] = next.copy(next.from, span.to);\n insertAhead(working, j + 1, next.copy(span.to, next.to));\n }\n continue;\n } else {\n if (next.from < span.to) {\n if (working == spans)\n working = spans.slice();\n working[i] = span.copy(span.from, next.from);\n insertAhead(working, j, span.copy(next.from, span.to));\n }\n break;\n }\n }\n }\n return working;\n}\nfunction insertAhead(array, i, deco) {\n while (i < array.length && byPos(deco, array[i]) > 0)\n i++;\n array.splice(i, 0, deco);\n}\nfunction viewDecorations(view) {\n let found = [];\n view.someProp(\"decorations\", (f) => {\n let result = f(view.state);\n if (result && result != empty)\n found.push(result);\n });\n if (view.cursorWrapper)\n found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n return DecorationGroup.from(found);\n}\nconst observeOptions = {\n childList: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeOldValue: true,\n subtree: true\n};\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n constructor() {\n this.anchorNode = null;\n this.anchorOffset = 0;\n this.focusNode = null;\n this.focusOffset = 0;\n }\n set(sel) {\n this.anchorNode = sel.anchorNode;\n this.anchorOffset = sel.anchorOffset;\n this.focusNode = sel.focusNode;\n this.focusOffset = sel.focusOffset;\n }\n clear() {\n this.anchorNode = this.focusNode = null;\n }\n eq(sel) {\n return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset && sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n }\n}\nclass DOMObserver {\n constructor(view, handleDOMChange) {\n this.view = view;\n this.handleDOMChange = handleDOMChange;\n this.queue = [];\n this.flushingSoon = -1;\n this.observer = null;\n this.currentSelection = new SelectionState();\n this.onCharData = null;\n this.suppressingSelectionUpdates = false;\n this.observer = window.MutationObserver && new window.MutationObserver((mutations) => {\n for (let i = 0; i < mutations.length; i++)\n this.queue.push(mutations[i]);\n if (ie && ie_version <= 11 && mutations.some((m) => m.type == \"childList\" && m.removedNodes.length || m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length))\n this.flushSoon();\n else\n this.flush();\n });\n if (useCharData) {\n this.onCharData = (e) => {\n this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n this.flushSoon();\n };\n }\n this.onSelectionChange = this.onSelectionChange.bind(this);\n }\n flushSoon() {\n if (this.flushingSoon < 0)\n this.flushingSoon = window.setTimeout(() => {\n this.flushingSoon = -1;\n this.flush();\n }, 20);\n }\n forceFlush() {\n if (this.flushingSoon > -1) {\n window.clearTimeout(this.flushingSoon);\n this.flushingSoon = -1;\n this.flush();\n }\n }\n start() {\n if (this.observer) {\n this.observer.takeRecords();\n this.observer.observe(this.view.dom, observeOptions);\n }\n if (this.onCharData)\n this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n this.connectSelection();\n }\n stop() {\n if (this.observer) {\n let take = this.observer.takeRecords();\n if (take.length) {\n for (let i = 0; i < take.length; i++)\n this.queue.push(take[i]);\n window.setTimeout(() => this.flush(), 20);\n }\n this.observer.disconnect();\n }\n if (this.onCharData)\n this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n this.disconnectSelection();\n }\n connectSelection() {\n this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n }\n disconnectSelection() {\n this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n }\n suppressSelectionUpdates() {\n this.suppressingSelectionUpdates = true;\n setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n }\n onSelectionChange() {\n if (!hasFocusAndSelection(this.view))\n return;\n if (this.suppressingSelectionUpdates)\n return selectionToDOM(this.view);\n if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n let sel = this.view.domSelectionRange();\n if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n return this.flushSoon();\n }\n this.flush();\n }\n setCurSelection() {\n this.currentSelection.set(this.view.domSelectionRange());\n }\n ignoreSelectionChange(sel) {\n if (!sel.focusNode)\n return true;\n let ancestors = /* @__PURE__ */ new Set(), container;\n for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n ancestors.add(scan);\n for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n if (ancestors.has(scan)) {\n container = scan;\n break;\n }\n let desc = container && this.view.docView.nearestDesc(container);\n if (desc && desc.ignoreMutation({\n type: \"selection\",\n target: container.nodeType == 3 ? container.parentNode : container\n })) {\n this.setCurSelection();\n return true;\n }\n }\n pendingRecords() {\n if (this.observer)\n for (let mut of this.observer.takeRecords())\n this.queue.push(mut);\n return this.queue;\n }\n flush() {\n let { view } = this;\n if (!view.docView || this.flushingSoon > -1)\n return;\n let mutations = this.pendingRecords();\n if (mutations.length)\n this.queue = [];\n let sel = view.domSelectionRange();\n let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n let from = -1, to = -1, typeOver = false, added = [];\n if (view.editable) {\n for (let i = 0; i < mutations.length; i++) {\n let result = this.registerMutation(mutations[i], added);\n if (result) {\n from = from < 0 ? result.from : Math.min(result.from, from);\n to = to < 0 ? result.to : Math.max(result.to, to);\n if (result.typeOver)\n typeOver = true;\n }\n }\n }\n if (gecko && added.length > 1) {\n let brs = added.filter((n) => n.nodeName == \"BR\");\n if (brs.length == 2) {\n let a = brs[0], b = brs[1];\n if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n b.remove();\n else\n a.remove();\n }\n }\n let readSel = null;\n if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 && Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 && selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) && readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n view.input.lastFocus = 0;\n selectionToDOM(view);\n this.currentSelection.set(sel);\n view.scrollToSelection();\n } else if (from > -1 || newSel) {\n if (from > -1) {\n view.docView.markDirty(from, to);\n checkCSS(view);\n }\n this.handleDOMChange(from, to, typeOver, added);\n if (view.docView && view.docView.dirty)\n view.updateState(view.state);\n else if (!this.currentSelection.eq(sel))\n selectionToDOM(view);\n this.currentSelection.set(sel);\n }\n }\n registerMutation(mut, added) {\n if (added.indexOf(mut.target) > -1)\n return null;\n let desc = this.view.docView.nearestDesc(mut.target);\n if (mut.type == \"attributes\" && (desc == this.view.docView || mut.attributeName == \"contenteditable\" || // Firefox sometimes fires spurious events for null/empty styles\n mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\")))\n return null;\n if (!desc || desc.ignoreMutation(mut))\n return null;\n if (mut.type == \"childList\") {\n for (let i = 0; i < mut.addedNodes.length; i++)\n added.push(mut.addedNodes[i]);\n if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n return { from: desc.posBefore, to: desc.posAfter };\n let prev = mut.previousSibling, next = mut.nextSibling;\n if (ie && ie_version <= 11 && mut.addedNodes.length) {\n for (let i = 0; i < mut.addedNodes.length; i++) {\n let { previousSibling, nextSibling } = mut.addedNodes[i];\n if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n prev = previousSibling;\n if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n next = nextSibling;\n }\n }\n let fromOffset = prev && prev.parentNode == mut.target ? domIndex(prev) + 1 : 0;\n let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n let toOffset = next && next.parentNode == mut.target ? domIndex(next) : mut.target.childNodes.length;\n let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n return { from, to };\n } else if (mut.type == \"attributes\") {\n return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n } else {\n return {\n from: desc.posAtStart,\n to: desc.posAtEnd,\n // An event was generated for a text change that didn't change\n // any text. Mark the dom change to fall back to assuming the\n // selection was typed over with an identical value if it can't\n // find another change.\n typeOver: mut.target.nodeValue == mut.oldValue\n };\n }\n }\n}\nlet cssChecked = /* @__PURE__ */ new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n if (cssChecked.has(view))\n return;\n cssChecked.set(view, null);\n if ([\"normal\", \"nowrap\", \"pre-line\"].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n view.requiresGeckoHackNode = gecko;\n if (cssCheckWarned)\n return;\n console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n cssCheckWarned = true;\n }\n}\nfunction safariShadowSelectionRange(view) {\n let found;\n function read(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n found = event.getTargetRanges()[0];\n }\n view.dom.addEventListener(\"beforeinput\", read, true);\n document.execCommand(\"indent\");\n view.dom.removeEventListener(\"beforeinput\", read, true);\n let anchorNode = found.startContainer, anchorOffset = found.startOffset;\n let focusNode = found.endContainer, focusOffset = found.endOffset;\n let currentAnchor = view.domAtPos(view.state.selection.anchor);\n if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\nfunction parseBetween(view, from_, to_) {\n let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n let domSel = view.domSelectionRange();\n let find;\n let anchor = domSel.anchorNode;\n if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n find = [{ node: anchor, offset: domSel.anchorOffset }];\n if (!selectionCollapsed(domSel))\n find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n }\n if (chrome && view.input.lastKeyCode === 8) {\n for (let off = toOffset; off > fromOffset; off--) {\n let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n if (node.nodeName == \"BR\" && !desc) {\n toOffset = off;\n break;\n }\n if (!desc || desc.size)\n break;\n }\n }\n let startDoc = view.state.doc;\n let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n let $from = startDoc.resolve(from);\n let sel = null, doc2 = parser.parse(parent, {\n topNode: $from.parent,\n topMatch: $from.parent.contentMatchAt($from.index()),\n topOpen: true,\n from: fromOffset,\n to: toOffset,\n preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n findPositions: find,\n ruleFromNode,\n context: $from\n });\n if (find && find[0].pos != null) {\n let anchor2 = find[0].pos, head = find[1] && find[1].pos;\n if (head == null)\n head = anchor2;\n sel = { anchor: anchor2 + from, head: head + from };\n }\n return { doc: doc2, sel, from, to };\n}\nfunction ruleFromNode(dom) {\n let desc = dom.pmViewDesc;\n if (desc) {\n return desc.parseRule();\n } else if (dom.nodeName == \"BR\" && dom.parentNode) {\n if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n let skip = document.createElement(\"div\");\n skip.appendChild(document.createElement(\"li\"));\n return { skip };\n } else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n return { ignore: true };\n }\n } else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n return { ignore: true };\n }\n return null;\n}\nconst isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);\n view.input.compositionPendingChanges = 0;\n if (from < 0) {\n let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n let newSel = selectionFromDOM(view, origin);\n if (newSel && !view.state.selection.eq(newSel)) {\n if (chrome && android && view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime && view.someProp(\"handleKeyDown\", (f) => f(view, keyEvent(13, \"Enter\"))))\n return;\n let tr2 = view.state.tr.setSelection(newSel);\n if (origin == \"pointer\")\n tr2.setMeta(\"pointer\", true);\n else if (origin == \"key\")\n tr2.scrollIntoView();\n if (compositionID)\n tr2.setMeta(\"composition\", compositionID);\n view.dispatch(tr2);\n }\n return;\n }\n let $before = view.state.doc.resolve(from);\n let shared = $before.sharedDepth(to);\n from = $before.before(shared + 1);\n to = view.state.doc.resolve(to).after(shared + 1);\n let sel = view.state.selection;\n let parse = parseBetween(view, from, to);\n let doc2 = view.state.doc, compare = doc2.slice(parse.from, parse.to);\n let preferredPos, preferredSide;\n if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n preferredPos = view.state.selection.to;\n preferredSide = \"end\";\n } else {\n preferredPos = view.state.selection.from;\n preferredSide = \"start\";\n }\n view.input.lastKeyCode = null;\n let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) && addedNodes.some((n) => n.nodeType == 1 && !isInline.test(n.nodeName)) && (!change || change.endA >= change.endB) && view.someProp(\"handleKeyDown\", (f) => f(view, keyEvent(13, \"Enter\")))) {\n view.input.lastIOSEnter = 0;\n return;\n }\n if (!change) {\n if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) && !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n change = { start: sel.from, endA: sel.to, endB: sel.to };\n } else {\n if (parse.sel) {\n let sel2 = resolveSelection(view, view.state.doc, parse.sel);\n if (sel2 && !sel2.eq(view.state.selection)) {\n let tr2 = view.state.tr.setSelection(sel2);\n if (compositionID)\n tr2.setMeta(\"composition\", compositionID);\n view.dispatch(tr2);\n }\n }\n return;\n }\n }\n if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from && parse.sel.head == parse.sel.anchor) {\n let size = change.endB - change.start;\n parse.sel = { anchor: parse.sel.anchor + size, head: parse.sel.anchor + size };\n }\n view.input.domChangeCount++;\n if (view.state.selection.from < view.state.selection.to && change.start == change.endB && view.state.selection instanceof TextSelection) {\n if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 && view.state.selection.from >= parse.from) {\n change.start = view.state.selection.from;\n } else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 && view.state.selection.to <= parse.to) {\n change.endB += view.state.selection.to - change.endA;\n change.endA = view.state.selection.to;\n }\n }\n if (ie && ie_version <= 11 && change.endB == change.start + 1 && change.endA == change.start && change.start > parse.from && parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\xA0\") {\n change.start--;\n change.endA--;\n change.endB--;\n }\n let $from = parse.doc.resolveNoCache(change.start - parse.from);\n let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n let $fromA = doc2.resolve(change.start);\n let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n let nextSel;\n if ((ios && view.input.lastIOSEnter > Date.now() - 225 && (!inlineChange || addedNodes.some((n) => n.nodeName == \"DIV\" || n.nodeName == \"P\")) || !inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) && (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp(\"handleKeyDown\", (f) => f(view, keyEvent(13, \"Enter\")))) {\n view.input.lastIOSEnter = 0;\n return;\n }\n if (view.state.selection.anchor > change.start && looksLikeJoin(doc2, change.start, change.endA, $from, $to) && view.someProp(\"handleKeyDown\", (f) => f(view, keyEvent(8, \"Backspace\")))) {\n if (android && chrome)\n view.domObserver.suppressSelectionUpdates();\n return;\n }\n if (chrome && android && change.endB == change.start)\n view.input.lastAndroidDelete = Date.now();\n if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth && parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n change.endB -= 2;\n $to = parse.doc.resolveNoCache(change.endB - parse.from);\n setTimeout(() => {\n view.someProp(\"handleKeyDown\", function(f) {\n return f(view, keyEvent(13, \"Enter\"));\n });\n }, 20);\n }\n let chFrom = change.start, chTo = change.endA;\n let tr, storedMarks, markChange;\n if (inlineChange) {\n if ($from.pos == $to.pos) {\n if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n view.domObserver.suppressSelectionUpdates();\n setTimeout(() => selectionToDOM(view), 20);\n }\n tr = view.state.tr.delete(chFrom, chTo);\n storedMarks = doc2.resolve(change.start).marksAcross(doc2.resolve(change.endA));\n } else if (\n // Adding or removing a mark\n change.endA == change.endB && (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))\n ) {\n tr = view.state.tr;\n if (markChange.type == \"add\")\n tr.addMark(chFrom, chTo, markChange.mark);\n else\n tr.removeMark(chFrom, chTo, markChange.mark);\n } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n if (view.someProp(\"handleTextInput\", (f) => f(view, chFrom, chTo, text)))\n return;\n tr = view.state.tr.insertText(text, chFrom, chTo);\n }\n }\n if (!tr)\n tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n if (parse.sel) {\n let sel2 = resolveSelection(view, tr.doc, parse.sel);\n if (sel2 && !(chrome && android && view.composing && sel2.empty && (change.start != change.endB || view.input.lastAndroidDelete < Date.now() - 100) && (sel2.head == chFrom || sel2.head == tr.mapping.map(chTo) - 1) || ie && sel2.empty && sel2.head == chFrom))\n tr.setSelection(sel2);\n }\n if (storedMarks)\n tr.ensureMarks(storedMarks);\n if (compositionID)\n tr.setMeta(\"composition\", compositionID);\n view.dispatch(tr.scrollIntoView());\n}\nfunction resolveSelection(view, doc2, parsedSel) {\n if (Math.max(parsedSel.anchor, parsedSel.head) > doc2.content.size)\n return null;\n return selectionBetween(view, doc2.resolve(parsedSel.anchor), doc2.resolve(parsedSel.head));\n}\nfunction isMarkChange(cur, prev) {\n let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n let added = curMarks, removed = prevMarks, type, mark, update;\n for (let i = 0; i < prevMarks.length; i++)\n added = prevMarks[i].removeFromSet(added);\n for (let i = 0; i < curMarks.length; i++)\n removed = curMarks[i].removeFromSet(removed);\n if (added.length == 1 && removed.length == 0) {\n mark = added[0];\n type = \"add\";\n update = (node) => node.mark(mark.addToSet(node.marks));\n } else if (added.length == 0 && removed.length == 1) {\n mark = removed[0];\n type = \"remove\";\n update = (node) => node.mark(mark.removeFromSet(node.marks));\n } else {\n return null;\n }\n let updated = [];\n for (let i = 0; i < prev.childCount; i++)\n updated.push(update(prev.child(i)));\n if (Fragment.from(updated).eq(cur))\n return { mark, type };\n}\nfunction looksLikeJoin(old, start, end, $newStart, $newEnd) {\n if (!$newStart.parent.isTextblock || // The content must have shrunk\n end - start <= $newEnd.pos - $newStart.pos || // newEnd must point directly at or after the end of the block that newStart points into\n skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n return false;\n let $start = old.resolve(start);\n if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n return false;\n let $next = old.resolve(skipClosingAndOpening($start, true, true));\n if (!$next.parent.isTextblock || $next.pos > end || skipClosingAndOpening($next, true, false) < end)\n return false;\n return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n depth--;\n end++;\n fromEnd = false;\n }\n if (mayOpen) {\n let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n while (next && !next.isLeaf) {\n next = next.firstChild;\n end++;\n }\n }\n return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n let start = a.findDiffStart(b, pos);\n if (start == null)\n return null;\n let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size);\n if (preferredSide == \"end\") {\n let adjust = Math.max(0, start - Math.min(endA, endB));\n preferredPos -= endA + adjust - start;\n }\n if (endA < start && a.size < b.size) {\n let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n start -= move;\n if (start && start < b.size && isSurrogatePair(b.textBetween(start - 1, start + 1)))\n start += move ? 1 : -1;\n endB = start + (endB - endA);\n endA = start;\n } else if (endB < start) {\n let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n start -= move;\n if (start && start < a.size && isSurrogatePair(a.textBetween(start - 1, start + 1)))\n start += move ? 1 : -1;\n endA = start + (endA - endB);\n endB = start;\n }\n return { start, endA, endB };\n}\nfunction isSurrogatePair(str) {\n if (str.length != 2)\n return false;\n let a = str.charCodeAt(0), b = str.charCodeAt(1);\n return a >= 56320 && a <= 57343 && b >= 55296 && b <= 56319;\n}\nconst __serializeForClipboard = serializeForClipboard;\nconst __parseFromClipboard = parseFromClipboard;\nconst __endComposition = endComposition;\nclass EditorView {\n /**\n Create a view. `place` may be a DOM node that the editor should\n be appended to, a function that will place it into the document,\n or an object whose `mount` property holds the node to use as the\n document container. If it is `null`, the editor will not be\n added to the document.\n */\n constructor(place, props) {\n this._root = null;\n this.focused = false;\n this.trackWrites = null;\n this.mounted = false;\n this.markCursor = null;\n this.cursorWrapper = null;\n this.lastSelectedViewDesc = void 0;\n this.input = new InputState();\n this.prevDirectPlugins = [];\n this.pluginViews = [];\n this.requiresGeckoHackNode = false;\n this.dragging = null;\n this._props = props;\n this.state = props.state;\n this.directPlugins = props.plugins || [];\n this.directPlugins.forEach(checkStateComponent);\n this.dispatch = this.dispatch.bind(this);\n this.dom = place && place.mount || document.createElement(\"div\");\n if (place) {\n if (place.appendChild)\n place.appendChild(this.dom);\n else if (typeof place == \"function\")\n place(this.dom);\n else if (place.mount)\n this.mounted = true;\n }\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n this.nodeViews = buildNodeViews(this);\n this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n this.domObserver.start();\n initInput(this);\n this.updatePluginViews();\n }\n /**\n Holds `true` when a\n [composition](https://w3c.github.io/uievents/#events-compositionevents)\n is active.\n */\n get composing() {\n return this.input.composing;\n }\n /**\n The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n */\n get props() {\n if (this._props.state != this.state) {\n let prev = this._props;\n this._props = {};\n for (let name in prev)\n this._props[name] = prev[name];\n this._props.state = this.state;\n }\n return this._props;\n }\n /**\n Update the view's props. Will immediately cause an update to\n the DOM.\n */\n update(props) {\n if (props.handleDOMEvents != this._props.handleDOMEvents)\n ensureListeners(this);\n let prevProps = this._props;\n this._props = props;\n if (props.plugins) {\n props.plugins.forEach(checkStateComponent);\n this.directPlugins = props.plugins;\n }\n this.updateStateInner(props.state, prevProps);\n }\n /**\n Update the view by updating existing props object with the object\n given as argument. Equivalent to `view.update(Object.assign({},\n view.props, props))`.\n */\n setProps(props) {\n let updated = {};\n for (let name in this._props)\n updated[name] = this._props[name];\n updated.state = this.state;\n for (let name in props)\n updated[name] = props[name];\n this.update(updated);\n }\n /**\n Update the editor's `state` prop, without touching any of the\n other props.\n */\n updateState(state) {\n this.updateStateInner(state, this._props);\n }\n updateStateInner(state, prevProps) {\n var _a;\n let prev = this.state, redraw = false, updateSel = false;\n if (state.storedMarks && this.composing) {\n clearComposition(this);\n updateSel = true;\n }\n this.state = state;\n let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n let nodeViews = buildNodeViews(this);\n if (changedNodeViews(nodeViews, this.nodeViews)) {\n this.nodeViews = nodeViews;\n redraw = true;\n }\n }\n if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n ensureListeners(this);\n }\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\" : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n if (updateDoc || !state.selection.eq(prev.selection))\n updateSel = true;\n let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n if (updateSel) {\n this.domObserver.stop();\n let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing && !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n if (updateDoc) {\n let chromeKludge = chrome ? this.trackWrites = this.domSelectionRange().focusNode : null;\n if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n this.docView.updateOuterDeco([]);\n this.docView.destroy();\n this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n }\n if (chromeKludge && !this.trackWrites)\n forceSelUpdate = true;\n }\n if (forceSelUpdate || !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) && anchorInRightPlace(this))) {\n selectionToDOM(this, forceSelUpdate);\n } else {\n syncNodeSelection(this, state.selection);\n this.domObserver.setCurSelection();\n }\n this.domObserver.start();\n }\n this.updatePluginViews(prev);\n if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc))\n this.updateDraggedNode(this.dragging, prev);\n if (scroll == \"reset\") {\n this.dom.scrollTop = 0;\n } else if (scroll == \"to selection\") {\n this.scrollToSelection();\n } else if (oldScrollPos) {\n resetScrollPos(oldScrollPos);\n }\n }\n /**\n @internal\n */\n scrollToSelection() {\n let startDOM = this.domSelectionRange().focusNode;\n if (this.someProp(\"handleScrollToSelection\", (f) => f(this)))\n ;\n else if (this.state.selection instanceof NodeSelection) {\n let target = this.docView.domAfterPos(this.state.selection.from);\n if (target.nodeType == 1)\n scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n } else {\n scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n }\n }\n destroyPluginViews() {\n let view;\n while (view = this.pluginViews.pop())\n if (view.destroy)\n view.destroy();\n }\n updatePluginViews(prevState) {\n if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n this.prevDirectPlugins = this.directPlugins;\n this.destroyPluginViews();\n for (let i = 0; i < this.directPlugins.length; i++) {\n let plugin = this.directPlugins[i];\n if (plugin.spec.view)\n this.pluginViews.push(plugin.spec.view(this));\n }\n for (let i = 0; i < this.state.plugins.length; i++) {\n let plugin = this.state.plugins[i];\n if (plugin.spec.view)\n this.pluginViews.push(plugin.spec.view(this));\n }\n } else {\n for (let i = 0; i < this.pluginViews.length; i++) {\n let pluginView = this.pluginViews[i];\n if (pluginView.update)\n pluginView.update(this, prevState);\n }\n }\n }\n updateDraggedNode(dragging, prev) {\n let sel = dragging.node, found = -1;\n if (this.state.doc.nodeAt(sel.from) == sel.node) {\n found = sel.from;\n } else {\n let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);\n let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos);\n if (moved == sel.node)\n found = movedPos;\n }\n this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? void 0 : NodeSelection.create(this.state.doc, found));\n }\n someProp(propName, f) {\n let prop = this._props && this._props[propName], value;\n if (prop != null && (value = f ? f(prop) : prop))\n return value;\n for (let i = 0; i < this.directPlugins.length; i++) {\n let prop2 = this.directPlugins[i].props[propName];\n if (prop2 != null && (value = f ? f(prop2) : prop2))\n return value;\n }\n let plugins = this.state.plugins;\n if (plugins)\n for (let i = 0; i < plugins.length; i++) {\n let prop2 = plugins[i].props[propName];\n if (prop2 != null && (value = f ? f(prop2) : prop2))\n return value;\n }\n }\n /**\n Query whether the view has focus.\n */\n hasFocus() {\n if (ie) {\n let node = this.root.activeElement;\n if (node == this.dom)\n return true;\n if (!node || !this.dom.contains(node))\n return false;\n while (node && this.dom != node && this.dom.contains(node)) {\n if (node.contentEditable == \"false\")\n return false;\n node = node.parentElement;\n }\n return true;\n }\n return this.root.activeElement == this.dom;\n }\n /**\n Focus the editor.\n */\n focus() {\n this.domObserver.stop();\n if (this.editable)\n focusPreventScroll(this.dom);\n selectionToDOM(this);\n this.domObserver.start();\n }\n /**\n Get the document root in which the editor exists. This will\n usually be the top-level `document`, but might be a [shadow\n DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n root if the editor is inside one.\n */\n get root() {\n let cached = this._root;\n if (cached == null)\n for (let search = this.dom.parentNode; search; search = search.parentNode) {\n if (search.nodeType == 9 || search.nodeType == 11 && search.host) {\n if (!search.getSelection)\n Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n return this._root = search;\n }\n }\n return cached || document;\n }\n /**\n When an existing editor view is moved to a new document or\n shadow tree, call this to make it recompute its root.\n */\n updateRoot() {\n this._root = null;\n }\n /**\n Given a pair of viewport coordinates, return the document\n position that corresponds to them. May return null if the given\n coordinates aren't inside of the editor. When an object is\n returned, its `pos` property is the position nearest to the\n coordinates, and its `inside` property holds the position of the\n inner node that the position falls inside of, or -1 if it is at\n the top level, not in any node.\n */\n posAtCoords(coords) {\n return posAtCoords(this, coords);\n }\n /**\n Returns the viewport rectangle at a given document position.\n `left` and `right` will be the same number, as this returns a\n flat cursor-ish rectangle. If the position is between two things\n that aren't directly adjacent, `side` determines which element\n is used. When < 0, the element before the position is used,\n otherwise the element after.\n */\n coordsAtPos(pos, side = 1) {\n return coordsAtPos(this, pos, side);\n }\n /**\n Find the DOM position that corresponds to the given document\n position. When `side` is negative, find the position as close as\n possible to the content before the position. When positive,\n prefer positions close to the content after the position. When\n zero, prefer as shallow a position as possible.\n \n Note that you should **not** mutate the editor's internal DOM,\n only inspect it (and even that is usually not necessary).\n */\n domAtPos(pos, side = 0) {\n return this.docView.domFromPos(pos, side);\n }\n /**\n Find the DOM node that represents the document node after the\n given position. May return `null` when the position doesn't point\n in front of a node or if the node is inside an opaque node view.\n \n This is intended to be able to call things like\n `getBoundingClientRect` on that DOM node. Do **not** mutate the\n editor DOM directly, or add styling this way, since that will be\n immediately overriden by the editor as it redraws the node.\n */\n nodeDOM(pos) {\n let desc = this.docView.descAt(pos);\n return desc ? desc.nodeDOM : null;\n }\n /**\n Find the document position that corresponds to a given DOM\n position. (Whenever possible, it is preferable to inspect the\n document structure directly, rather than poking around in the\n DOM, but sometimes—for example when interpreting an event\n target—you don't have a choice.)\n \n The `bias` parameter can be used to influence which side of a DOM\n node to use when the position is inside a leaf node.\n */\n posAtDOM(node, offset, bias = -1) {\n let pos = this.docView.posFromDOM(node, offset, bias);\n if (pos == null)\n throw new RangeError(\"DOM position not inside the editor\");\n return pos;\n }\n /**\n Find out whether the selection is at the end of a textblock when\n moving in a given direction. When, for example, given `\"left\"`,\n it will return true if moving left from the current cursor\n position would leave that position's parent textblock. Will apply\n to the view's current state by default, but it is possible to\n pass a different state.\n */\n endOfTextblock(dir, state) {\n return endOfTextblock(this, state || this.state, dir);\n }\n /**\n Run the editor's paste logic with the given HTML string. The\n `event`, if given, will be passed to the\n [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n */\n pasteHTML(html, event) {\n return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n }\n /**\n Run the editor's paste logic with the given plain-text input.\n */\n pasteText(text, event) {\n return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n }\n /**\n Removes the editor from the DOM and destroys all [node\n views](https://prosemirror.net/docs/ref/#view.NodeView).\n */\n destroy() {\n if (!this.docView)\n return;\n destroyInput(this);\n this.destroyPluginViews();\n if (this.mounted) {\n this.docView.update(this.state.doc, [], viewDecorations(this), this);\n this.dom.textContent = \"\";\n } else if (this.dom.parentNode) {\n this.dom.parentNode.removeChild(this.dom);\n }\n this.docView.destroy();\n this.docView = null;\n }\n /**\n This is true when the view has been\n [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n used anymore).\n */\n get isDestroyed() {\n return this.docView == null;\n }\n /**\n Used for testing.\n */\n dispatchEvent(event) {\n return dispatchEvent(this, event);\n }\n /**\n Dispatch a transaction. Will call\n [`dispatchTransaction`](https://prosemirror.net/docs/ref/#view.DirectEditorProps.dispatchTransaction)\n when given, and otherwise defaults to applying the transaction to\n the current state and calling\n [`updateState`](https://prosemirror.net/docs/ref/#view.EditorView.updateState) with the result.\n This method is bound to the view instance, so that it can be\n easily passed around.\n */\n dispatch(tr) {\n let dispatchTransaction = this._props.dispatchTransaction;\n if (dispatchTransaction)\n dispatchTransaction.call(this, tr);\n else\n this.updateState(this.state.apply(tr));\n }\n /**\n @internal\n */\n domSelectionRange() {\n return safari && this.root.nodeType === 11 && deepActiveElement(this.dom.ownerDocument) == this.dom ? safariShadowSelectionRange(this) : this.domSelection();\n }\n /**\n @internal\n */\n domSelection() {\n return this.root.getSelection();\n }\n}\nfunction computeDocDeco(view) {\n let attrs = /* @__PURE__ */ Object.create(null);\n attrs.class = \"ProseMirror\";\n attrs.contenteditable = String(view.editable);\n view.someProp(\"attributes\", (value) => {\n if (typeof value == \"function\")\n value = value(view.state);\n if (value)\n for (let attr in value) {\n if (attr == \"class\")\n attrs.class += \" \" + value[attr];\n else if (attr == \"style\")\n attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n attrs[attr] = String(value[attr]);\n }\n });\n if (!attrs.translate)\n attrs.translate = \"no\";\n return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n if (view.markCursor) {\n let dom = document.createElement(\"img\");\n dom.className = \"ProseMirror-separator\";\n dom.setAttribute(\"mark-placeholder\", \"true\");\n dom.setAttribute(\"alt\", \"\");\n view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.head, dom, { raw: true, marks: view.markCursor }) };\n } else {\n view.cursorWrapper = null;\n }\n}\nfunction getEditable(view) {\n return !view.someProp(\"editable\", (value) => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n let result = /* @__PURE__ */ Object.create(null);\n function add(obj) {\n for (let prop in obj)\n if (!Object.prototype.hasOwnProperty.call(result, prop))\n result[prop] = obj[prop];\n }\n view.someProp(\"nodeViews\", add);\n view.someProp(\"markViews\", add);\n return result;\n}\nfunction changedNodeViews(a, b) {\n let nA = 0, nB = 0;\n for (let prop in a) {\n if (a[prop] != b[prop])\n return true;\n nA++;\n }\n for (let _ in b)\n nB++;\n return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard, __serializeForClipboard };\n","import { liftTarget, replaceStep, ReplaceStep, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from \"prosemirror-transform\";\nimport { Slice, Fragment } from \"prosemirror-model\";\nimport { NodeSelection, Selection, TextSelection, AllSelection } from \"prosemirror-state\";\nconst deleteSelection = (state, dispatch) => {\n if (state.selection.empty)\n return false;\n if (dispatch)\n dispatch(state.tr.deleteSelection().scrollIntoView());\n return true;\n};\nfunction atBlockStart(state, view) {\n let { $cursor } = state.selection;\n if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state) : $cursor.parentOffset > 0))\n return null;\n return $cursor;\n}\nconst joinBackward = (state, dispatch, view) => {\n let $cursor = atBlockStart(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutBefore($cursor);\n if (!$cut) {\n let range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n }\n let before = $cut.nodeBefore;\n if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch))\n return true;\n if ($cursor.parent.content.size == 0 && (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n if (dispatch) {\n let tr = state.tr.step(delStep);\n tr.setSelection(textblockAt(before, \"end\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1) : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch)\n dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView());\n return true;\n }\n return false;\n};\nconst joinTextblockBackward = (state, dispatch, view) => {\n let $cursor = atBlockStart(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutBefore($cursor);\n return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\nconst joinTextblockForward = (state, dispatch, view) => {\n let $cursor = atBlockEnd(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutAfter($cursor);\n return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\nfunction joinTextblocksAround(state, $cut, dispatch) {\n let before = $cut.nodeBefore, beforeText = before, beforePos = $cut.pos - 1;\n for (; !beforeText.isTextblock; beforePos--) {\n if (beforeText.type.spec.isolating)\n return false;\n let child = beforeText.lastChild;\n if (!child)\n return false;\n beforeText = child;\n }\n let after = $cut.nodeAfter, afterText = after, afterPos = $cut.pos + 1;\n for (; !afterText.isTextblock; afterPos++) {\n if (afterText.type.spec.isolating)\n return false;\n let child = afterText.firstChild;\n if (!child)\n return false;\n afterText = child;\n }\n let step = replaceStep(state.doc, beforePos, afterPos, Slice.empty);\n if (!step || step.from != beforePos || step instanceof ReplaceStep && step.slice.size >= afterPos - beforePos)\n return false;\n if (dispatch) {\n let tr = state.tr.step(step);\n tr.setSelection(TextSelection.create(tr.doc, beforePos));\n dispatch(tr.scrollIntoView());\n }\n return true;\n}\nfunction textblockAt(node, side, only = false) {\n for (let scan = node; scan; scan = side == \"start\" ? scan.firstChild : scan.lastChild) {\n if (scan.isTextblock)\n return true;\n if (only && scan.childCount != 1)\n return false;\n }\n return false;\n}\nconst selectNodeBackward = (state, dispatch, view) => {\n let { $head, empty } = state.selection, $cut = $head;\n if (!empty)\n return false;\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0)\n return false;\n $cut = findCutBefore($head);\n }\n let node = $cut && $cut.nodeBefore;\n if (!node || !NodeSelection.isSelectable(node))\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView());\n return true;\n};\nfunction findCutBefore($pos) {\n if (!$pos.parent.type.spec.isolating)\n for (let i = $pos.depth - 1; i >= 0; i--) {\n if ($pos.index(i) > 0)\n return $pos.doc.resolve($pos.before(i + 1));\n if ($pos.node(i).type.spec.isolating)\n break;\n }\n return null;\n}\nfunction atBlockEnd(state, view) {\n let { $cursor } = state.selection;\n if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state) : $cursor.parentOffset < $cursor.parent.content.size))\n return null;\n return $cursor;\n}\nconst joinForward = (state, dispatch, view) => {\n let $cursor = atBlockEnd(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutAfter($cursor);\n if (!$cut)\n return false;\n let after = $cut.nodeAfter;\n if (deleteBarrier(state, $cut, dispatch))\n return true;\n if ($cursor.parent.content.size == 0 && (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n if (dispatch) {\n let tr = state.tr.step(delStep);\n tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1) : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch)\n dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView());\n return true;\n }\n return false;\n};\nconst selectNodeForward = (state, dispatch, view) => {\n let { $head, empty } = state.selection, $cut = $head;\n if (!empty)\n return false;\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n return false;\n $cut = findCutAfter($head);\n }\n let node = $cut && $cut.nodeAfter;\n if (!node || !NodeSelection.isSelectable(node))\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView());\n return true;\n};\nfunction findCutAfter($pos) {\n if (!$pos.parent.type.spec.isolating)\n for (let i = $pos.depth - 1; i >= 0; i--) {\n let parent = $pos.node(i);\n if ($pos.index(i) + 1 < parent.childCount)\n return $pos.doc.resolve($pos.after(i + 1));\n if (parent.type.spec.isolating)\n break;\n }\n return null;\n}\nconst joinUp = (state, dispatch) => {\n let sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n if (nodeSel) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.from))\n return false;\n point = sel.from;\n } else {\n point = joinPoint(state.doc, sel.from, -1);\n if (point == null)\n return false;\n }\n if (dispatch) {\n let tr = state.tr.join(point);\n if (nodeSel)\n tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\nconst joinDown = (state, dispatch) => {\n let sel = state.selection, point;\n if (sel instanceof NodeSelection) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.to))\n return false;\n point = sel.to;\n } else {\n point = joinPoint(state.doc, sel.to, 1);\n if (point == null)\n return false;\n }\n if (dispatch)\n dispatch(state.tr.join(point).scrollIntoView());\n return true;\n};\nconst lift = (state, dispatch) => {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n};\nconst newlineInCode = (state, dispatch) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n return false;\n if (dispatch)\n dispatch(state.tr.insertText(\"\\n\").scrollIntoView());\n return true;\n};\nfunction defaultBlockAt(match) {\n for (let i = 0; i < match.edgeCount; i++) {\n let { type } = match.edge(i);\n if (type.isTextblock && !type.hasRequiredAttrs())\n return type;\n }\n return null;\n}\nconst exitCode = (state, dispatch) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n return false;\n let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n if (!type || !above.canReplaceWith(after, after, type))\n return false;\n if (dispatch) {\n let pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\nconst createParagraphNear = (state, dispatch) => {\n let sel = state.selection, { $from, $to } = sel;\n if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent)\n return false;\n let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter()));\n if (!type || !type.isTextblock)\n return false;\n if (dispatch) {\n let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n let tr = state.tr.insert(side, type.createAndFill());\n tr.setSelection(TextSelection.create(tr.doc, side + 1));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\nconst liftEmptyBlock = (state, dispatch) => {\n let { $cursor } = state.selection;\n if (!$cursor || $cursor.parent.content.size)\n return false;\n if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n let before = $cursor.before();\n if (canSplit(state.doc, before)) {\n if (dispatch)\n dispatch(state.tr.split(before).scrollIntoView());\n return true;\n }\n }\n let range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n};\nfunction splitBlockAs(splitNode) {\n return (state, dispatch) => {\n let { $from, $to } = state.selection;\n if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(state.doc, $from.pos))\n return false;\n if (dispatch)\n dispatch(state.tr.split($from.pos).scrollIntoView());\n return true;\n }\n if (!$from.parent.isBlock)\n return false;\n if (dispatch) {\n let atEnd = $to.parentOffset == $to.parent.content.size;\n let tr = state.tr;\n if (state.selection instanceof TextSelection || state.selection instanceof AllSelection)\n tr.deleteSelection();\n let deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n let splitType = splitNode && splitNode($to.parent, atEnd);\n let types = splitType ? [splitType] : atEnd && deflt ? [{ type: deflt }] : void 0;\n let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : void 0)) {\n if (deflt)\n types = [{ type: deflt }];\n can = true;\n }\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types);\n if (!atEnd && !$from.parentOffset && $from.parent.type != deflt) {\n let first = tr.mapping.map($from.before()), $first = tr.doc.resolve(first);\n if (deflt && $from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt))\n tr.setNodeMarkup(tr.mapping.map($from.before()), deflt);\n }\n }\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\nconst splitBlock = splitBlockAs();\nconst splitBlockKeepMarks = (state, dispatch) => {\n return splitBlock(state, dispatch && ((tr) => {\n let marks = state.storedMarks || state.selection.$to.parentOffset && state.selection.$from.marks();\n if (marks)\n tr.ensureMarks(marks);\n dispatch(tr);\n }));\n};\nconst selectParentNode = (state, dispatch) => {\n let { $from, to } = state.selection, pos;\n let same = $from.sharedDepth(to);\n if (same == 0)\n return false;\n pos = $from.before(same);\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos)));\n return true;\n};\nconst selectAll = (state, dispatch) => {\n if (dispatch)\n dispatch(state.tr.setSelection(new AllSelection(state.doc)));\n return true;\n};\nfunction joinMaybeClear(state, $pos, dispatch) {\n let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n if (!before || !after || !before.type.compatibleContent(after.type))\n return false;\n if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n if (dispatch)\n dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView());\n return true;\n }\n if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n return false;\n if (dispatch)\n dispatch(state.tr.clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount)).join($pos.pos).scrollIntoView());\n return true;\n}\nfunction deleteBarrier(state, $cut, dispatch) {\n let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n if (before.type.spec.isolating || after.type.spec.isolating)\n return false;\n if (joinMaybeClear(state, $cut, dispatch))\n return true;\n let canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n if (canDelAfter && (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) && match.matchType(conn[0] || after.type).validEnd) {\n if (dispatch) {\n let end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n for (let i = conn.length - 1; i >= 0; i--)\n wrap = Fragment.from(conn[i].create(null, wrap));\n wrap = Fragment.from(before.copy(wrap));\n let tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n let joinAt = end + 2 * conn.length;\n if (canJoin(tr.doc, joinAt))\n tr.join(joinAt);\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n let selAfter = Selection.findFrom($cut, 1);\n let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n if (target != null && target >= $cut.depth) {\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n }\n if (canDelAfter && textblockAt(after, \"start\", true) && textblockAt(before, \"end\")) {\n let at = before, wrap = [];\n for (; ; ) {\n wrap.push(at);\n if (at.isTextblock)\n break;\n at = at.lastChild;\n }\n let afterText = after, afterDepth = 1;\n for (; !afterText.isTextblock; afterText = afterText.firstChild)\n afterDepth++;\n if (at.canReplace(at.childCount, at.childCount, afterText.content)) {\n if (dispatch) {\n let end = Fragment.empty;\n for (let i = wrap.length - 1; i >= 0; i--)\n end = Fragment.from(wrap[i].copy(end));\n let tr = state.tr.step(new ReplaceAroundStep($cut.pos - wrap.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end, wrap.length, 0), 0, true));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n return false;\n}\nfunction selectTextblockSide(side) {\n return function(state, dispatch) {\n let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to;\n let depth = $pos.depth;\n while ($pos.node(depth).isInline) {\n if (!depth)\n return false;\n depth--;\n }\n if (!$pos.node(depth).isTextblock)\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth))));\n return true;\n };\n}\nconst selectTextblockStart = selectTextblockSide(-1);\nconst selectTextblockEnd = selectTextblockSide(1);\nfunction wrapIn(nodeType, attrs = null) {\n return function(state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping)\n return false;\n if (dispatch)\n dispatch(state.tr.wrap(range, wrapping).scrollIntoView());\n return true;\n };\n}\nfunction setBlockType(nodeType, attrs = null) {\n return function(state, dispatch) {\n let applicable = false;\n for (let i = 0; i < state.selection.ranges.length && !applicable; i++) {\n let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (applicable)\n return false;\n if (!node.isTextblock || node.hasMarkup(nodeType, attrs))\n return;\n if (node.type == nodeType) {\n applicable = true;\n } else {\n let $pos = state.doc.resolve(pos), index = $pos.index();\n applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n });\n }\n if (!applicable)\n return false;\n if (dispatch) {\n let tr = state.tr;\n for (let i = 0; i < state.selection.ranges.length; i++) {\n let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n tr.setBlockType(from, to, nodeType, attrs);\n }\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\nfunction markApplies(doc, ranges, type) {\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false;\n doc.nodesBetween($from.pos, $to.pos, (node) => {\n if (can)\n return false;\n can = node.inlineContent && node.type.allowsMarkType(type);\n });\n if (can)\n return true;\n }\n return false;\n}\nfunction toggleMark(markType, attrs = null) {\n return function(state, dispatch) {\n let { empty, $cursor, ranges } = state.selection;\n if (empty && !$cursor || !markApplies(state.doc, ranges, markType))\n return false;\n if (dispatch) {\n if ($cursor) {\n if (markType.isInSet(state.storedMarks || $cursor.marks()))\n dispatch(state.tr.removeStoredMark(markType));\n else\n dispatch(state.tr.addStoredMark(markType.create(attrs)));\n } else {\n let has = false, tr = state.tr;\n for (let i = 0; !has && i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType);\n }\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n if (has) {\n tr.removeMark($from.pos, $to.pos, markType);\n } else {\n let from = $from.pos, to = $to.pos, start = $from.nodeAfter, end = $to.nodeBefore;\n let spaceStart = start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n let spaceEnd = end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n if (from + spaceStart < to) {\n from += spaceStart;\n to -= spaceEnd;\n }\n tr.addMark(from, to, markType.create(attrs));\n }\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true;\n };\n}\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n return (tr) => {\n if (!tr.isGeneric)\n return dispatch(tr);\n let ranges = [];\n for (let i = 0; i < tr.mapping.maps.length; i++) {\n let map = tr.mapping.maps[i];\n for (let j = 0; j < ranges.length; j++)\n ranges[j] = map.map(ranges[j]);\n map.forEach((_s, _e, from, to) => ranges.push(from, to));\n }\n let joinable = [];\n for (let i = 0; i < ranges.length; i += 2) {\n let from = ranges[i], to = ranges[i + 1];\n let $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n for (let index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n let after = parent.maybeChild(index);\n if (!after)\n break;\n if (index && joinable.indexOf(pos) == -1) {\n let before = parent.child(index - 1);\n if (before.type == after.type && isJoinable(before, after))\n joinable.push(pos);\n }\n pos += after.nodeSize;\n }\n }\n joinable.sort((a, b) => a - b);\n for (let i = joinable.length - 1; i >= 0; i--) {\n if (canJoin(tr.doc, joinable[i]))\n tr.join(joinable[i]);\n }\n dispatch(tr);\n };\n}\nfunction autoJoin(command, isJoinable) {\n let canJoin2 = Array.isArray(isJoinable) ? (node) => isJoinable.indexOf(node.type.name) > -1 : isJoinable;\n return (state, dispatch, view) => command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin2), view);\n}\nfunction chainCommands(...commands) {\n return function(state, dispatch, view) {\n for (let i = 0; i < commands.length; i++)\n if (commands[i](state, dispatch, view))\n return true;\n return false;\n };\n}\nlet backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nlet del = chainCommands(deleteSelection, joinForward, selectNodeForward);\nconst pcBaseKeymap = {\n \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n \"Mod-Enter\": exitCode,\n \"Backspace\": backspace,\n \"Mod-Backspace\": backspace,\n \"Shift-Backspace\": backspace,\n \"Delete\": del,\n \"Mod-Delete\": del,\n \"Mod-a\": selectAll\n};\nconst macBaseKeymap = {\n \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"],\n \"Ctrl-a\": selectTextblockStart,\n \"Ctrl-e\": selectTextblockEnd\n};\nfor (let key in pcBaseKeymap)\n macBaseKeymap[key] = pcBaseKeymap[key];\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : typeof os != \"undefined\" && os.platform ? os.platform() == \"darwin\" : false;\nconst baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinTextblockBackward, joinTextblockForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, selectTextblockEnd, selectTextblockStart, setBlockType, splitBlock, splitBlockAs, splitBlockKeepMarks, toggleMark, wrapIn };\n","/**\n * @toast-ui/editor\n * @version 3.2.2 | Fri Feb 17 2023\n * @author NHN Cloud FE Development Lab \n * @license MIT\n */\nimport { Fragment, Schema, Slice, NodeRange, Mark as Mark$1, DOMParser, Node as Node$3 } from \"prosemirror-model\";\nimport { DecorationSet, Decoration, EditorView } from \"prosemirror-view\";\nimport { ReplaceAroundStep, liftTarget, canSplit, StepMap } from \"prosemirror-transform\";\nimport { TextSelection, Plugin, PluginKey, EditorState, AllSelection, Selection, SelectionRange, NodeSelection } from \"prosemirror-state\";\nimport { keymap } from \"prosemirror-keymap\";\nimport { deleteSelection, selectAll, baseKeymap, chainCommands, joinForward, newlineInCode, setBlockType, wrapIn, toggleMark as toggleMark$1, exitCode } from \"prosemirror-commands\";\nimport { InputRule, inputRules, undoInputRule } from \"prosemirror-inputrules\";\nimport { undo, redo, history, undoDepth } from \"prosemirror-history\";\n/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\nvar extendStatics$1 = function(d, b) {\n extendStatics$1 = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n d2.__proto__ = b2;\n } || function(d2, b2) {\n for (var p in b2)\n if (Object.prototype.hasOwnProperty.call(b2, p))\n d2[p] = b2[p];\n };\n return extendStatics$1(d, b);\n};\nfunction __extends$1(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics$1(d, b);\n function __() {\n this.constructor = d;\n }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nvar __assign$1 = function() {\n __assign$1 = Object.assign || function __assign2(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s)\n if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign$1.apply(this, arguments);\n};\nfunction __spreadArray$1(to, from, pack) {\n if (pack || arguments.length === 2)\n for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar)\n ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, \"raw\", { value: raw });\n } else {\n cooked.raw = raw;\n }\n return cooked;\n}\nfunction forEachOwnProperties$2(obj, iteratee, context) {\n var key;\n context = context || null;\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (iteratee.call(context, obj[key], key, obj) === false) {\n break;\n }\n }\n }\n}\nvar forEachOwnProperties_1 = forEachOwnProperties$2;\nfunction extend(target2, objects) {\n var hasOwnProp = Object.prototype.hasOwnProperty;\n var source, prop2, i, len;\n for (i = 1, len = arguments.length; i < len; i += 1) {\n source = arguments[i];\n for (prop2 in source) {\n if (hasOwnProp.call(source, prop2)) {\n target2[prop2] = source[prop2];\n }\n }\n }\n return target2;\n}\nvar extend_1 = extend;\nfunction isString$3(obj) {\n return typeof obj === \"string\" || obj instanceof String;\n}\nvar isString_1 = isString$3;\nfunction isArray$3(obj) {\n return obj instanceof Array;\n}\nvar isArray_1 = isArray$3;\nfunction forEachArray$3(arr, iteratee, context) {\n var index2 = 0;\n var len = arr.length;\n context = context || null;\n for (; index2 < len; index2 += 1) {\n if (iteratee.call(context, arr[index2], index2, arr) === false) {\n break;\n }\n }\n}\nvar forEachArray_1 = forEachArray$3;\nvar isArray$2 = isArray_1;\nvar forEachArray$2 = forEachArray_1;\nvar forEachOwnProperties$1 = forEachOwnProperties_1;\nfunction forEach$4(obj, iteratee, context) {\n if (isArray$2(obj)) {\n forEachArray$2(obj, iteratee, context);\n } else {\n forEachOwnProperties$1(obj, iteratee, context);\n }\n}\nvar forEach_1 = forEach$4;\nvar isString$2 = isString_1;\nvar forEach$3 = forEach_1;\nfunction css(element, key, value) {\n var style = element.style;\n if (isString$2(key)) {\n style[key] = value;\n return;\n }\n forEach$3(key, function(v, k) {\n style[k] = v;\n });\n}\nvar css_1 = css;\nvar isArray$1 = isArray_1;\nfunction inArray$4(searchElement, array, startIndex) {\n var i;\n var length;\n startIndex = startIndex || 0;\n if (!isArray$1(array)) {\n return -1;\n }\n if (Array.prototype.indexOf) {\n return Array.prototype.indexOf.call(array, searchElement, startIndex);\n }\n length = array.length;\n for (i = startIndex; startIndex >= 0 && i < length; i += 1) {\n if (array[i] === searchElement) {\n return i;\n }\n }\n return -1;\n}\nvar inArray_1 = inArray$4;\nfunction isUndefined$4(obj) {\n return obj === void 0;\n}\nvar isUndefined_1 = isUndefined$4;\nvar isUndefined$3 = isUndefined_1;\nfunction getClass$3(element) {\n if (!element || !element.className) {\n return \"\";\n }\n if (isUndefined$3(element.className.baseVal)) {\n return element.className;\n }\n return element.className.baseVal;\n}\nvar getClass_1 = getClass$3;\nvar isArray = isArray_1;\nvar isUndefined$2 = isUndefined_1;\nfunction setClassName$2(element, cssClass) {\n cssClass = isArray(cssClass) ? cssClass.join(\" \") : cssClass;\n cssClass = cssClass.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\n if (isUndefined$2(element.className.baseVal)) {\n element.className = cssClass;\n return;\n }\n element.className.baseVal = cssClass;\n}\nvar _setClassName = setClassName$2;\nvar forEach$2 = forEach_1;\nvar inArray$3 = inArray_1;\nvar getClass$2 = getClass_1;\nvar setClassName$1 = _setClassName;\nfunction addClass(element) {\n var cssClass = Array.prototype.slice.call(arguments, 1);\n var classList = element.classList;\n var newClass = [];\n var origin;\n if (classList) {\n forEach$2(cssClass, function(name) {\n element.classList.add(name);\n });\n return;\n }\n origin = getClass$2(element);\n if (origin) {\n cssClass = [].concat(origin.split(/\\s+/), cssClass);\n }\n forEach$2(cssClass, function(cls2) {\n if (inArray$3(cls2, newClass) < 0) {\n newClass.push(cls2);\n }\n });\n setClassName$1(element, newClass);\n}\nvar addClass_1 = addClass;\nvar forEachArray$1 = forEachArray_1;\nvar inArray$2 = inArray_1;\nvar getClass$1 = getClass_1;\nvar setClassName = _setClassName;\nfunction removeClass(element) {\n var cssClass = Array.prototype.slice.call(arguments, 1);\n var classList = element.classList;\n var origin, newClass;\n if (classList) {\n forEachArray$1(cssClass, function(name) {\n classList.remove(name);\n });\n return;\n }\n origin = getClass$1(element).split(/\\s+/);\n newClass = [];\n forEachArray$1(origin, function(name) {\n if (inArray$2(name, cssClass) < 0) {\n newClass.push(name);\n }\n });\n setClassName(element, newClass);\n}\nvar removeClass_1 = removeClass;\nfunction isNumber(obj) {\n return typeof obj === \"number\" || obj instanceof Number;\n}\nvar isNumber_1 = isNumber;\nfunction isNull$1(obj) {\n return obj === null;\n}\nvar isNull_1 = isNull$1;\nvar forEachOwnProperties = forEachOwnProperties_1;\nfunction imagePing$1(url, trackingInfo) {\n var trackingElement = document.createElement(\"img\");\n var queryString = \"\";\n forEachOwnProperties(trackingInfo, function(value, key) {\n queryString += \"&\" + key + \"=\" + value;\n });\n queryString = queryString.substring(1);\n trackingElement.src = url + \"?\" + queryString;\n trackingElement.style.display = \"none\";\n document.body.appendChild(trackingElement);\n document.body.removeChild(trackingElement);\n return trackingElement;\n}\nvar imagePing_1 = imagePing$1;\nvar isUndefined$1 = isUndefined_1;\nvar imagePing = imagePing_1;\nvar ms7days = 7 * 24 * 60 * 60 * 1e3;\nfunction isExpired(date) {\n var now = new Date().getTime();\n return now - date > ms7days;\n}\nfunction sendHostname(appName, trackingId) {\n var url = \"https://www.google-analytics.com/collect\";\n var hostname = location.hostname;\n var hitType = \"event\";\n var eventCategory = \"use\";\n var applicationKeyForStorage = \"TOAST UI \" + appName + \" for \" + hostname + \": Statistics\";\n var date = window.localStorage.getItem(applicationKeyForStorage);\n if (!isUndefined$1(window.tui) && window.tui.usageStatistics === false) {\n return;\n }\n if (date && !isExpired(date)) {\n return;\n }\n window.localStorage.setItem(applicationKeyForStorage, new Date().getTime());\n setTimeout(function() {\n if (document.readyState === \"interactive\" || document.readyState === \"complete\") {\n imagePing(url, {\n v: 1,\n t: hitType,\n tid: trackingId,\n cid: hostname,\n dp: hostname,\n dh: appName,\n el: appName,\n ec: eventCategory\n });\n }\n }, 1e3);\n}\nvar sendHostname_1 = sendHostname;\n/Mac/.test(navigator.platform);\nvar reSpaceMoreThanOne = /[\\u0020]+/g;\nvar reEscapeChars$1 = /[>(){}[\\]+-.!#|]/g;\nvar reEscapeHTML = /<([a-zA-Z_][a-zA-Z0-9\\-._]*)(\\s|[^\\\\>])*\\/?>|<(\\/)([a-zA-Z_][a-zA-Z0-9\\-._]*)\\s*\\/?>||<([a-zA-Z_][a-zA-Z0-9\\-.:/]*)>/g;\nvar reEscapeBackSlash = /\\\\[!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\\\\]/g;\nvar reEscapePairedChars = /[*_~`]/g;\nvar reMdImageSyntax = /!\\[.*\\]\\(.*\\)/g;\nvar reEscapedCharInLinkSyntax = /[[\\]]/g;\nvar reEscapeBackSlashInSentence = /(?:^|[^\\\\])\\\\(?!\\\\)/g;\nvar XMLSPECIAL$1 = '[&<>\"]';\nvar reXmlSpecial$1 = new RegExp(XMLSPECIAL$1, \"g\");\nfunction replaceUnsafeChar$1(char) {\n switch (char) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n default:\n return char;\n }\n}\nfunction escapeXml$1(text2) {\n if (reXmlSpecial$1.test(text2)) {\n return text2.replace(reXmlSpecial$1, replaceUnsafeChar$1);\n }\n return text2;\n}\nfunction sendHostName() {\n sendHostname_1(\"editor\", \"UA-129966929-1\");\n}\nfunction includes(arr, targetItem) {\n return arr.indexOf(targetItem) !== -1;\n}\nvar availableLinkAttributes = [\"rel\", \"target\", \"hreflang\", \"type\"];\nvar reMarkdownTextToEscapeMap = {\n codeblock: /(^ {4}[^\\n]+\\n*)+/,\n thematicBreak: /^ *((\\* *){3,}|(- *){3,} *|(_ *){3,}) */,\n atxHeading: /^(#{1,6}) +[\\s\\S]+/,\n seTextheading: /^([^\\n]+)\\n *(=|-){2,} */,\n blockquote: /^( *>[^\\n]+.*)+/,\n list: /^ *(\\*+|-+|\\d+\\.) [\\s\\S]+/,\n def: /^ *\\[([^\\]]+)\\]: *]+)>?(?: +[\"(]([^\\n]+)[\")])? */,\n link: /!?\\[.*\\]\\(.*\\)/,\n reflink: /!?\\[.*\\]\\s*\\[([^\\]]*)\\]/,\n verticalBar: /\\u007C/,\n fencedCodeblock: /^((`|~){3,})/\n};\nfunction sanitizeLinkAttribute(attribute) {\n if (!attribute) {\n return null;\n }\n var linkAttributes = {};\n availableLinkAttributes.forEach(function(key) {\n if (!isUndefined_1(attribute[key])) {\n linkAttributes[key] = attribute[key];\n }\n });\n return linkAttributes;\n}\nfunction repeat$1(text2, count) {\n var result = \"\";\n for (var i = 0; i < count; i += 1) {\n result += text2;\n }\n return result;\n}\nfunction isNeedEscapeText(text2) {\n var needEscape = false;\n forEachOwnProperties_1(reMarkdownTextToEscapeMap, function(reMarkdownTextToEscape) {\n if (reMarkdownTextToEscape.test(text2)) {\n needEscape = true;\n }\n return !needEscape;\n });\n return needEscape;\n}\nfunction escapeTextForLink(text2) {\n var imageSyntaxRanges = [];\n var result = reMdImageSyntax.exec(text2);\n while (result) {\n imageSyntaxRanges.push([result.index, result.index + result[0].length]);\n result = reMdImageSyntax.exec(text2);\n }\n return text2.replace(reEscapedCharInLinkSyntax, function(matched, offset) {\n var isDelimiter = imageSyntaxRanges.some(function(range2) {\n return offset > range2[0] && offset < range2[1];\n });\n return isDelimiter ? matched : \"\\\\\" + matched;\n });\n}\nfunction escape$1(text2) {\n var aheadReplacer = function(matched) {\n return \"\\\\\" + matched;\n };\n var behindReplacer = function(matched) {\n return matched + \"\\\\\";\n };\n var escapedText = text2.replace(reSpaceMoreThanOne, \" \");\n if (reEscapeBackSlash.test(escapedText)) {\n escapedText = escapedText.replace(reEscapeBackSlash, aheadReplacer);\n }\n if (reEscapeBackSlashInSentence.test(escapedText)) {\n escapedText = escapedText.replace(reEscapeBackSlashInSentence, behindReplacer);\n }\n escapedText = escapedText.replace(reEscapePairedChars, aheadReplacer);\n if (reEscapeHTML.test(escapedText)) {\n escapedText = escapedText.replace(reEscapeHTML, aheadReplacer);\n }\n if (isNeedEscapeText(escapedText)) {\n escapedText = escapedText.replace(reEscapeChars$1, aheadReplacer);\n }\n return escapedText;\n}\nfunction quote(text2) {\n var result;\n if (text2.indexOf('\"') === -1) {\n result = '\"\"';\n } else {\n result = text2.indexOf(\"'\") === -1 ? \"''\" : \"()\";\n }\n return result[0] + text2 + result[1];\n}\nfunction isNil(value) {\n return isNull_1(value) || isUndefined_1(value);\n}\nfunction shallowEqual(o1, o2) {\n if (o1 === null && o1 === o2) {\n return true;\n }\n if (typeof o1 !== \"object\" || typeof o2 !== \"object\" || isNil(o1) || isNil(o2)) {\n return o1 === o2;\n }\n for (var key in o1) {\n if (o1[key] !== o2[key]) {\n return false;\n }\n }\n for (var key in o2) {\n if (!(key in o1)) {\n return false;\n }\n }\n return true;\n}\nfunction last$1(arr) {\n return arr[arr.length - 1];\n}\nfunction between$1(value, min, max) {\n return value >= min && value <= max;\n}\nfunction isObject$1(obj) {\n return typeof obj === \"object\" && obj !== null;\n}\nfunction deepMergedCopy(targetObj, obj) {\n var resultObj = __assign$1({}, targetObj);\n if (targetObj && obj) {\n Object.keys(obj).forEach(function(prop2) {\n if (isObject$1(resultObj[prop2])) {\n if (Array.isArray(obj[prop2])) {\n resultObj[prop2] = deepCopyArray(obj[prop2]);\n } else if (resultObj.hasOwnProperty(prop2)) {\n resultObj[prop2] = deepMergedCopy(resultObj[prop2], obj[prop2]);\n } else {\n resultObj[prop2] = deepCopy(obj[prop2]);\n }\n } else {\n resultObj[prop2] = obj[prop2];\n }\n });\n }\n return resultObj;\n}\nfunction deepCopyArray(items) {\n return items.map(function(item2) {\n if (isObject$1(item2)) {\n return Array.isArray(item2) ? deepCopyArray(item2) : deepCopy(item2);\n }\n return item2;\n });\n}\nfunction deepCopy(obj) {\n var keys = Object.keys(obj);\n if (!keys.length) {\n return obj;\n }\n return keys.reduce(function(acc, prop2) {\n if (isObject$1(obj[prop2])) {\n acc[prop2] = Array.isArray(obj[prop2]) ? deepCopyArray(obj[prop2]) : deepCopy(obj[prop2]);\n } else {\n acc[prop2] = obj[prop2];\n }\n return acc;\n }, {});\n}\nfunction assign(targetObj, obj) {\n if (obj === void 0) {\n obj = {};\n }\n Object.keys(obj).forEach(function(prop2) {\n if (targetObj.hasOwnProperty(prop2) && typeof targetObj[prop2] === \"object\") {\n if (Array.isArray(obj[prop2])) {\n targetObj[prop2] = obj[prop2];\n } else {\n assign(targetObj[prop2], obj[prop2]);\n }\n } else {\n targetObj[prop2] = obj[prop2];\n }\n });\n return targetObj;\n}\nfunction getSortedNumPair(valueA, valueB) {\n return valueA > valueB ? [valueB, valueA] : [valueA, valueB];\n}\nvar forEachArray = forEachArray_1;\nfunction toArray$1(arrayLike) {\n var arr;\n try {\n arr = Array.prototype.slice.call(arrayLike);\n } catch (e) {\n arr = [];\n forEachArray(arrayLike, function(value) {\n arr.push(value);\n });\n }\n return arr;\n}\nvar toArray_1 = toArray$1;\nfunction createParagraph(schema, content) {\n var paragraph2 = schema.nodes.paragraph;\n if (!content) {\n return paragraph2.createAndFill();\n }\n return paragraph2.create(null, isString_1(content) ? schema.text(content) : content);\n}\nfunction createTextNode$1(schema, text2, marks) {\n return schema.text(text2, marks);\n}\nfunction createTextSelection(tr, from, to) {\n if (to === void 0) {\n to = from;\n }\n var contentSize = tr.doc.content.size;\n var size = contentSize > 0 ? contentSize - 1 : 1;\n return TextSelection.create(tr.doc, Math.min(from, size), Math.min(to, size));\n}\nfunction addParagraph(tr, _a, schema) {\n var pos = _a.pos;\n tr.replaceWith(pos, pos, createParagraph(schema));\n return tr.setSelection(createTextSelection(tr, pos + 1));\n}\nfunction replaceTextNode(_a) {\n var state = _a.state, from = _a.from, startIndex = _a.startIndex, endIndex = _a.endIndex, createText = _a.createText;\n var tr = state.tr, doc = state.doc, schema = state.schema;\n for (var i = startIndex; i <= endIndex; i += 1) {\n var _b = doc.child(i), nodeSize = _b.nodeSize, textContent = _b.textContent, content = _b.content;\n var text2 = createText(textContent);\n var node = text2 ? createTextNode$1(schema, text2) : Fragment.empty;\n var mappedFrom = tr.mapping.map(from);\n var mappedTo = mappedFrom + content.size;\n tr.replaceWith(mappedFrom, mappedTo, node);\n from += nodeSize;\n }\n return tr;\n}\nfunction splitAndExtendBlock(tr, pos, text2, node) {\n var textLen = text2.length;\n tr.split(pos).delete(pos - textLen, pos).insert(tr.mapping.map(pos), node).setSelection(createTextSelection(tr, tr.mapping.map(pos) - textLen));\n}\nfunction getMdStartLine(mdNode) {\n return mdNode.sourcepos[0][0];\n}\nfunction getMdEndLine(mdNode) {\n return mdNode.sourcepos[1][0];\n}\nfunction getMdStartCh(mdNode) {\n return mdNode.sourcepos[0][1];\n}\nfunction getMdEndCh(mdNode) {\n return mdNode.sourcepos[1][1];\n}\nfunction isHTMLNode(mdNode) {\n var type = mdNode.type;\n return type === \"htmlBlock\" || type === \"htmlInline\";\n}\nfunction isStyledInlineNode(mdNode) {\n var type = mdNode.type;\n return type === \"strike\" || type === \"strong\" || type === \"emph\" || type === \"code\" || type === \"link\" || type === \"image\";\n}\nfunction isCodeBlockNode(mdNode) {\n return mdNode && mdNode.type === \"codeBlock\";\n}\nfunction isListNode$1(mdNode) {\n return mdNode && (mdNode.type === \"item\" || mdNode.type === \"list\");\n}\nfunction isOrderedListNode(mdNode) {\n return isListNode$1(mdNode) && mdNode.listData.type === \"ordered\";\n}\nfunction isBulletListNode(mdNode) {\n return isListNode$1(mdNode) && mdNode.listData.type !== \"ordered\";\n}\nfunction isTableCellNode(mdNode) {\n return mdNode && (mdNode.type === \"tableCell\" || mdNode.type === \"tableDelimCell\");\n}\nfunction isInlineNode$1(mdNode) {\n switch (mdNode.type) {\n case \"code\":\n case \"text\":\n case \"emph\":\n case \"strong\":\n case \"strike\":\n case \"link\":\n case \"image\":\n case \"htmlInline\":\n case \"linebreak\":\n case \"softbreak\":\n case \"customInline\":\n return true;\n default:\n return false;\n }\n}\nfunction findClosestNode(mdNode, condition, includeSelf) {\n if (includeSelf === void 0) {\n includeSelf = true;\n }\n mdNode = includeSelf ? mdNode : mdNode.parent;\n while (mdNode && mdNode.type !== \"document\") {\n if (condition(mdNode)) {\n return mdNode;\n }\n mdNode = mdNode.parent;\n }\n return null;\n}\nfunction traverseParentNodes(mdNode, iteratee, includeSelf) {\n if (includeSelf === void 0) {\n includeSelf = true;\n }\n mdNode = includeSelf ? mdNode : mdNode.parent;\n while (mdNode && mdNode.type !== \"document\") {\n iteratee(mdNode);\n mdNode = mdNode.parent;\n }\n}\nfunction addOffsetPos(originPos, offset) {\n return [originPos[0], originPos[1] + offset];\n}\nfunction setOffsetPos(originPos, newOffset) {\n return [originPos[0], newOffset];\n}\nfunction getInlineMarkdownText(mdNode) {\n var text2 = mdNode.firstChild.literal;\n switch (mdNode.type) {\n case \"emph\":\n return \"*\" + text2 + \"*\";\n case \"strong\":\n return \"**\" + text2 + \"**\";\n case \"strike\":\n return \"~~\" + text2 + \"~~\";\n case \"code\":\n return \"`\" + text2 + \"`\";\n case \"link\":\n case \"image\":\n var _a = mdNode, destination = _a.destination, title = _a.title;\n var delim = mdNode.type === \"link\" ? \"\" : \"!\";\n return delim + \"[\" + text2 + \"](\" + destination + (title ? ' \"' + title + '\"' : \"\") + \")\";\n default:\n return null;\n }\n}\nfunction isContainer$2(node) {\n switch (node.type) {\n case \"document\":\n case \"blockQuote\":\n case \"list\":\n case \"item\":\n case \"paragraph\":\n case \"heading\":\n case \"emph\":\n case \"strong\":\n case \"strike\":\n case \"link\":\n case \"image\":\n case \"table\":\n case \"tableHead\":\n case \"tableBody\":\n case \"tableRow\":\n case \"tableCell\":\n case \"tableDelimRow\":\n case \"customInline\":\n return true;\n default:\n return false;\n }\n}\nfunction getChildrenText$1(node) {\n var buffer = [];\n var walker = node.walker();\n var event = null;\n while (event = walker.next()) {\n var childNode = event.node;\n if (childNode.type === \"text\") {\n buffer.push(childNode.literal);\n }\n }\n return buffer.join(\"\");\n}\nvar widgetRules = [];\nvar widgetRuleMap = {};\nvar reWidgetPrefix = /\\$\\$widget\\d+\\s/;\nfunction unwrapWidgetSyntax(text2) {\n var index2 = text2.search(reWidgetPrefix);\n if (index2 !== -1) {\n var rest = text2.substring(index2);\n var replaced = rest.replace(reWidgetPrefix, \"\").replace(\"$$\", \"\");\n text2 = text2.substring(0, index2);\n text2 += unwrapWidgetSyntax(replaced);\n }\n return text2;\n}\nfunction createWidgetContent(info, text2) {\n return \"$$\" + info + \" \" + text2 + \"$$\";\n}\nfunction widgetToDOM(info, text2) {\n var _a = widgetRuleMap[info], rule = _a.rule, toDOM = _a.toDOM;\n var matches2 = unwrapWidgetSyntax(text2).match(rule);\n if (matches2) {\n text2 = matches2[0];\n }\n return toDOM(text2);\n}\nfunction getWidgetRules() {\n return widgetRules;\n}\nfunction setWidgetRules(rules) {\n widgetRules = rules;\n widgetRules.forEach(function(rule, index2) {\n widgetRuleMap[\"widget\" + index2] = rule;\n });\n}\nfunction mergeNodes(nodes, text2, schema, ruleIndex) {\n return nodes.concat(createNodesWithWidget(text2, schema, ruleIndex));\n}\nfunction createNodesWithWidget(text2, schema, ruleIndex) {\n if (ruleIndex === void 0) {\n ruleIndex = 0;\n }\n var nodes = [];\n var rule = (widgetRules[ruleIndex] || {}).rule;\n var nextRuleIndex = ruleIndex + 1;\n text2 = unwrapWidgetSyntax(text2);\n if (rule && rule.test(text2)) {\n var index2 = void 0;\n while ((index2 = text2.search(rule)) !== -1) {\n var prev = text2.substring(0, index2);\n if (prev) {\n nodes = mergeNodes(nodes, prev, schema, nextRuleIndex);\n }\n text2 = text2.substring(index2);\n var literal = text2.match(rule)[0];\n var info = \"widget\" + ruleIndex;\n nodes.push(schema.nodes.widget.create({ info }, schema.text(createWidgetContent(info, literal))));\n text2 = text2.substring(literal.length);\n }\n if (text2) {\n nodes = mergeNodes(nodes, text2, schema, nextRuleIndex);\n }\n } else if (text2) {\n nodes = ruleIndex < widgetRules.length - 1 ? mergeNodes(nodes, text2, schema, nextRuleIndex) : [schema.text(text2)];\n }\n return nodes;\n}\nfunction getWidgetContent(widgetNode) {\n var event;\n var text2 = \"\";\n var walker = widgetNode.walker();\n while (event = walker.next()) {\n var node = event.node, entering = event.entering;\n if (entering) {\n if (node !== widgetNode && node.type !== \"text\") {\n text2 += getInlineMarkdownText(node);\n walker.resumeAt(widgetNode, false);\n walker.next();\n } else if (node.type === \"text\") {\n text2 += node.literal;\n }\n }\n }\n return text2;\n}\nfunction getDefaultCommands() {\n return {\n deleteSelection: function() {\n return deleteSelection;\n },\n selectAll: function() {\n return selectAll;\n },\n undo: function() {\n return undo;\n },\n redo: function() {\n return redo;\n }\n };\n}\nfunction placeholder(options) {\n return new Plugin({\n props: {\n decorations: function(state) {\n var doc = state.doc;\n if (options.text && doc.childCount === 1 && doc.firstChild.isTextblock && doc.firstChild.content.size === 0) {\n var placeHolder = document.createElement(\"span\");\n addClass_1(placeHolder, \"placeholder\");\n if (options.className) {\n addClass_1(placeHolder, options.className);\n }\n placeHolder.textContent = options.text;\n return DecorationSet.create(doc, [Decoration.widget(1, placeHolder)]);\n }\n return null;\n }\n }\n });\n}\nvar inArray$1 = inArray_1;\nvar getClass = getClass_1;\nfunction hasClass(element, cssClass) {\n var origin;\n if (element.classList) {\n return element.classList.contains(cssClass);\n }\n origin = getClass(element).split(/\\s+/);\n return inArray$1(cssClass, origin) > -1;\n}\nvar hasClass_1 = hasClass;\nvar inArray = inArray_1;\nvar toArray = toArray_1;\nvar elProto = Element.prototype;\nvar matchSelector = elProto.matches || elProto.webkitMatchesSelector || elProto.mozMatchesSelector || elProto.msMatchesSelector || function(selector) {\n var doc = this.document || this.ownerDocument;\n return inArray(this, toArray(doc.querySelectorAll(selector))) > -1;\n};\nfunction matches(element, selector) {\n return matchSelector.call(element, selector);\n}\nvar matches_1 = matches;\nvar TAG_NAME = \"[A-Za-z][A-Za-z0-9-]*\";\nvar ATTRIBUTE_NAME = \"[a-zA-Z_:][a-zA-Z0-9:._-]*\";\nvar UNQUOTED_VALUE = \"[^\\\"'=<>`\\\\x00-\\\\x20]+\";\nvar SINGLE_QUOTED_VALUE = \"'[^']*'\";\nvar DOUBLE_QUOTED_VALUE = '\"[^\"]*\"';\nvar ATTRIBUTE_VALUE = \"(?:\" + UNQUOTED_VALUE + \"|\" + SINGLE_QUOTED_VALUE + \"|\" + DOUBLE_QUOTED_VALUE + \")\";\nvar ATTRIBUTE_VALUE_SPEC = \"(?:\\\\s*=\\\\s*\" + ATTRIBUTE_VALUE + \")\";\nvar ATTRIBUTE$1 = \"(?:\\\\s+\" + ATTRIBUTE_NAME + ATTRIBUTE_VALUE_SPEC + \"?)\";\nvar OPEN_TAG = \"<(\" + TAG_NAME + \")(\" + ATTRIBUTE$1 + \")*\\\\s*/?>\";\nvar CLOSE_TAG = \"]\";\nvar HTML_TAG = \"(?:\" + OPEN_TAG + \"|\" + CLOSE_TAG + \")\";\nvar reHTMLTag = new RegExp(\"^\" + HTML_TAG, \"i\");\nvar reBR = //i;\nvar reHTMLComment = /|/;\nvar ALTERNATIVE_TAG_FOR_BR = \"

    \";\nfunction isPositionInBox(style, offsetX, offsetY) {\n var left = parseInt(style.left, 10);\n var top2 = parseInt(style.top, 10);\n var width = parseInt(style.width, 10) + parseInt(style.paddingLeft, 10) + parseInt(style.paddingRight, 10);\n var height = parseInt(style.height, 10) + parseInt(style.paddingTop, 10) + parseInt(style.paddingBottom, 10);\n return offsetX >= left && offsetX <= left + width && offsetY >= top2 && offsetY <= top2 + height;\n}\nvar CLS_PREFIX = \"toastui-editor-\";\nfunction cls() {\n var names = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n names[_i] = arguments[_i];\n }\n var result = [];\n for (var _a = 0, names_1 = names; _a < names_1.length; _a++) {\n var name_1 = names_1[_a];\n var className = void 0;\n if (Array.isArray(name_1)) {\n className = name_1[0] ? name_1[1] : null;\n } else {\n className = name_1;\n }\n if (className) {\n result.push(\"\" + CLS_PREFIX + className);\n }\n }\n return result.join(\" \");\n}\nfunction clsWithMdPrefix() {\n var names = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n names[_i] = arguments[_i];\n }\n return names.map(function(className) {\n return CLS_PREFIX + \"md-\" + className;\n }).join(\" \");\n}\nfunction isTextNode(node) {\n return (node === null || node === void 0 ? void 0 : node.nodeType) === Node.TEXT_NODE;\n}\nfunction isElemNode(node) {\n return node && node.nodeType === Node.ELEMENT_NODE;\n}\nfunction findNodes(element, selector) {\n var nodeList = toArray_1(element.querySelectorAll(selector));\n if (nodeList.length) {\n return nodeList;\n }\n return [];\n}\nfunction appendNodes(node, nodesToAppend) {\n nodesToAppend = isArray_1(nodesToAppend) ? toArray_1(nodesToAppend) : [nodesToAppend];\n nodesToAppend.forEach(function(nodeToAppend) {\n node.appendChild(nodeToAppend);\n });\n}\nfunction insertBeforeNode(insertedNode, node) {\n if (node.parentNode) {\n node.parentNode.insertBefore(insertedNode, node);\n }\n}\nfunction removeNode$1(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction unwrapNode(node) {\n var result = [];\n while (node.firstChild) {\n result.push(node.firstChild);\n if (node.parentNode) {\n node.parentNode.insertBefore(node.firstChild, node);\n }\n }\n removeNode$1(node);\n return result;\n}\nfunction toggleClass(element, className, state) {\n if (isUndefined_1(state)) {\n state = !hasClass_1(element, className);\n }\n var toggleFn = state ? addClass_1 : removeClass_1;\n toggleFn(element, className);\n}\nfunction createElementWith(contents, target2) {\n var container = document.createElement(\"div\");\n if (isString_1(contents)) {\n container.innerHTML = contents;\n } else {\n container.appendChild(contents);\n }\n var firstChild = container.firstChild;\n if (target2) {\n target2.appendChild(firstChild);\n }\n return firstChild;\n}\nfunction getOuterWidth(el2) {\n var computed = window.getComputedStyle(el2);\n return [\"margin-left\", \"margin-right\"].reduce(function(acc, type) {\n return acc + parseInt(computed.getPropertyValue(type), 10);\n }, 0) + el2.offsetWidth;\n}\nfunction closest(node, found) {\n var condition;\n if (isString_1(found)) {\n condition = function(target2) {\n return matches_1(target2, found);\n };\n } else {\n condition = function(target2) {\n return target2 === found;\n };\n }\n while (node && node !== document) {\n if (isElemNode(node) && condition(node)) {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n}\nfunction getTotalOffset(el2, root) {\n var offsetTop = 0;\n var offsetLeft = 0;\n while (el2 && el2 !== root) {\n var top_1 = el2.offsetTop, left = el2.offsetLeft, offsetParent = el2.offsetParent;\n offsetTop += top_1;\n offsetLeft += left;\n if (offsetParent === root.offsetParent) {\n break;\n }\n el2 = el2.offsetParent;\n }\n return { offsetTop, offsetLeft };\n}\nfunction setAttributes(attributes, element) {\n Object.keys(attributes).forEach(function(attrName) {\n if (isNil(attributes[attrName])) {\n element.removeAttribute(attrName);\n } else {\n element.setAttribute(attrName, attributes[attrName]);\n }\n });\n}\nfunction replaceBRWithEmptyBlock(html2) {\n var replacedHTML = html2.replace(/

    <\\/p>/gi, \"

    \");\n var reHTMLTag2 = new RegExp(HTML_TAG, \"ig\");\n var htmlTagMatched = replacedHTML.match(reHTMLTag2);\n htmlTagMatched === null || htmlTagMatched === void 0 ? void 0 : htmlTagMatched.forEach(function(htmlTag, index2) {\n if (reBR.test(htmlTag)) {\n var alternativeTag = ALTERNATIVE_TAG_FOR_BR;\n if (index2) {\n var prevTag = htmlTagMatched[index2 - 1];\n var openTagMatched = prevTag.match(OPEN_TAG);\n if (openTagMatched && !/br/i.test(openTagMatched[1])) {\n var tagName = openTagMatched[1];\n alternativeTag = \"<\" + tagName + \">\";\n }\n }\n replacedHTML = replacedHTML.replace(reBR, alternativeTag);\n }\n });\n return replacedHTML;\n}\nfunction removeProseMirrorHackNodes(html2) {\n var reProseMirrorImage = /\"\"/g;\n var reProseMirrorTrailingBreak = / class=\"ProseMirror-trailingBreak\"/g;\n var resultHTML = html2;\n resultHTML = resultHTML.replace(reProseMirrorImage, \"\");\n resultHTML = resultHTML.replace(reProseMirrorTrailingBreak, \"\");\n return resultHTML;\n}\nvar pluginKey$1 = new PluginKey(\"widget\");\nvar MARGIN = 5;\nvar PopupWidget = (\n /** @class */\n function() {\n function PopupWidget2(view, eventEmitter) {\n var _this = this;\n this.popup = null;\n this.removeWidget = function() {\n if (_this.popup) {\n _this.rootEl.removeChild(_this.popup);\n _this.popup = null;\n }\n };\n this.rootEl = view.dom.parentElement;\n this.eventEmitter = eventEmitter;\n this.eventEmitter.listen(\"blur\", this.removeWidget);\n this.eventEmitter.listen(\"loadUI\", function() {\n _this.rootEl = closest(view.dom.parentElement, \".\" + cls(\"defaultUI\"));\n });\n this.eventEmitter.listen(\"removePopupWidget\", this.removeWidget);\n }\n PopupWidget2.prototype.update = function(view) {\n var widget = pluginKey$1.getState(view.state);\n this.removeWidget();\n if (widget) {\n var node = widget.node, style = widget.style;\n var _a = view.coordsAtPos(widget.pos), top_1 = _a.top, left = _a.left, bottom2 = _a.bottom;\n var height = bottom2 - top_1;\n var rect2 = this.rootEl.getBoundingClientRect();\n var relTopPos = top_1 - rect2.top;\n css_1(node, { opacity: \"0\" });\n this.rootEl.appendChild(node);\n css_1(node, {\n position: \"absolute\",\n left: left - rect2.left + MARGIN + \"px\",\n top: (style === \"bottom\" ? relTopPos + height - MARGIN : relTopPos - height) + \"px\",\n opacity: \"1\"\n });\n this.popup = node;\n view.focus();\n }\n };\n PopupWidget2.prototype.destroy = function() {\n this.eventEmitter.removeEventHandler(\"blur\", this.removeWidget);\n };\n return PopupWidget2;\n }()\n);\nfunction addWidget(eventEmitter) {\n return new Plugin({\n key: pluginKey$1,\n state: {\n init: function() {\n return null;\n },\n apply: function(tr) {\n return tr.getMeta(\"widget\");\n }\n },\n view: function(editorView) {\n return new PopupWidget(editorView, eventEmitter);\n }\n });\n}\nfunction addDefaultImageBlobHook(eventEmitter) {\n eventEmitter.listen(\"addImageBlobHook\", function(blob, callback) {\n var reader = new FileReader();\n reader.onload = function(_a) {\n var target2 = _a.target;\n return callback(target2.result);\n };\n reader.readAsDataURL(blob);\n });\n}\nfunction emitImageBlobHook(eventEmitter, blob, type) {\n var hook = function(imageUrl, altText) {\n eventEmitter.emit(\"command\", \"addImage\", {\n imageUrl,\n altText: altText || blob.name || \"image\"\n });\n };\n eventEmitter.emit(\"addImageBlobHook\", blob, hook, type);\n}\nfunction pasteImageOnly(items) {\n var images = toArray_1(items).filter(function(_a) {\n var type = _a.type;\n return type.indexOf(\"image\") !== -1;\n });\n if (images.length === 1) {\n var item2 = images[0];\n if (item2) {\n return item2.getAsFile();\n }\n }\n return null;\n}\nfunction dropImage(_a) {\n var eventEmitter = _a.eventEmitter;\n return new Plugin({\n props: {\n handleDOMEvents: {\n drop: function(_, ev) {\n var _a2;\n var items = (_a2 = ev.dataTransfer) === null || _a2 === void 0 ? void 0 : _a2.files;\n if (items) {\n forEachArray_1(items, function(item2) {\n if (item2.type.indexOf(\"image\") !== -1) {\n ev.preventDefault();\n ev.stopPropagation();\n emitImageBlobHook(eventEmitter, item2, ev.type);\n return false;\n }\n return true;\n });\n }\n return true;\n }\n }\n }\n });\n}\nvar Node$2 = (\n /** @class */\n function() {\n function Node2() {\n }\n Object.defineProperty(Node2.prototype, \"type\", {\n get: function() {\n return \"node\";\n },\n enumerable: false,\n configurable: true\n });\n Node2.prototype.setContext = function(context) {\n this.context = context;\n };\n return Node2;\n }()\n);\nfunction widgetNodeView(pmNode) {\n var dom = document.createElement(\"span\");\n var node = widgetToDOM(pmNode.attrs.info, pmNode.textContent);\n dom.className = \"tui-widget\";\n dom.appendChild(node);\n return { dom };\n}\nfunction isWidgetNode(pmNode) {\n return pmNode.type.name === \"widget\";\n}\nvar Widget = (\n /** @class */\n function(_super) {\n __extends$1(Widget2, _super);\n function Widget2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Widget2.prototype, \"name\", {\n get: function() {\n return \"widget\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Widget2.prototype, \"schema\", {\n get: function() {\n return {\n attrs: {\n info: { default: null }\n },\n group: \"inline\",\n inline: true,\n content: \"text*\",\n selectable: false,\n atom: true,\n toDOM: function() {\n return [\"span\", { class: \"tui-widget\" }, 0];\n },\n parseDOM: [\n {\n tag: \"span.tui-widget\",\n getAttrs: function(dom) {\n var text2 = dom.textContent;\n var _a = text2.match(/\\$\\$(widget\\d+)/), info = _a[1];\n return { info };\n }\n }\n ]\n };\n },\n enumerable: false,\n configurable: true\n });\n return Widget2;\n }(Node$2)\n);\nvar EditorBase = (\n /** @class */\n function() {\n function EditorBase2(eventEmitter) {\n this.timer = null;\n this.el = document.createElement(\"div\");\n this.el.className = \"toastui-editor\";\n this.eventEmitter = eventEmitter;\n this.placeholder = { text: \"\" };\n }\n EditorBase2.prototype.createState = function() {\n return EditorState.create({\n schema: this.schema,\n plugins: this.createPlugins()\n });\n };\n EditorBase2.prototype.initEvent = function() {\n var _a = this, eventEmitter = _a.eventEmitter, view = _a.view, editorType = _a.editorType;\n view.dom.addEventListener(\"focus\", function() {\n return eventEmitter.emit(\"focus\", editorType);\n });\n view.dom.addEventListener(\"blur\", function() {\n return eventEmitter.emit(\"blur\", editorType);\n });\n };\n EditorBase2.prototype.emitChangeEvent = function(tr) {\n this.eventEmitter.emit(\"caretChange\", this.editorType);\n if (tr.docChanged) {\n this.eventEmitter.emit(\"change\", this.editorType);\n }\n };\n Object.defineProperty(EditorBase2.prototype, \"defaultPlugins\", {\n get: function() {\n var rules = this.createInputRules();\n var plugins = __spreadArray$1(__spreadArray$1([], this.keymaps), [\n keymap(__assign$1({ \"Shift-Enter\": baseKeymap.Enter }, baseKeymap)),\n history(),\n placeholder(this.placeholder),\n addWidget(this.eventEmitter),\n dropImage(this.context)\n ]);\n return rules ? plugins.concat(rules) : plugins;\n },\n enumerable: false,\n configurable: true\n });\n EditorBase2.prototype.createInputRules = function() {\n var widgetRules2 = getWidgetRules();\n var rules = widgetRules2.map(function(_a) {\n var rule = _a.rule;\n return new InputRule(rule, function(state, match, start, end) {\n var schema = state.schema, tr = state.tr, doc = state.doc;\n var allMatched = match.input.match(new RegExp(rule, \"g\"));\n var pos = doc.resolve(start);\n var parent = pos.parent;\n var count = 0;\n if (isWidgetNode(parent)) {\n parent = pos.node(pos.depth - 1);\n }\n parent.forEach(function(child) {\n return isWidgetNode(child) && (count += 1);\n });\n if (allMatched.length > count) {\n var content = last$1(allMatched);\n var nodes = createNodesWithWidget(content, schema);\n return tr.replaceWith(end - content.length + 1, end, nodes);\n }\n return null;\n });\n });\n return rules.length ? inputRules({ rules }) : null;\n };\n EditorBase2.prototype.clearTimer = function() {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n };\n EditorBase2.prototype.createSchema = function() {\n return new Schema({\n nodes: this.specs.nodes,\n marks: this.specs.marks\n });\n };\n EditorBase2.prototype.createKeymaps = function(useCommandShortcut) {\n var _a = getDefaultCommands(), undo2 = _a.undo, redo2 = _a.redo;\n var allKeymaps = this.specs.keymaps(useCommandShortcut);\n var historyKeymap = {\n \"Mod-z\": undo2(),\n \"Shift-Mod-z\": redo2()\n };\n return useCommandShortcut ? allKeymaps.concat(keymap(historyKeymap)) : allKeymaps;\n };\n EditorBase2.prototype.createCommands = function() {\n return this.specs.commands(this.view);\n };\n EditorBase2.prototype.createPluginProps = function() {\n var _this = this;\n return this.extraPlugins.map(function(plugin) {\n return plugin(_this.eventEmitter);\n });\n };\n EditorBase2.prototype.focus = function() {\n var _this = this;\n this.clearTimer();\n this.timer = setTimeout(function() {\n _this.view.focus();\n _this.view.dispatch(_this.view.state.tr.scrollIntoView());\n });\n };\n EditorBase2.prototype.blur = function() {\n this.view.dom.blur();\n };\n EditorBase2.prototype.destroy = function() {\n var _this = this;\n this.clearTimer();\n this.view.destroy();\n Object.keys(this).forEach(function(prop2) {\n delete _this[prop2];\n });\n };\n EditorBase2.prototype.moveCursorToStart = function(focus) {\n var tr = this.view.state.tr;\n this.view.dispatch(tr.setSelection(createTextSelection(tr, 1)).scrollIntoView());\n if (focus) {\n this.focus();\n }\n };\n EditorBase2.prototype.moveCursorToEnd = function(focus) {\n var tr = this.view.state.tr;\n this.view.dispatch(tr.setSelection(createTextSelection(tr, tr.doc.content.size - 1)).scrollIntoView());\n if (focus) {\n this.focus();\n }\n };\n EditorBase2.prototype.setScrollTop = function(top2) {\n this.view.dom.scrollTop = top2;\n };\n EditorBase2.prototype.getScrollTop = function() {\n return this.view.dom.scrollTop;\n };\n EditorBase2.prototype.setPlaceholder = function(text2) {\n this.placeholder.text = text2;\n this.view.dispatch(this.view.state.tr.scrollIntoView());\n };\n EditorBase2.prototype.setHeight = function(height) {\n css_1(this.el, { height: height + \"px\" });\n };\n EditorBase2.prototype.setMinHeight = function(minHeight) {\n css_1(this.el, { minHeight: minHeight + \"px\" });\n };\n EditorBase2.prototype.getElement = function() {\n return this.el;\n };\n return EditorBase2;\n }()\n);\nfunction isFunction(obj) {\n return obj instanceof Function;\n}\nvar isFunction_1 = isFunction;\nvar defaultCommandShortcuts = [\n \"Enter\",\n \"Shift-Enter\",\n \"Mod-Enter\",\n \"Tab\",\n \"Shift-Tab\",\n \"Delete\",\n \"Backspace\",\n \"Mod-Delete\",\n \"Mod-Backspace\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Mod-d\",\n \"Mod-D\",\n \"Alt-ArrowUp\",\n \"Alt-ArrowDown\"\n];\nfunction execCommand(view, command, payload) {\n view.focus();\n return command(payload)(view.state, view.dispatch, view);\n}\nvar SpecManager = (\n /** @class */\n function() {\n function SpecManager2(specs) {\n this.specs = specs;\n }\n Object.defineProperty(SpecManager2.prototype, \"nodes\", {\n get: function() {\n return this.specs.filter(function(spec) {\n return spec.type === \"node\";\n }).reduce(function(nodes, _a) {\n var _b;\n var name = _a.name, schema = _a.schema;\n return __assign$1(__assign$1({}, nodes), (_b = {}, _b[name] = schema, _b));\n }, {});\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SpecManager2.prototype, \"marks\", {\n get: function() {\n return this.specs.filter(function(spec) {\n return spec.type === \"mark\";\n }).reduce(function(marks, _a) {\n var _b;\n var name = _a.name, schema = _a.schema;\n return __assign$1(__assign$1({}, marks), (_b = {}, _b[name] = schema, _b));\n }, {});\n },\n enumerable: false,\n configurable: true\n });\n SpecManager2.prototype.commands = function(view, addedCommands) {\n var specCommands = this.specs.filter(function(_a) {\n var commands = _a.commands;\n return commands;\n }).reduce(function(allCommands, spec) {\n var commands = {};\n var specCommand = spec.commands();\n if (isFunction_1(specCommand)) {\n commands[spec.name] = function(payload) {\n return execCommand(view, specCommand, payload);\n };\n } else {\n Object.keys(specCommand).forEach(function(name) {\n commands[name] = function(payload) {\n return execCommand(view, specCommand[name], payload);\n };\n });\n }\n return __assign$1(__assign$1({}, allCommands), commands);\n }, {});\n var defaultCommands = getDefaultCommands();\n Object.keys(defaultCommands).forEach(function(name) {\n specCommands[name] = function(payload) {\n return execCommand(view, defaultCommands[name], payload);\n };\n });\n if (addedCommands) {\n Object.keys(addedCommands).forEach(function(name) {\n specCommands[name] = function(payload) {\n return execCommand(view, addedCommands[name], payload);\n };\n });\n }\n return specCommands;\n };\n SpecManager2.prototype.keymaps = function(useCommandShortcut) {\n var specKeymaps = this.specs.filter(function(spec) {\n return spec.keymaps;\n }).map(function(spec) {\n return spec.keymaps();\n });\n return specKeymaps.map(function(keys) {\n if (!useCommandShortcut) {\n Object.keys(keys).forEach(function(key) {\n if (!includes(defaultCommandShortcuts, key)) {\n delete keys[key];\n }\n });\n }\n return keymap(keys);\n });\n };\n SpecManager2.prototype.setContext = function(context) {\n this.specs.forEach(function(spec) {\n spec.setContext(context);\n });\n };\n return SpecManager2;\n }()\n);\nfunction resolveSelectionPos(selection) {\n var from = selection.from, to = selection.to;\n if (selection instanceof AllSelection) {\n return [from + 1, to - 1];\n }\n return [from, to];\n}\nfunction getMdLine(resolvedPos) {\n return resolvedPos.index(0) + 1;\n}\nfunction getWidgetNodePos(node, chPos, direction) {\n if (direction === void 0) {\n direction = 1;\n }\n var additionalPos = 0;\n node.forEach(function(child, pos) {\n if (isWidgetNode(child) && pos + 2 < chPos) {\n additionalPos += 2 * direction;\n }\n });\n return additionalPos;\n}\nfunction getEditorToMdPos(doc, from, to) {\n if (to === void 0) {\n to = from;\n }\n var collapsed = from === to;\n var startResolvedPos = doc.resolve(from);\n var startLine = getMdLine(startResolvedPos);\n var endLine = startLine;\n var startOffset = startResolvedPos.start(1);\n var endOffset = startOffset;\n if (!collapsed) {\n var endResolvedPos = doc.resolve(to === doc.content.size ? to - 1 : to);\n endOffset = endResolvedPos.start(1);\n endLine = getMdLine(endResolvedPos);\n if (endResolvedPos.pos === doc.content.size) {\n to = doc.content.size - 2;\n }\n }\n var startCh = Math.max(from - startOffset + 1, 1);\n var endCh = Math.max(to - endOffset + 1, 1);\n return [\n [startLine, startCh + getWidgetNodePos(doc.child(startLine - 1), startCh, -1)],\n [endLine, endCh + getWidgetNodePos(doc.child(endLine - 1), endCh, -1)]\n ];\n}\nfunction getStartPosListPerLine(doc, endIndex) {\n var startPosListPerLine = [];\n for (var i = 0, pos = 0; i < endIndex; i += 1) {\n var child = doc.child(i);\n startPosListPerLine[i] = pos;\n pos += child.nodeSize;\n }\n return startPosListPerLine;\n}\nfunction getMdToEditorPos(doc, startPos, endPos) {\n var startPosListPerLine = getStartPosListPerLine(doc, endPos[0]);\n var startIndex = startPos[0] - 1;\n var endIndex = endPos[0] - 1;\n var startNode = doc.child(startIndex);\n var endNode = doc.child(endIndex);\n var from = startPosListPerLine[startIndex];\n var to = startPosListPerLine[endIndex];\n from += startPos[1] + getWidgetNodePos(startNode, startPos[1] - 1);\n to += endPos[1] + getWidgetNodePos(endNode, endPos[1] - 1);\n return [from, Math.min(to, doc.content.size)];\n}\nfunction getRangeInfo(selection) {\n var $from = selection.$from, $to = selection.$to;\n var from = selection.from, to = selection.to;\n var doc = $from.doc;\n if (selection instanceof AllSelection) {\n $from = doc.resolve(from + 1);\n $to = doc.resolve(to - 1);\n }\n if ($from.depth === 0) {\n $from = doc.resolve(from - 1);\n $to = $from;\n }\n return {\n startFromOffset: $from.start(1),\n endFromOffset: $to.start(1),\n startToOffset: $from.end(1),\n endToOffset: $to.end(1),\n startIndex: $from.index(0),\n endIndex: $to.index(0),\n from: $from.pos,\n to: $to.pos\n };\n}\nfunction getNodeContentOffsetRange(doc, targetIndex) {\n var startOffset = 1;\n var endOffset = 1;\n for (var i = 0, offset = 0; i < doc.childCount; i += 1) {\n var nodeSize = doc.child(i).nodeSize;\n startOffset = offset + 1;\n endOffset = offset + nodeSize - 1;\n if (i === targetIndex) {\n break;\n }\n offset += nodeSize;\n }\n return { startOffset, endOffset };\n}\nvar HEADING = \"heading\";\nvar BLOCK_QUOTE = \"blockQuote\";\nvar LIST_ITEM = \"listItem\";\nvar TABLE = \"table\";\nvar TABLE_CELL = \"tableCell\";\nvar CODE_BLOCK = \"codeBlock\";\nvar THEMATIC_BREAK = \"thematicBreak\";\nvar LINK = \"link\";\nvar CODE = \"code\";\nvar META = \"meta\";\nvar DELIM = \"delimiter\";\nvar TASK_DELIM = \"taskDelimiter\";\nvar TEXT = \"markedText\";\nvar HTML = \"html\";\nvar CUSTOM_BLOCK = \"customBlock\";\nvar delimSize = {\n strong: 2,\n emph: 1,\n strike: 2\n};\nfunction markInfo(start, end, type, attrs) {\n return { start, end, spec: { type, attrs } };\n}\nfunction heading$1(_a, start, end) {\n var level = _a.level, headingType = _a.headingType;\n var marks = [markInfo(start, end, HEADING, { level })];\n if (headingType === \"atx\") {\n marks.push(markInfo(start, addOffsetPos(start, level), DELIM));\n } else {\n marks.push(markInfo(setOffsetPos(end, 0), end, HEADING, { seText: true }));\n }\n return marks;\n}\nfunction emphasisAndStrikethrough(_a, start, end) {\n var type = _a.type;\n var startDelimPos = addOffsetPos(start, delimSize[type]);\n var endDelimPos = addOffsetPos(end, -delimSize[type]);\n return [\n markInfo(startDelimPos, endDelimPos, type),\n markInfo(start, startDelimPos, DELIM),\n markInfo(endDelimPos, end, DELIM)\n ];\n}\nfunction markLink(start, end, linkTextStart, lastChildCh) {\n return [\n markInfo(start, end, LINK),\n markInfo(setOffsetPos(start, linkTextStart[1] + 1), setOffsetPos(end, lastChildCh), LINK, {\n desc: true\n }),\n markInfo(setOffsetPos(end, lastChildCh + 2), addOffsetPos(end, -1), LINK, { url: true })\n ];\n}\nfunction image$1(_a, start, end) {\n var lastChild = _a.lastChild;\n var lastChildCh = lastChild ? getMdEndCh(lastChild) + 1 : 3;\n var linkTextEnd = addOffsetPos(start, 1);\n return __spreadArray$1([markInfo(start, linkTextEnd, META)], markLink(start, end, linkTextEnd, lastChildCh));\n}\nfunction link(_a, start, end) {\n var lastChild = _a.lastChild, extendedAutolink = _a.extendedAutolink;\n var lastChildCh = lastChild ? getMdEndCh(lastChild) + 1 : 2;\n return extendedAutolink ? [markInfo(start, end, LINK, { desc: true })] : markLink(start, end, start, lastChildCh);\n}\nfunction code(_a, start, end) {\n var tickCount = _a.tickCount;\n var openDelimEnd = addOffsetPos(start, tickCount);\n var closeDelimStart = addOffsetPos(end, -tickCount);\n return [\n markInfo(start, end, CODE),\n markInfo(start, openDelimEnd, CODE, { start: true }),\n markInfo(openDelimEnd, closeDelimStart, CODE, { marked: true }),\n markInfo(closeDelimStart, end, CODE, { end: true })\n ];\n}\nfunction lineBackground(parent, start, end, prefix) {\n var defaultBackground = {\n start,\n end,\n spec: {\n attrs: { className: prefix + \"-line-background\", codeStart: start[0], codeEnd: end[0] }\n },\n lineBackground: true\n };\n return parent.type !== \"item\" && parent.type !== \"blockQuote\" ? [\n __assign$1(__assign$1({}, defaultBackground), { end: start, spec: { attrs: { className: prefix + \"-line-background start\" } } }),\n __assign$1(__assign$1({}, defaultBackground), { start: [Math.min(start[0] + 1, end[0]), start[1]] })\n ] : null;\n}\nfunction codeBlock$1(node, start, end, endLine) {\n var fenceOffset = node.fenceOffset, fenceLength = node.fenceLength, fenceChar = node.fenceChar, info = node.info, infoPadding = node.infoPadding, parent = node.parent;\n var fenceEnd = fenceOffset + fenceLength;\n var marks = [markInfo(setOffsetPos(start, 1), end, CODE_BLOCK)];\n if (fenceChar) {\n marks.push(markInfo(start, addOffsetPos(start, fenceEnd), DELIM));\n }\n if (info) {\n marks.push(markInfo(addOffsetPos(start, fenceLength), addOffsetPos(start, fenceLength + infoPadding + info.length), META));\n }\n var codeBlockEnd = \"^(\\\\s{0,4})(\" + fenceChar + \"{\" + fenceLength + \",})\";\n var reCodeBlockEnd = new RegExp(codeBlockEnd);\n if (reCodeBlockEnd.test(endLine)) {\n marks.push(markInfo(setOffsetPos(end, 1), end, DELIM));\n }\n var lineBackgroundMarkInfo = lineBackground(parent, start, end, \"code-block\");\n return lineBackgroundMarkInfo ? marks.concat(lineBackgroundMarkInfo) : marks;\n}\nfunction customBlock$2(node, start, end) {\n var _a = node, offset = _a.offset, syntaxLength = _a.syntaxLength, info = _a.info, parent = _a.parent;\n var syntaxEnd = offset + syntaxLength;\n var marks = [markInfo(setOffsetPos(start, 1), end, CUSTOM_BLOCK)];\n marks.push(markInfo(start, addOffsetPos(start, syntaxEnd), DELIM));\n if (info) {\n marks.push(markInfo(addOffsetPos(start, syntaxEnd), addOffsetPos(start, syntaxLength + info.length), META));\n }\n marks.push(markInfo(setOffsetPos(end, 1), end, DELIM));\n var lineBackgroundMarkInfo = lineBackground(parent, start, end, \"custom-block\");\n return lineBackgroundMarkInfo ? marks.concat(lineBackgroundMarkInfo) : marks;\n}\nfunction markListItemChildren(node, markType) {\n var marks = [];\n while (node) {\n var type = node.type;\n if (type === \"paragraph\" || type === \"codeBlock\") {\n marks.push(markInfo([getMdStartLine(node), getMdStartCh(node) - 1], [getMdEndLine(node), getMdEndCh(node) + 1], markType));\n }\n node = node.next;\n }\n return marks;\n}\nfunction markParagraphInBlockQuote(node) {\n var marks = [];\n while (node) {\n marks.push(markInfo([getMdStartLine(node), getMdStartCh(node)], [getMdEndLine(node), getMdEndCh(node) + 1], TEXT));\n node = node.next;\n }\n return marks;\n}\nfunction blockQuote$2(node, start, end) {\n var marks = node.parent && node.parent.type !== \"blockQuote\" ? [markInfo(start, end, BLOCK_QUOTE)] : [];\n if (node.firstChild) {\n var childMarks = [];\n if (node.firstChild.type === \"paragraph\") {\n childMarks = markParagraphInBlockQuote(node.firstChild.firstChild);\n } else if (node.firstChild.type === \"list\") {\n childMarks = markListItemChildren(node.firstChild, TEXT);\n }\n marks = __spreadArray$1(__spreadArray$1([], marks), childMarks);\n }\n return marks;\n}\nfunction getSpecOfListItemStyle(node) {\n var depth = 0;\n while (node.parent.parent && node.parent.parent.type === \"item\") {\n node = node.parent.parent;\n depth += 1;\n }\n var attrs = [{ odd: true }, { even: true }][depth % 2];\n return [LIST_ITEM, __assign$1(__assign$1({}, attrs), { listStyle: true })];\n}\nfunction item$1(node, start) {\n var _a = node.listData, padding = _a.padding, task2 = _a.task;\n var spec = getSpecOfListItemStyle(node);\n var marks = [markInfo.apply(void 0, __spreadArray$1([start, addOffsetPos(start, padding)], spec))];\n if (task2) {\n marks.push(markInfo(addOffsetPos(start, padding), addOffsetPos(start, padding + 3), TASK_DELIM));\n marks.push(markInfo(addOffsetPos(start, padding + 1), addOffsetPos(start, padding + 2), META));\n }\n return marks.concat(markListItemChildren(node.firstChild, TEXT));\n}\nvar markNodeFuncMap = {\n heading: heading$1,\n strong: emphasisAndStrikethrough,\n emph: emphasisAndStrikethrough,\n strike: emphasisAndStrikethrough,\n link,\n image: image$1,\n code,\n codeBlock: codeBlock$1,\n blockQuote: blockQuote$2,\n item: item$1,\n customBlock: customBlock$2\n};\nvar simpleMarkClassNameMap = {\n thematicBreak: THEMATIC_BREAK,\n table: TABLE,\n tableCell: TABLE_CELL,\n htmlInline: HTML\n};\nfunction getMarkInfo(node, start, end, endLine) {\n var type = node.type;\n if (isFunction_1(markNodeFuncMap[type])) {\n return markNodeFuncMap[type](node, start, end, endLine);\n }\n if (simpleMarkClassNameMap[type]) {\n return [markInfo(start, end, simpleMarkClassNameMap[type])];\n }\n return null;\n}\nvar removingBackgroundIndexMap = {};\nfunction syntaxHighlight(_a) {\n var schema = _a.schema, toastMark = _a.toastMark;\n return new Plugin({\n appendTransaction: function(transactions, _, newState) {\n var tr = transactions[0];\n var newTr = newState.tr;\n if (tr.docChanged) {\n var markInfo_1 = [];\n var editResult = tr.getMeta(\"editResult\");\n editResult.forEach(function(result) {\n var nodes = result.nodes, removedNodeRange = result.removedNodeRange;\n if (nodes.length) {\n markInfo_1 = markInfo_1.concat(getMarkForRemoving(newTr, nodes));\n for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {\n var parent_1 = nodes_1[_i];\n var walker = parent_1.walker();\n var event_1 = walker.next();\n while (event_1) {\n var node = event_1.node, entering = event_1.entering;\n if (entering) {\n markInfo_1 = markInfo_1.concat(getMarkForAdding(node, toastMark));\n }\n event_1 = walker.next();\n }\n }\n } else if (removedNodeRange) {\n var maxIndex = newTr.doc.childCount - 1;\n var _a2 = removedNodeRange.line, startLine = _a2[0], endLine = _a2[1];\n var startIndex = Math.min(startLine, maxIndex);\n var endIndex = Math.min(endLine, maxIndex);\n for (var i = startIndex; i <= endIndex; i += 1) {\n removingBackgroundIndexMap[i] = true;\n }\n }\n });\n appendMarkTr(newTr, schema, markInfo_1);\n }\n return newTr.setMeta(\"widget\", tr.getMeta(\"widget\"));\n }\n });\n}\nfunction isDifferentBlock(doc, index2, attrs) {\n return Object.keys(attrs).some(function(name) {\n return attrs[name] !== doc.child(index2).attrs[name];\n });\n}\nfunction addLineBackground(tr, doc, paragraph2, blockPosInfo, attrs) {\n if (attrs === void 0) {\n attrs = {};\n }\n var startIndex = blockPosInfo.startIndex, endIndex = blockPosInfo.endIndex, from = blockPosInfo.from, to = blockPosInfo.to;\n var shouldChangeBlockType = false;\n for (var i = startIndex; i <= endIndex; i += 1) {\n delete removingBackgroundIndexMap[i];\n shouldChangeBlockType = isDifferentBlock(doc, i, attrs);\n }\n if (shouldChangeBlockType) {\n tr.setBlockType(from, to, paragraph2, attrs);\n }\n}\nfunction appendMarkTr(tr, schema, marks) {\n var doc = tr.doc;\n var paragraph2 = schema.nodes.paragraph;\n var startPosListPerLine = getStartPosListPerLine(doc, doc.childCount);\n marks.forEach(function(_a) {\n var start = _a.start, end = _a.end, spec = _a.spec, lineBackground2 = _a.lineBackground;\n var startIndex = Math.min(start[0], doc.childCount) - 1;\n var endIndex = Math.min(end[0], doc.childCount) - 1;\n var startNode = doc.child(startIndex);\n var endNode = doc.child(endIndex);\n var from = startPosListPerLine[startIndex];\n var to = startPosListPerLine[endIndex];\n from += start[1] + getWidgetNodePos(startNode, start[1] - 1);\n to += end[1] + getWidgetNodePos(endNode, end[1] - 1);\n if (spec) {\n if (lineBackground2) {\n var posInfo = { from, to, startIndex, endIndex };\n addLineBackground(tr, doc, paragraph2, posInfo, spec.attrs);\n } else {\n tr.addMark(from, to, schema.mark(spec.type, spec.attrs));\n }\n } else {\n tr.removeMark(from, to);\n }\n });\n removeBlockBackground(tr, startPosListPerLine, paragraph2);\n}\nfunction removeBlockBackground(tr, startPosListPerLine, paragraph2) {\n Object.keys(removingBackgroundIndexMap).forEach(function(index2) {\n var startIndex = Number(index2);\n var endIndex = Math.min(Number(index2) + 1, tr.doc.childCount - 1);\n var from = startPosListPerLine[startIndex];\n var to = startPosListPerLine[endIndex] - 1;\n if (startIndex === endIndex) {\n to += 2;\n }\n tr.setBlockType(from, to, paragraph2);\n });\n}\nfunction cacheIndexToRemoveBackground(doc, start, end) {\n var skipLines = [];\n removingBackgroundIndexMap = {};\n for (var i = start[0] - 1; i < end[0]; i += 1) {\n var node = doc.child(i);\n var codeEnd = node.attrs.codeEnd;\n var codeStart = node.attrs.codeStart;\n if (codeStart && codeEnd && !includes(skipLines, codeStart)) {\n skipLines.push(codeStart);\n codeEnd = Math.min(codeEnd, doc.childCount);\n var startIndex = codeStart - 1;\n var endIndex = end[0];\n for (var index2 = startIndex; index2 < endIndex; index2 += 1) {\n removingBackgroundIndexMap[index2] = true;\n }\n }\n }\n}\nfunction getMarkForRemoving(_a, nodes) {\n var doc = _a.doc;\n var start = nodes[0].sourcepos[0];\n var _b = last$1(nodes).sourcepos, end = _b[1];\n var startPos = [start[0], start[1]];\n var endPos = [end[0], end[1] + 1];\n var marks = [];\n cacheIndexToRemoveBackground(doc, start, end);\n marks.push({ start: startPos, end: endPos });\n return marks;\n}\nfunction getMarkForAdding(node, toastMark) {\n var lineTexts = toastMark.getLineTexts();\n var startPos = [getMdStartLine(node), getMdStartCh(node)];\n var endPos = [getMdEndLine(node), getMdEndCh(node) + 1];\n var markInfo2 = getMarkInfo(node, startPos, endPos, lineTexts[endPos[0] - 1]);\n return markInfo2 !== null && markInfo2 !== void 0 ? markInfo2 : [];\n}\nvar defaultToolbarStateKeys = [\n \"taskList\",\n \"orderedList\",\n \"bulletList\",\n \"table\",\n \"strong\",\n \"emph\",\n \"strike\",\n \"heading\",\n \"thematicBreak\",\n \"blockQuote\",\n \"code\",\n \"codeBlock\",\n \"indent\",\n \"outdent\"\n];\nfunction getToolbarStateType$1(mdNode) {\n var type = mdNode.type;\n if (isListNode$1(mdNode)) {\n if (mdNode.listData.task) {\n return \"taskList\";\n }\n return mdNode.listData.type === \"ordered\" ? \"orderedList\" : \"bulletList\";\n }\n if (type.indexOf(\"table\") !== -1) {\n return \"table\";\n }\n if (!includes(defaultToolbarStateKeys, type)) {\n return null;\n }\n return type;\n}\nfunction getToolbarState$1(targetNode) {\n var toolbarState = {\n indent: { active: false, disabled: true },\n outdent: { active: false, disabled: true }\n };\n var listEnabled = true;\n traverseParentNodes(targetNode, function(mdNode) {\n var type = getToolbarStateType$1(mdNode);\n if (!type) {\n return;\n }\n if (type === \"bulletList\" || type === \"orderedList\") {\n if (listEnabled) {\n toolbarState[type] = { active: true };\n toolbarState.indent.disabled = false;\n toolbarState.outdent.disabled = false;\n listEnabled = false;\n }\n } else {\n toolbarState[type] = { active: true };\n }\n });\n return toolbarState;\n}\nfunction previewHighlight(_a) {\n var toastMark = _a.toastMark, eventEmitter = _a.eventEmitter;\n return new Plugin({\n view: function() {\n return {\n update: function(view, prevState) {\n var state = view.state;\n var doc = state.doc, selection = state.selection;\n if (prevState && prevState.doc.eq(doc) && prevState.selection.eq(selection)) {\n return;\n }\n var from = selection.from;\n var startChOffset = state.doc.resolve(from).start();\n var line = state.doc.content.findIndex(from).index + 1;\n var ch = from - startChOffset;\n if (from === startChOffset) {\n ch += 1;\n }\n var cursorPos = [line, ch];\n var mdNode = toastMark.findNodeAtPosition(cursorPos);\n var toolbarState = getToolbarState$1(mdNode);\n eventEmitter.emit(\"changeToolbarState\", {\n cursorPos,\n mdNode,\n toolbarState\n });\n eventEmitter.emit(\"setFocusedNode\", mdNode);\n }\n };\n }\n });\n}\nvar Doc$1 = (\n /** @class */\n function(_super) {\n __extends$1(Doc2, _super);\n function Doc2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Doc2.prototype, \"name\", {\n get: function() {\n return \"doc\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Doc2.prototype, \"schema\", {\n get: function() {\n return {\n content: \"block+\"\n };\n },\n enumerable: false,\n configurable: true\n });\n return Doc2;\n }(Node$2)\n);\nvar Mark = (\n /** @class */\n function() {\n function Mark2() {\n }\n Object.defineProperty(Mark2.prototype, \"type\", {\n get: function() {\n return \"mark\";\n },\n enumerable: false,\n configurable: true\n });\n Mark2.prototype.setContext = function(context) {\n this.context = context;\n };\n return Mark2;\n }()\n);\nfunction getTextByMdLine(doc, mdLine) {\n return getTextContent(doc, mdLine - 1);\n}\nfunction getTextContent(doc, index2) {\n return doc.child(index2).textContent;\n}\nvar reBlockQuote = /^\\s*> ?/;\nvar BlockQuote$1 = (\n /** @class */\n function(_super) {\n __extends$1(BlockQuote2, _super);\n function BlockQuote2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(BlockQuote2.prototype, \"name\", {\n get: function() {\n return \"blockQuote\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BlockQuote2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"block-quote\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n BlockQuote2.prototype.createBlockQuoteText = function(text2, isBlockQuote) {\n return isBlockQuote ? text2.replace(reBlockQuote, \"\").trim() : \"> \" + text2.trim();\n };\n BlockQuote2.prototype.extendBlockQuote = function() {\n var _this = this;\n return function(_a, dispatch) {\n var selection = _a.selection, doc = _a.doc, tr = _a.tr, schema = _a.schema;\n var _b = getRangeInfo(selection), endFromOffset = _b.endFromOffset, endToOffset = _b.endToOffset, endIndex = _b.endIndex, to = _b.to;\n var textContent = getTextContent(doc, endIndex);\n var isBlockQuote = reBlockQuote.test(textContent);\n if (isBlockQuote && to > endFromOffset && selection.empty) {\n var isEmpty2 = !textContent.replace(reBlockQuote, \"\").trim();\n if (isEmpty2) {\n tr.deleteRange(endFromOffset, endToOffset).split(tr.mapping.map(endToOffset));\n } else {\n var slicedText = textContent.slice(to - endFromOffset).trim();\n var node = createTextNode$1(schema, _this.createBlockQuoteText(slicedText));\n splitAndExtendBlock(tr, endToOffset, slicedText, node);\n }\n dispatch(tr);\n return true;\n }\n return false;\n };\n };\n BlockQuote2.prototype.commands = function() {\n var _this = this;\n return function() {\n return function(state, dispatch) {\n var selection = state.selection, doc = state.doc;\n var _a = getRangeInfo(selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset, startIndex = _a.startIndex, endIndex = _a.endIndex;\n var isBlockQuote = reBlockQuote.test(getTextContent(doc, startIndex));\n var tr = replaceTextNode({\n state,\n startIndex,\n endIndex,\n from: startFromOffset,\n createText: function(textContent) {\n return _this.createBlockQuoteText(textContent, isBlockQuote);\n }\n });\n dispatch(tr.setSelection(createTextSelection(tr, tr.mapping.map(endToOffset))));\n return true;\n };\n };\n };\n BlockQuote2.prototype.keymaps = function() {\n var blockQuoteCommand = this.commands()();\n return {\n \"alt-q\": blockQuoteCommand,\n \"alt-Q\": blockQuoteCommand,\n Enter: this.extendBlockQuote()\n };\n };\n return BlockQuote2;\n }(Mark)\n);\nvar reList = /(^\\s*)([-*+] |[\\d]+\\. )/;\nvar reOrderedList = /(^\\s*)([\\d])+\\.( \\[[ xX]])? /;\nvar reOrderedListGroup = /^(\\s*)((\\d+)([.)]\\s(?:\\[(?:x|\\s)\\]\\s)?))(.*)/;\nvar reCanBeTaskList = /(^\\s*)([-*+]|[\\d]+\\.)( \\[[ xX]])? /;\nvar reBulletListGroup = /^(\\s*)([-*+]+(\\s(?:\\[(?:x|\\s)\\]\\s)?))(.*)/;\nvar reTaskList = /(^\\s*)([-*+] |[\\d]+\\. )(\\[[ xX]] )/;\nvar reBulletTaskList = /(^\\s*)([-*+])( \\[[ xX]]) /;\nfunction getListType(text2) {\n return reOrderedList.test(text2) ? \"ordered\" : \"bullet\";\n}\nfunction getListDepth(mdNode) {\n var depth = 0;\n while (mdNode && mdNode.type !== \"document\") {\n if (mdNode.type === \"list\") {\n depth += 1;\n }\n mdNode = mdNode.parent;\n }\n return depth;\n}\nfunction findSameDepthList(toastMark, currentLine, depth, backward) {\n var lineTexts = toastMark.getLineTexts();\n var lineLen = lineTexts.length;\n var result = [];\n var line = currentLine;\n while (backward ? line < lineLen : line > 1) {\n line = backward ? line + 1 : line - 1;\n var mdNode = toastMark.findFirstNodeAtLine(line);\n var currentListDepth = getListDepth(mdNode);\n if (currentListDepth === depth) {\n result.push({ line, depth, mdNode });\n } else if (currentListDepth < depth) {\n break;\n }\n }\n return result;\n}\nfunction getSameDepthItems(_a) {\n var toastMark = _a.toastMark, mdNode = _a.mdNode, line = _a.line;\n var depth = getListDepth(mdNode);\n var forwardList = findSameDepthList(toastMark, line, depth, false).reverse();\n var backwardList = findSameDepthList(toastMark, line, depth, true);\n return forwardList.concat([{ line, depth, mdNode }]).concat(backwardList);\n}\nfunction textToBullet(text2) {\n if (!reList.test(text2)) {\n return \"* \" + text2;\n }\n var type = getListType(text2);\n if (type === \"bullet\" && reCanBeTaskList.test(text2)) {\n text2 = text2.replace(reBulletTaskList, \"$1$2 \");\n } else if (type === \"ordered\") {\n text2 = text2.replace(reOrderedList, \"$1* \");\n }\n return text2;\n}\nfunction textToOrdered(text2, ordinalNum) {\n if (!reList.test(text2)) {\n return ordinalNum + \". \" + text2;\n }\n var type = getListType(text2);\n if (type === \"bullet\" || type === \"ordered\" && reCanBeTaskList.test(text2)) {\n text2 = text2.replace(reCanBeTaskList, \"$1\" + ordinalNum + \". \");\n } else if (type === \"ordered\") {\n var start = reOrderedListGroup.exec(text2)[3];\n if (Number(start) !== ordinalNum) {\n text2 = text2.replace(reOrderedList, \"$1\" + ordinalNum + \". \");\n }\n }\n return text2;\n}\nfunction getChangedInfo(doc, sameDepthItems, type, start) {\n if (start === void 0) {\n start = 0;\n }\n var firstIndex = Number.MAX_VALUE;\n var lastIndex = 0;\n var changedResults = sameDepthItems.map(function(_a, index2) {\n var line = _a.line;\n firstIndex = Math.min(line - 1, firstIndex);\n lastIndex = Math.max(line - 1, lastIndex);\n var text2 = getTextByMdLine(doc, line);\n text2 = type === \"bullet\" ? textToBullet(text2) : textToOrdered(text2, index2 + 1 + start);\n return { text: text2, line };\n });\n return { changedResults, firstIndex, lastIndex };\n}\nfunction getBulletOrOrdered(type, context) {\n var sameDepthListInfo = getSameDepthItems(context);\n return getChangedInfo(context.doc, sameDepthListInfo, type);\n}\nvar otherListToList = {\n bullet: function(context) {\n return getBulletOrOrdered(\"bullet\", context);\n },\n ordered: function(context) {\n return getBulletOrOrdered(\"ordered\", context);\n },\n task: function(_a) {\n var mdNode = _a.mdNode, doc = _a.doc, line = _a.line;\n var text2 = getTextByMdLine(doc, line);\n if (mdNode.listData.task) {\n text2 = text2.replace(reTaskList, \"$1$2\");\n } else if (isListNode$1(mdNode)) {\n text2 = text2.replace(reList, \"$1$2[ ] \");\n }\n return { changedResults: [{ text: text2, line }] };\n }\n};\nvar otherNodeToList = {\n bullet: function(_a) {\n var doc = _a.doc, line = _a.line;\n var lineText = getTextByMdLine(doc, line);\n var changedResults = [{ text: \"* \" + lineText, line }];\n return { changedResults };\n },\n ordered: function(_a) {\n var toastMark = _a.toastMark, doc = _a.doc, line = _a.line, startLine = _a.startLine;\n var lineText = getTextByMdLine(doc, line);\n var firstOrderedListNum = 1;\n var firstOrderedListLine = startLine;\n var skipped = 0;\n for (var i = startLine - 1; i > 0; i -= 1) {\n var mdNode = toastMark.findFirstNodeAtLine(i);\n var text2 = getTextByMdLine(doc, i);\n var canBeListNode = text2 && !!findClosestNode(mdNode, function(targetNode) {\n return isListNode$1(targetNode);\n });\n var searchResult = reOrderedListGroup.exec(getTextByMdLine(doc, i));\n if (!searchResult && !canBeListNode) {\n break;\n }\n if (!searchResult && canBeListNode) {\n skipped += 1;\n continue;\n }\n var _b = searchResult, indent2 = _b[1], start = _b[3];\n if (!indent2) {\n firstOrderedListNum = Number(start);\n firstOrderedListLine = i;\n break;\n }\n }\n var ordinalNum = firstOrderedListNum + line - firstOrderedListLine - skipped;\n var changedResults = [{ text: ordinalNum + \". \" + lineText, line }];\n return { changedResults };\n },\n task: function(_a) {\n var doc = _a.doc, line = _a.line;\n var lineText = getTextByMdLine(doc, line);\n var changedResults = [{ text: \"* [ ] \" + lineText, line }];\n return { changedResults };\n }\n};\nvar extendList = {\n bullet: function(_a) {\n var line = _a.line, doc = _a.doc;\n var lineText = getTextByMdLine(doc, line);\n var _b = reBulletListGroup.exec(lineText), indent2 = _b[1], delimiter = _b[2];\n return { listSyntax: \"\" + indent2 + delimiter };\n },\n ordered: function(_a) {\n var toastMark = _a.toastMark, line = _a.line, mdNode = _a.mdNode, doc = _a.doc;\n var depth = getListDepth(mdNode);\n var lineText = getTextByMdLine(doc, line);\n var _b = reOrderedListGroup.exec(lineText), indent2 = _b[1], start = _b[3], delimiter = _b[4];\n var ordinalNum = Number(start) + 1;\n var listSyntax = \"\" + indent2 + ordinalNum + delimiter;\n var backwardList = findSameDepthList(toastMark, line, depth, true);\n var filteredList = backwardList.filter(function(info) {\n var searchResult = reOrderedListGroup.exec(getTextByMdLine(doc, info.line));\n return searchResult && searchResult[1].length === indent2.length && !!findClosestNode(info.mdNode, function(targetNode) {\n return isOrderedListNode(targetNode);\n });\n });\n return __assign$1({ listSyntax }, getChangedInfo(doc, filteredList, \"ordered\", ordinalNum));\n }\n};\nfunction getReorderedListInfo(doc, schema, line, ordinalNum, prevIndentLength) {\n var nodes = [];\n var lineText = getTextByMdLine(doc, line);\n var searchResult = reOrderedListGroup.exec(lineText);\n while (searchResult) {\n var indent2 = searchResult[1], delimiter = searchResult[4], text2 = searchResult[5];\n var indentLength = indent2.length;\n if (indentLength === prevIndentLength) {\n nodes.push(createTextNode$1(schema, \"\" + indent2 + ordinalNum + delimiter + text2));\n ordinalNum += 1;\n line += 1;\n } else if (indentLength > prevIndentLength) {\n var nestedListInfo = getReorderedListInfo(doc, schema, line, 1, indentLength);\n line = nestedListInfo.line;\n nodes = nodes.concat(nestedListInfo.nodes);\n }\n if (indentLength < prevIndentLength || line > doc.childCount) {\n break;\n }\n lineText = getTextByMdLine(doc, line);\n searchResult = reOrderedListGroup.exec(lineText);\n }\n return { nodes, line };\n}\nvar reStartSpace = /(^\\s{1,4})(.*)/;\nfunction isBlockUnit(from, to, text2) {\n return from < to || reList.test(text2) || reBlockQuote.test(text2);\n}\nfunction isInTableCellNode(doc, schema, selection) {\n var $pos = selection.$from;\n if ($pos.depth === 0) {\n $pos = doc.resolve($pos.pos - 1);\n }\n var node = $pos.node(1);\n var startOffset = $pos.start(1);\n var contentSize = node.content.size;\n return node.rangeHasMark(0, contentSize, schema.marks.table) && $pos.pos - startOffset !== contentSize && $pos.pos !== startOffset;\n}\nfunction createSelection(tr, posInfo) {\n var from = posInfo.from, to = posInfo.to;\n if (posInfo.type === \"indent\") {\n var softTabLen = 4;\n from += softTabLen;\n to += (posInfo.lineLen + 1) * softTabLen;\n } else {\n var spaceLenList = posInfo.spaceLenList;\n from -= spaceLenList[0];\n for (var i = 0; i < spaceLenList.length; i += 1) {\n to -= spaceLenList[i];\n }\n }\n return createTextSelection(tr, from, to);\n}\nvar Paragraph$1 = (\n /** @class */\n function(_super) {\n __extends$1(Paragraph2, _super);\n function Paragraph2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Paragraph2.prototype, \"name\", {\n get: function() {\n return \"paragraph\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Paragraph2.prototype, \"schema\", {\n get: function() {\n return {\n content: \"inline*\",\n attrs: {\n className: { default: null },\n codeStart: { default: null },\n codeEnd: { default: null }\n },\n selectable: false,\n group: \"block\",\n parseDOM: [{ tag: \"div\" }],\n toDOM: function(_a) {\n var attrs = _a.attrs;\n return attrs.className ? [\"div\", { class: clsWithMdPrefix(attrs.className) }, 0] : [\"div\", 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Paragraph2.prototype.reorderList = function(startLine, endLine) {\n var _a = this.context, view = _a.view, toastMark = _a.toastMark, schema = _a.schema;\n var _b = view.state, tr = _b.tr, selection = _b.selection, doc = _b.doc;\n var mdNode = toastMark.findFirstNodeAtLine(startLine);\n var topListNode = mdNode;\n while (mdNode && !isBulletListNode(mdNode) && mdNode.parent.type !== \"document\") {\n mdNode = mdNode.parent;\n if (isOrderedListNode(mdNode)) {\n topListNode = mdNode;\n break;\n }\n }\n if (topListNode) {\n startLine = topListNode.sourcepos[0][0];\n }\n var _c = reOrderedListGroup.exec(getTextByMdLine(doc, startLine)), indent2 = _c[1], start = _c[3];\n var indentLen = indent2.length;\n var _d = getReorderedListInfo(doc, schema, startLine, Number(start), indentLen), line = _d.line, nodes = _d.nodes;\n endLine = Math.max(endLine, line - 1);\n var startOffset = getNodeContentOffsetRange(doc, startLine - 1).startOffset;\n for (var i = startLine - 1; i <= endLine - 1; i += 1) {\n var _e = doc.child(i), nodeSize = _e.nodeSize, content = _e.content;\n var mappedFrom = tr.mapping.map(startOffset);\n var mappedTo = mappedFrom + content.size;\n tr.replaceWith(mappedFrom, mappedTo, nodes[i - startLine + 1]);\n startOffset += nodeSize;\n }\n var newSelection = createTextSelection(tr, selection.from, selection.to);\n view.dispatch(tr.setSelection(newSelection));\n };\n Paragraph2.prototype.indent = function(tabKey) {\n var _this = this;\n if (tabKey === void 0) {\n tabKey = false;\n }\n return function() {\n return function(state, dispatch) {\n var schema = state.schema, selection = state.selection, doc = state.doc;\n var _a = getRangeInfo(selection), from = _a.from, to = _a.to, startFromOffset = _a.startFromOffset, startIndex = _a.startIndex, endIndex = _a.endIndex;\n if (tabKey && isInTableCellNode(doc, schema, selection)) {\n return false;\n }\n var startLineText = getTextContent(doc, startIndex);\n if (tabKey && isBlockUnit(from, to, startLineText) || !tabKey && reList.test(startLineText)) {\n var tr = replaceTextNode({\n state,\n from: startFromOffset,\n startIndex,\n endIndex,\n createText: function(textContent) {\n return \" \" + textContent;\n }\n });\n var posInfo = {\n type: \"indent\",\n from,\n to,\n lineLen: endIndex - startIndex\n };\n dispatch(tr.setSelection(createSelection(tr, posInfo)));\n if (reOrderedListGroup.test(startLineText)) {\n _this.reorderList(startIndex + 1, endIndex + 1);\n }\n } else if (tabKey) {\n dispatch(state.tr.insert(to, createTextNode$1(schema, \" \")));\n }\n return true;\n };\n };\n };\n Paragraph2.prototype.outdent = function(tabKey) {\n var _this = this;\n if (tabKey === void 0) {\n tabKey = false;\n }\n return function() {\n return function(state, dispatch) {\n var selection = state.selection, doc = state.doc, schema = state.schema;\n var _a = getRangeInfo(selection), from = _a.from, to = _a.to, startFromOffset = _a.startFromOffset, startIndex = _a.startIndex, endIndex = _a.endIndex;\n if (tabKey && isInTableCellNode(doc, schema, selection)) {\n return false;\n }\n var startLineText = getTextContent(doc, startIndex);\n if (tabKey && isBlockUnit(from, to, startLineText) || !tabKey && reList.test(startLineText)) {\n var spaceLenList_1 = [];\n var tr = replaceTextNode({\n state,\n from: startFromOffset,\n startIndex,\n endIndex,\n createText: function(textContent) {\n var searchResult = reStartSpace.exec(textContent);\n spaceLenList_1.push(searchResult ? searchResult[1].length : 0);\n return textContent.replace(reStartSpace, \"$2\");\n }\n });\n var posInfo = { type: \"outdent\", from, to, spaceLenList: spaceLenList_1 };\n dispatch(tr.setSelection(createSelection(tr, posInfo)));\n if (reOrderedListGroup.test(startLineText)) {\n _this.reorderList(startIndex + 1, endIndex + 1);\n }\n } else if (tabKey) {\n var startText = startLineText.slice(0, to - startFromOffset);\n var startTextWithoutSpace = startText.replace(/\\s{1,4}$/, \"\");\n var deletStart = to - (startText.length - startTextWithoutSpace.length);\n dispatch(state.tr.delete(deletStart, to));\n }\n return true;\n };\n };\n };\n Paragraph2.prototype.deleteLines = function() {\n var _this = this;\n return function(state, dispatch) {\n var view = _this.context.view;\n var _a = getRangeInfo(state.selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset;\n var deleteRange = function() {\n dispatch(state.tr.deleteRange(startFromOffset, endToOffset));\n return true;\n };\n return chainCommands(deleteRange, joinForward)(state, dispatch, view);\n };\n };\n Paragraph2.prototype.moveDown = function() {\n return function(state, dispatch) {\n var doc = state.doc, tr = state.tr, selection = state.selection, schema = state.schema;\n var _a = getRangeInfo(selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset, endIndex = _a.endIndex;\n if (endIndex < doc.content.childCount - 1) {\n var _b = doc.child(endIndex + 1), nodeSize = _b.nodeSize, textContent = _b.textContent;\n tr.delete(endToOffset, endToOffset + nodeSize).split(startFromOffset).insert(tr.mapping.map(startFromOffset) - 2, createTextNode$1(schema, textContent));\n dispatch(tr);\n return true;\n }\n return false;\n };\n };\n Paragraph2.prototype.moveUp = function() {\n return function(state, dispatch) {\n var tr = state.tr, doc = state.doc, selection = state.selection, schema = state.schema;\n var _a = getRangeInfo(selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset, startIndex = _a.startIndex;\n if (startIndex > 0) {\n var _b = doc.child(startIndex - 1), nodeSize = _b.nodeSize, textContent = _b.textContent;\n tr.delete(startFromOffset - nodeSize, startFromOffset).split(tr.mapping.map(endToOffset)).insert(tr.mapping.map(endToOffset), createTextNode$1(schema, textContent));\n dispatch(tr);\n return true;\n }\n return false;\n };\n };\n Paragraph2.prototype.commands = function() {\n return {\n indent: this.indent(),\n outdent: this.outdent()\n };\n };\n Paragraph2.prototype.keymaps = function() {\n return {\n Tab: this.indent(true)(),\n \"Shift-Tab\": this.outdent(true)(),\n \"Mod-d\": this.deleteLines(),\n \"Mod-D\": this.deleteLines(),\n \"Alt-ArrowUp\": this.moveUp(),\n \"Alt-ArrowDown\": this.moveDown()\n };\n };\n return Paragraph2;\n }(Node$2)\n);\nvar Text$1 = (\n /** @class */\n function(_super) {\n __extends$1(Text2, _super);\n function Text2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Text2.prototype, \"name\", {\n get: function() {\n return \"text\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Text2.prototype, \"schema\", {\n get: function() {\n return {\n group: \"inline\"\n };\n },\n enumerable: false,\n configurable: true\n });\n return Text2;\n }(Node$2)\n);\nvar reHeading = /^#{1,6}\\s/;\nvar Heading$1 = (\n /** @class */\n function(_super) {\n __extends$1(Heading2, _super);\n function Heading2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Heading2.prototype, \"name\", {\n get: function() {\n return \"heading\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Heading2.prototype, \"schema\", {\n get: function() {\n return {\n attrs: {\n level: { default: 1 },\n seText: { default: false }\n },\n toDOM: function(_a) {\n var attrs = _a.attrs;\n var level = attrs.level, seText = attrs.seText;\n var classNames = \"heading|heading\" + level;\n if (seText) {\n classNames += \"|delimiter|setext\";\n }\n return [\"span\", { class: clsWithMdPrefix.apply(void 0, classNames.split(\"|\")) }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Heading2.prototype.createHeadingText = function(level, text2, curHeadingSyntax) {\n var textContent = text2.replace(curHeadingSyntax, \"\").trim();\n var headingText = \"\";\n while (level > 0) {\n headingText += \"#\";\n level -= 1;\n }\n return headingText + \" \" + textContent;\n };\n Heading2.prototype.commands = function() {\n var _this = this;\n return function(payload) {\n return function(state, dispatch) {\n var level = payload.level;\n var _a = getRangeInfo(state.selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset, startIndex = _a.startIndex, endIndex = _a.endIndex;\n var tr = replaceTextNode({\n state,\n from: startFromOffset,\n startIndex,\n endIndex,\n createText: function(textContent) {\n var matchedHeading = textContent.match(reHeading);\n var curHeadingSyntax = matchedHeading ? matchedHeading[0] : \"\";\n return _this.createHeadingText(level, textContent, curHeadingSyntax);\n }\n });\n dispatch(tr.setSelection(createTextSelection(tr, tr.mapping.map(endToOffset))));\n return true;\n };\n };\n };\n return Heading2;\n }(Mark)\n);\nvar fencedCodeBlockSyntax = \"```\";\nvar CodeBlock$1 = (\n /** @class */\n function(_super) {\n __extends$1(CodeBlock2, _super);\n function CodeBlock2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(CodeBlock2.prototype, \"name\", {\n get: function() {\n return \"codeBlock\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(CodeBlock2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"code-block\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n CodeBlock2.prototype.commands = function() {\n return function() {\n return function(state, dispatch) {\n var selection = state.selection, schema = state.schema, tr = state.tr;\n var _a = getRangeInfo(selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset;\n var fencedNode = createTextNode$1(schema, fencedCodeBlockSyntax);\n tr.insert(startFromOffset, fencedNode).split(startFromOffset + fencedCodeBlockSyntax.length);\n tr.split(tr.mapping.map(endToOffset)).insert(tr.mapping.map(endToOffset), fencedNode);\n dispatch(tr.setSelection(\n // subtract fenced syntax length and open, close tag(2)\n createTextSelection(tr, tr.mapping.map(endToOffset) - (fencedCodeBlockSyntax.length + 2))\n ));\n return true;\n };\n };\n };\n CodeBlock2.prototype.keepIndentation = function() {\n var _this = this;\n return function(_a, dispatch) {\n var selection = _a.selection, tr = _a.tr, doc = _a.doc, schema = _a.schema;\n var toastMark = _this.context.toastMark;\n var _b = getRangeInfo(selection), startFromOffset = _b.startFromOffset, endToOffset = _b.endToOffset, endIndex = _b.endIndex, from = _b.from, to = _b.to;\n var textContent = getTextContent(doc, endIndex);\n if (from === to && textContent.trim()) {\n var matched = textContent.match(/^\\s+/);\n var mdNode = toastMark.findFirstNodeAtLine(endIndex + 1);\n if (isCodeBlockNode(mdNode) && matched) {\n var spaces = matched[0];\n var slicedText = textContent.slice(to - startFromOffset);\n var node = createTextNode$1(schema, spaces + slicedText);\n splitAndExtendBlock(tr, endToOffset, slicedText, node);\n dispatch(tr);\n return true;\n }\n }\n return false;\n };\n };\n CodeBlock2.prototype.keymaps = function() {\n var codeBlockCommand = this.commands()();\n return {\n \"Shift-Mod-p\": codeBlockCommand,\n \"Shift-Mod-P\": codeBlockCommand,\n Enter: this.keepIndentation()\n };\n };\n return CodeBlock2;\n }(Mark)\n);\nvar reEmptyTable = /\\||\\s/g;\nfunction createTableHeader(columnCount) {\n return [createTableRow(columnCount), createTableRow(columnCount, true)];\n}\nfunction createTableBody$1(columnCount, rowCount) {\n var bodyRows = [];\n for (var i = 0; i < rowCount; i += 1) {\n bodyRows.push(createTableRow(columnCount));\n }\n return bodyRows;\n}\nfunction createTableRow(columnCount, delim) {\n var row = \"|\";\n for (var i = 0; i < columnCount; i += 1) {\n row += delim ? \" --- |\" : \" |\";\n }\n return row;\n}\nfunction createTargetTypes(moveNext) {\n return moveNext ? { type: \"next\", parentType: \"tableHead\", childType: \"firstChild\" } : { type: \"prev\", parentType: \"tableBody\", childType: \"lastChild\" };\n}\nvar Table$1 = (\n /** @class */\n function(_super) {\n __extends$1(Table2, _super);\n function Table2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Table2.prototype, \"name\", {\n get: function() {\n return \"table\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Table2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"table\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Table2.prototype.extendTable = function() {\n var _this = this;\n return function(_a, dispatch) {\n var selection = _a.selection, doc = _a.doc, tr = _a.tr, schema = _a.schema;\n if (!selection.empty) {\n return false;\n }\n var _b = getRangeInfo(selection), endFromOffset = _b.endFromOffset, endToOffset = _b.endToOffset, endIndex = _b.endIndex, to = _b.to;\n var textContent = getTextContent(doc, endIndex);\n var mdPos = [endIndex + 1, to - endFromOffset + 1];\n var mdNode = _this.context.toastMark.findNodeAtPosition(mdPos);\n var cellNode = findClosestNode(mdNode, function(node) {\n return isTableCellNode(node) && (node.parent.type === \"tableDelimRow\" || node.parent.parent.type === \"tableBody\");\n });\n if (cellNode) {\n var isEmpty2 = !textContent.replace(reEmptyTable, \"\").trim();\n var parent_1 = cellNode.parent;\n var columnCount = parent_1.parent.parent.columns.length;\n var row = createTableRow(columnCount);\n if (isEmpty2) {\n tr.deleteRange(endFromOffset, endToOffset).split(tr.mapping.map(endToOffset));\n } else {\n tr.split(endToOffset).insert(tr.mapping.map(endToOffset), createTextNode$1(schema, row)).setSelection(createTextSelection(tr, tr.mapping.map(endToOffset) - 2));\n }\n dispatch(tr);\n return true;\n }\n return false;\n };\n };\n Table2.prototype.moveTableCell = function(moveNext) {\n var _this = this;\n return function(_a, dispatch) {\n var selection = _a.selection, tr = _a.tr;\n var _b = getRangeInfo(selection), endFromOffset = _b.endFromOffset, endIndex = _b.endIndex, to = _b.to;\n var mdPos = [endIndex + 1, to - endFromOffset];\n var mdNode = _this.context.toastMark.findNodeAtPosition(mdPos);\n var cellNode = findClosestNode(mdNode, function(node) {\n return isTableCellNode(node);\n });\n if (cellNode) {\n var parent_2 = cellNode.parent;\n var _c = createTargetTypes(moveNext), type = _c.type, parentType = _c.parentType, childType = _c.childType;\n var chOffset = getMdEndCh(cellNode);\n if (cellNode[type]) {\n chOffset = getMdEndCh(cellNode[type]) - 1;\n } else {\n var row = !parent_2[type] && parent_2.parent.type === parentType ? parent_2.parent[type][childType] : parent_2[type];\n if (type === \"next\") {\n var baseOffset = row ? getMdEndCh(row[childType]) : 0;\n chOffset += baseOffset + 2;\n } else if (type === \"prev\") {\n chOffset = row ? -4 : 0;\n }\n }\n dispatch(tr.setSelection(createTextSelection(tr, endFromOffset + chOffset)));\n return true;\n }\n return false;\n };\n };\n Table2.prototype.addTable = function() {\n return function(payload) {\n return function(_a, dispatch) {\n var selection = _a.selection, tr = _a.tr, schema = _a.schema;\n var _b = payload, columnCount = _b.columnCount, rowCount = _b.rowCount;\n var endToOffset = getRangeInfo(selection).endToOffset;\n var headerRows = createTableHeader(columnCount);\n var bodyRows = createTableBody$1(columnCount, rowCount - 1);\n var rows = __spreadArray$1(__spreadArray$1([], headerRows), bodyRows);\n rows.forEach(function(row) {\n tr.split(tr.mapping.map(endToOffset)).insert(tr.mapping.map(endToOffset), createTextNode$1(schema, row));\n });\n dispatch(tr.setSelection(createTextSelection(tr, endToOffset + 4)));\n return true;\n };\n };\n };\n Table2.prototype.commands = function() {\n return { addTable: this.addTable() };\n };\n Table2.prototype.keymaps = function() {\n return {\n Enter: this.extendTable(),\n Tab: this.moveTableCell(true),\n \"Shift-Tab\": this.moveTableCell(false)\n };\n };\n return Table2;\n }(Mark)\n);\nvar thematicBreakSyntax = \"***\";\nvar ThematicBreak$1 = (\n /** @class */\n function(_super) {\n __extends$1(ThematicBreak2, _super);\n function ThematicBreak2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ThematicBreak2.prototype, \"name\", {\n get: function() {\n return \"thematicBreak\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ThematicBreak2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"thematic-break\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n ThematicBreak2.prototype.hr = function() {\n return function() {\n return function(state, dispatch) {\n var selection = state.selection, schema = state.schema, tr = state.tr;\n var _a = getRangeInfo(selection), from = _a.from, to = _a.to, endToOffset = _a.endToOffset;\n var node = createTextNode$1(schema, thematicBreakSyntax);\n tr.split(from).replaceWith(tr.mapping.map(from), tr.mapping.map(to), node).split(tr.mapping.map(to)).setSelection(createTextSelection(tr, tr.mapping.map(endToOffset)));\n dispatch(tr);\n return true;\n };\n };\n };\n ThematicBreak2.prototype.commands = function() {\n return { hr: this.hr() };\n };\n ThematicBreak2.prototype.keymaps = function() {\n var lineCommand = this.hr()();\n return { \"Mod-l\": lineCommand, \"Mod-L\": lineCommand };\n };\n return ThematicBreak2;\n }(Mark)\n);\nfunction cannotBeListNode(_a, line) {\n var type = _a.type, sourcepos = _a.sourcepos;\n var startLine = sourcepos[0][0];\n return line <= startLine && (type === \"codeBlock\" || type === \"heading\" || type.match(\"table\"));\n}\nvar ListItem$1 = (\n /** @class */\n function(_super) {\n __extends$1(ListItem2, _super);\n function ListItem2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ListItem2.prototype, \"name\", {\n get: function() {\n return \"listItem\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ListItem2.prototype, \"schema\", {\n get: function() {\n return {\n attrs: {\n odd: { default: false },\n even: { default: false },\n listStyle: { default: false }\n },\n toDOM: function(_a) {\n var attrs = _a.attrs;\n var odd = attrs.odd, even = attrs.even, listStyle = attrs.listStyle;\n var classNames = \"list-item\";\n if (listStyle) {\n classNames += \"|list-item-style\";\n }\n if (odd) {\n classNames += \"|list-item-odd\";\n }\n if (even) {\n classNames += \"|list-item-even\";\n }\n return [\"span\", { class: clsWithMdPrefix.apply(void 0, classNames.split(\"|\")) }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n ListItem2.prototype.extendList = function() {\n var _this = this;\n return function(_a, dispatch) {\n var selection = _a.selection, doc = _a.doc, schema = _a.schema, tr = _a.tr;\n var toastMark = _this.context.toastMark;\n var _b = getRangeInfo(selection), to = _b.to, startFromOffset = _b.startFromOffset, endFromOffset = _b.endFromOffset, endIndex = _b.endIndex, endToOffset = _b.endToOffset;\n var textContent = getTextContent(doc, endIndex);\n var isList2 = reList.test(textContent);\n if (!isList2 || selection.from === startFromOffset || !selection.empty) {\n return false;\n }\n var isEmpty2 = !textContent.replace(reCanBeTaskList, \"\").trim();\n if (isEmpty2) {\n tr.deleteRange(endFromOffset, endToOffset).split(tr.mapping.map(endToOffset));\n } else {\n var commandType = getListType(textContent);\n var mdNode = toastMark.findFirstNodeAtLine(endIndex + 1);\n var slicedText = textContent.slice(to - endFromOffset);\n var context = { toastMark, mdNode, doc, line: endIndex + 1 };\n var _c = extendList[commandType](context), listSyntax = _c.listSyntax, changedResults = _c.changedResults;\n if (changedResults === null || changedResults === void 0 ? void 0 : changedResults.length) {\n tr.split(to);\n changedResults.unshift({ text: listSyntax + slicedText, line: endIndex + 1 });\n _this.changeToListPerLine(tr, changedResults, {\n from: to,\n // don't subtract 1 because the line has increased through 'split' command.\n startLine: changedResults[0].line,\n endLine: last$1(changedResults).line\n });\n var pos = tr.mapping.map(endToOffset) - slicedText.length;\n tr.setSelection(createTextSelection(tr, pos));\n } else {\n var node = createTextNode$1(schema, listSyntax + slicedText);\n splitAndExtendBlock(tr, endToOffset, slicedText, node);\n }\n }\n dispatch(tr);\n return true;\n };\n };\n ListItem2.prototype.toList = function(commandType) {\n var _this = this;\n return function() {\n return function(_a, dispatch) {\n var doc = _a.doc, tr = _a.tr, selection = _a.selection;\n var toastMark = _this.context.toastMark;\n var rangeInfo = getRangeInfo(selection);\n var startLine = rangeInfo.startIndex + 1;\n var endLine = rangeInfo.endIndex + 1;\n var endToOffset = rangeInfo.endToOffset;\n var skipLines = [];\n for (var line = startLine; line <= endLine; line += 1) {\n var mdNode = toastMark.findFirstNodeAtLine(line);\n if (mdNode && cannotBeListNode(mdNode, line)) {\n break;\n }\n if (skipLines.indexOf(line) !== -1) {\n continue;\n }\n var context = { toastMark, mdNode, doc, line, startLine };\n var changedResults = (isListNode$1(mdNode) ? otherListToList[commandType](context) : otherNodeToList[commandType](context)).changedResults;\n var endOffset = _this.changeToListPerLine(tr, changedResults, {\n from: getNodeContentOffsetRange(doc, changedResults[0].line - 1).startOffset,\n startLine: changedResults[0].line,\n endLine: last$1(changedResults).line,\n indexDiff: 1\n });\n endToOffset = Math.max(endOffset, endToOffset);\n if (changedResults) {\n skipLines = skipLines.concat(changedResults.map(function(info) {\n return info.line;\n }));\n }\n }\n dispatch(tr.setSelection(createTextSelection(tr, tr.mapping.map(endToOffset))));\n return true;\n };\n };\n };\n ListItem2.prototype.changeToListPerLine = function(tr, changedResults, _a) {\n var from = _a.from, startLine = _a.startLine, endLine = _a.endLine, _b = _a.indexDiff, indexDiff = _b === void 0 ? 0 : _b;\n var maxEndOffset = 0;\n var _loop_1 = function(i2) {\n var _c = tr.doc.child(i2), nodeSize = _c.nodeSize, content = _c.content;\n var mappedFrom = tr.mapping.map(from);\n var mappedTo = mappedFrom + content.size;\n var changedResult = changedResults.filter(function(result) {\n return result.line - indexDiff === i2;\n })[0];\n if (changedResult) {\n tr.replaceWith(mappedFrom, mappedTo, createTextNode$1(this_1.context.schema, changedResult.text));\n maxEndOffset = Math.max(maxEndOffset, from + content.size);\n }\n from += nodeSize;\n };\n var this_1 = this;\n for (var i = startLine - indexDiff; i <= endLine - indexDiff; i += 1) {\n _loop_1(i);\n }\n return maxEndOffset;\n };\n ListItem2.prototype.toggleTask = function() {\n var _this = this;\n return function(_a, dispatch) {\n var selection = _a.selection, tr = _a.tr, doc = _a.doc, schema = _a.schema;\n var toastMark = _this.context.toastMark;\n var _b = getRangeInfo(selection), startIndex = _b.startIndex, endIndex = _b.endIndex;\n var newTr = null;\n for (var i = startIndex; i <= endIndex; i += 1) {\n var mdNode = toastMark.findFirstNodeAtLine(i + 1);\n if (isListNode$1(mdNode) && mdNode.listData.task) {\n var _c = mdNode.listData, checked = _c.checked, padding = _c.padding;\n var stateChar = checked ? \" \" : \"x\";\n var mdPos = mdNode.sourcepos[0];\n var startOffset = getNodeContentOffsetRange(doc, mdPos[0] - 1).startOffset;\n startOffset += mdPos[1] + padding;\n newTr = tr.replaceWith(startOffset, startOffset + 1, schema.text(stateChar));\n }\n }\n if (newTr) {\n dispatch(newTr);\n return true;\n }\n return false;\n };\n };\n ListItem2.prototype.commands = function() {\n return {\n bulletList: this.toList(\"bullet\"),\n orderedList: this.toList(\"ordered\"),\n taskList: this.toList(\"task\")\n };\n };\n ListItem2.prototype.keymaps = function() {\n var bulletCommand = this.toList(\"bullet\")();\n var orderedCommand = this.toList(\"ordered\")();\n var taskCommand = this.toList(\"task\")();\n var togleTaskCommand = this.toggleTask();\n return {\n \"Mod-u\": bulletCommand,\n \"Mod-U\": bulletCommand,\n \"Mod-o\": orderedCommand,\n \"Mod-O\": orderedCommand,\n \"alt-t\": taskCommand,\n \"alt-T\": taskCommand,\n \"Shift-Ctrl-x\": togleTaskCommand,\n \"Shift-Ctrl-X\": togleTaskCommand,\n Enter: this.extendList()\n };\n };\n return ListItem2;\n }(Mark)\n);\nfunction toggleMark(condition, syntax) {\n return function() {\n return function(_a, dispatch) {\n var tr = _a.tr, selection = _a.selection;\n var conditionFn = !isFunction_1(condition) ? function(text2) {\n return condition.test(text2);\n } : condition;\n var syntaxLen = syntax.length;\n var doc = tr.doc;\n var _b = resolveSelectionPos(selection), from = _b[0], to = _b[1];\n var prevPos = Math.max(from - syntaxLen, 1);\n var nextPos = Math.min(to + syntaxLen, doc.content.size - 1);\n var slice = selection.content();\n var textContent = slice.content.textBetween(0, slice.content.size, \"\\n\");\n var prevText = doc.textBetween(prevPos, from, \"\\n\");\n var nextText = doc.textBetween(to, nextPos, \"\\n\");\n textContent = \"\" + prevText + textContent + nextText;\n if (prevText && nextText && conditionFn(textContent)) {\n tr.delete(nextPos - syntaxLen, nextPos).delete(prevPos, prevPos + syntaxLen);\n } else {\n tr.insertText(syntax, to).insertText(syntax, from);\n var newSelection = selection.empty ? createTextSelection(tr, from + syntaxLen) : createTextSelection(tr, from + syntaxLen, to + syntaxLen);\n tr.setSelection(newSelection);\n }\n dispatch(tr);\n return true;\n };\n };\n}\nvar reStrong = /^(\\*{2}|_{2}).*([\\s\\S]*)\\1$/m;\nvar strongSyntax = \"**\";\nvar Strong$1 = (\n /** @class */\n function(_super) {\n __extends$1(Strong2, _super);\n function Strong2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Strong2.prototype, \"name\", {\n get: function() {\n return \"strong\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Strong2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"strong\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Strong2.prototype.bold = function() {\n return toggleMark(reStrong, strongSyntax);\n };\n Strong2.prototype.commands = function() {\n return { bold: this.bold() };\n };\n Strong2.prototype.keymaps = function() {\n var boldCommand = this.bold()();\n return { \"Mod-b\": boldCommand, \"Mod-B\": boldCommand };\n };\n return Strong2;\n }(Mark)\n);\nvar reStrike = /^(~{2}).*([\\s\\S]*)\\1$/m;\nvar strikeSyntax = \"~~\";\nvar Strike$1 = (\n /** @class */\n function(_super) {\n __extends$1(Strike2, _super);\n function Strike2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Strike2.prototype, \"name\", {\n get: function() {\n return \"strike\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Strike2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"strike\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Strike2.prototype.commands = function() {\n return toggleMark(reStrike, strikeSyntax);\n };\n Strike2.prototype.keymaps = function() {\n var strikeCommand = this.commands()();\n return { \"Mod-s\": strikeCommand, \"Mod-S\": strikeCommand };\n };\n return Strike2;\n }(Mark)\n);\nvar reEmph = /^(\\*|_).*([\\s\\S]*)\\1$/m;\nvar emphSyntax = \"*\";\nvar Emph$1 = (\n /** @class */\n function(_super) {\n __extends$1(Emph2, _super);\n function Emph2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Emph2.prototype, \"name\", {\n get: function() {\n return \"emph\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Emph2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"emph\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Emph2.prototype.italic = function() {\n return toggleMark(reEmph, emphSyntax);\n };\n Emph2.prototype.commands = function() {\n return { italic: this.italic() };\n };\n Emph2.prototype.keymaps = function() {\n var italicCommand = this.italic()();\n return { \"Mod-i\": italicCommand, \"Mod-I\": italicCommand };\n };\n return Emph2;\n }(Mark)\n);\nvar reCode = /^(`).*([\\s\\S]*)\\1$/m;\nvar codeSyntax = \"`\";\nvar Code$1 = (\n /** @class */\n function(_super) {\n __extends$1(Code2, _super);\n function Code2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Code2.prototype, \"name\", {\n get: function() {\n return \"code\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Code2.prototype, \"schema\", {\n get: function() {\n return {\n attrs: {\n start: { default: false },\n end: { default: false },\n marked: { default: false }\n },\n toDOM: function(mark) {\n var _a = mark.attrs, start = _a.start, end = _a.end, marked = _a.marked;\n var classNames = \"code\";\n if (start) {\n classNames += \"|delimiter|start\";\n }\n if (end) {\n classNames += \"|delimiter|end\";\n }\n if (marked) {\n classNames += \"|marked-text\";\n }\n return [\"span\", { class: clsWithMdPrefix.apply(void 0, classNames.split(\"|\")) }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Code2.prototype.commands = function() {\n return toggleMark(reCode, codeSyntax);\n };\n Code2.prototype.keymaps = function() {\n var codeCommand = this.commands()();\n return { \"Shift-Mod-c\": codeCommand, \"Shift-Mod-C\": codeCommand };\n };\n return Code2;\n }(Mark)\n);\nvar Link$1 = (\n /** @class */\n function(_super) {\n __extends$1(Link2, _super);\n function Link2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Link2.prototype, \"name\", {\n get: function() {\n return \"link\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Link2.prototype, \"schema\", {\n get: function() {\n return {\n attrs: {\n url: { default: false },\n desc: { default: false }\n },\n toDOM: function(_a) {\n var attrs = _a.attrs;\n var url = attrs.url, desc = attrs.desc;\n var classNames = \"link\";\n if (url) {\n classNames += \"|link-url|marked-text\";\n }\n if (desc) {\n classNames += \"|link-desc|marked-text\";\n }\n return [\"span\", { class: clsWithMdPrefix.apply(void 0, classNames.split(\"|\")) }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n Link2.prototype.addLinkOrImage = function(commandType) {\n return function(payload) {\n return function(_a, dispatch) {\n var selection = _a.selection, tr = _a.tr, schema = _a.schema;\n var _b = resolveSelectionPos(selection), from = _b[0], to = _b[1];\n var _c = payload, linkText = _c.linkText, altText = _c.altText, linkUrl = _c.linkUrl, imageUrl = _c.imageUrl;\n var text2 = linkText;\n var url = linkUrl;\n var syntax = \"\";\n if (commandType === \"image\") {\n text2 = altText;\n url = imageUrl;\n syntax = \"!\";\n }\n text2 = escapeTextForLink(text2);\n syntax += \"[\" + text2 + \"](\" + url + \")\";\n dispatch(tr.replaceWith(from, to, createTextNode$1(schema, syntax)));\n return true;\n };\n };\n };\n Link2.prototype.commands = function() {\n return {\n addImage: this.addLinkOrImage(\"image\"),\n addLink: this.addLinkOrImage(\"link\")\n };\n };\n return Link2;\n }(Mark)\n);\nvar TaskDelimiter = (\n /** @class */\n function(_super) {\n __extends$1(TaskDelimiter2, _super);\n function TaskDelimiter2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(TaskDelimiter2.prototype, \"name\", {\n get: function() {\n return \"taskDelimiter\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TaskDelimiter2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"delimiter\", \"list-item\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n return TaskDelimiter2;\n }(Mark)\n);\nvar Delimiter = (\n /** @class */\n function(_super) {\n __extends$1(Delimiter2, _super);\n function Delimiter2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Delimiter2.prototype, \"name\", {\n get: function() {\n return \"delimiter\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Delimiter2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"delimiter\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n return Delimiter2;\n }(Mark)\n);\nvar Meta = (\n /** @class */\n function(_super) {\n __extends$1(Meta2, _super);\n function Meta2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Meta2.prototype, \"name\", {\n get: function() {\n return \"meta\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Meta2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"meta\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n return Meta2;\n }(Mark)\n);\nvar MarkedText = (\n /** @class */\n function(_super) {\n __extends$1(MarkedText2, _super);\n function MarkedText2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(MarkedText2.prototype, \"name\", {\n get: function() {\n return \"markedText\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MarkedText2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"marked-text\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n return MarkedText2;\n }(Mark)\n);\nvar TableCell = (\n /** @class */\n function(_super) {\n __extends$1(TableCell2, _super);\n function TableCell2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(TableCell2.prototype, \"name\", {\n get: function() {\n return \"tableCell\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TableCell2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"table-cell\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n return TableCell2;\n }(Mark)\n);\nvar Html = (\n /** @class */\n function(_super) {\n __extends$1(Html2, _super);\n function Html2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(Html2.prototype, \"name\", {\n get: function() {\n return \"html\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Html2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"html\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n return Html2;\n }(Mark)\n);\nvar customBlockSyntax = \"$$\";\nvar CustomBlock$1 = (\n /** @class */\n function(_super) {\n __extends$1(CustomBlock2, _super);\n function CustomBlock2() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(CustomBlock2.prototype, \"name\", {\n get: function() {\n return \"customBlock\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(CustomBlock2.prototype, \"schema\", {\n get: function() {\n return {\n toDOM: function() {\n return [\"span\", { class: clsWithMdPrefix(\"custom-block\") }, 0];\n }\n };\n },\n enumerable: false,\n configurable: true\n });\n CustomBlock2.prototype.commands = function() {\n return function(payload) {\n return function(state, dispatch) {\n var selection = state.selection, schema = state.schema, tr = state.tr;\n var _a = getRangeInfo(selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset;\n if (!(payload === null || payload === void 0 ? void 0 : payload.info)) {\n return false;\n }\n var customBlock2 = \"\" + customBlockSyntax + payload.info;\n var startNode = createTextNode$1(schema, customBlock2);\n var endNode = createTextNode$1(schema, customBlockSyntax);\n tr.insert(startFromOffset, startNode).split(startFromOffset + customBlock2.length);\n tr.split(tr.mapping.map(endToOffset)).insert(tr.mapping.map(endToOffset), endNode);\n dispatch(tr.setSelection(createTextSelection(tr, tr.mapping.map(endToOffset) - (customBlockSyntax.length + 2))));\n return true;\n };\n };\n };\n return CustomBlock2;\n }(Mark)\n);\nvar reTaskMarkerKey = /x|backspace/i;\nvar reTaskMarker = /^\\[(\\s*)(x?)(\\s*)\\](?:\\s+)/i;\nfunction smartTask(_a) {\n var schema = _a.schema, toastMark = _a.toastMark;\n return new Plugin({\n props: {\n handleDOMEvents: {\n keyup: function(view, ev) {\n var _a2;\n var _b = view.state, doc = _b.doc, tr = _b.tr, selection = _b.selection;\n if (selection.empty && reTaskMarkerKey.test(ev.key)) {\n var _c = getRangeInfo(selection), startIndex = _c.startIndex, startFromOffset = _c.startFromOffset, from = _c.from;\n var mdPos = [startIndex + 1, from - startFromOffset + 1];\n var mdNode = toastMark.findNodeAtPosition(mdPos);\n var paraNode = findClosestNode(mdNode, function(node) {\n var _a3;\n return node.type === \"paragraph\" && ((_a3 = node.parent) === null || _a3 === void 0 ? void 0 : _a3.type) === \"item\";\n });\n if ((_a2 = paraNode === null || paraNode === void 0 ? void 0 : paraNode.firstChild) === null || _a2 === void 0 ? void 0 : _a2.literal) {\n var firstChild = paraNode.firstChild;\n var matched = firstChild.literal.match(reTaskMarker);\n if (matched) {\n var startMdPos = firstChild.sourcepos[0];\n var startSpaces = matched[1], stateChar = matched[2], lastSpaces = matched[3];\n var spaces = startSpaces.length + lastSpaces.length;\n var startOffset = getNodeContentOffsetRange(doc, startMdPos[0] - 1).startOffset;\n var startPos = startMdPos[1] + startOffset;\n if (stateChar) {\n var addedPos = spaces ? spaces + 1 : 0;\n tr.replaceWith(startPos, addedPos + startPos, schema.text(stateChar));\n view.dispatch(tr);\n } else if (!spaces) {\n tr.insertText(\" \", startPos);\n view.dispatch(tr);\n }\n }\n }\n }\n return false;\n }\n }\n }\n });\n}\nvar EVENT_TYPE = \"cut\";\nvar reLineEnding$2 = /\\r\\n|\\n|\\r/;\nvar MdEditor = (\n /** @class */\n function(_super) {\n __extends$1(MdEditor2, _super);\n function MdEditor2(eventEmitter, options) {\n var _this = _super.call(this, eventEmitter) || this;\n var toastMark = options.toastMark, _a = options.useCommandShortcut, useCommandShortcut = _a === void 0 ? true : _a, _b = options.mdPlugins, mdPlugins = _b === void 0 ? [] : _b;\n _this.editorType = \"markdown\";\n _this.el.classList.add(\"md-mode\");\n _this.toastMark = toastMark;\n _this.extraPlugins = mdPlugins;\n _this.specs = _this.createSpecs();\n _this.schema = _this.createSchema();\n _this.context = _this.createContext();\n _this.keymaps = _this.createKeymaps(useCommandShortcut);\n _this.view = _this.createView();\n _this.commands = _this.createCommands();\n _this.specs.setContext(__assign$1(__assign$1({}, _this.context), { view: _this.view }));\n _this.createClipboard();\n _this.eventEmitter.listen(\"changePreviewTabWrite\", function(isMarkdownTabMounted) {\n return _this.toggleActive(true, isMarkdownTabMounted);\n });\n _this.eventEmitter.listen(\"changePreviewTabPreview\", function() {\n return _this.toggleActive(false);\n });\n _this.initEvent();\n return _this;\n }\n MdEditor2.prototype.toggleActive = function(active, isMarkdownTabMounted) {\n toggleClass(this.el, \"active\", active);\n if (active) {\n if (!isMarkdownTabMounted) {\n this.focus();\n }\n } else {\n this.blur();\n }\n };\n MdEditor2.prototype.createClipboard = function() {\n var _this = this;\n this.clipboard = document.createElement(\"textarea\");\n this.clipboard.className = cls(\"pseudo-clipboard\");\n this.clipboard.addEventListener(\"paste\", function(ev) {\n var clipboardData = ev.clipboardData || window.clipboardData;\n var items = clipboardData && clipboardData.items;\n if (items) {\n var containRtfItem = toArray_1(items).some(function(item2) {\n return item2.kind === \"string\" && item2.type === \"text/rtf\";\n });\n if (!containRtfItem) {\n var imageBlob = pasteImageOnly(items);\n if (imageBlob) {\n ev.preventDefault();\n emitImageBlobHook(_this.eventEmitter, imageBlob, ev.type);\n }\n }\n }\n });\n this.clipboard.addEventListener(\"input\", function(ev) {\n var text2 = ev.target.value;\n _this.replaceSelection(text2);\n ev.preventDefault();\n ev.target.value = \"\";\n });\n this.el.insertBefore(this.clipboard, this.view.dom);\n };\n MdEditor2.prototype.createContext = function() {\n return {\n toastMark: this.toastMark,\n schema: this.schema,\n eventEmitter: this.eventEmitter\n };\n };\n MdEditor2.prototype.createSpecs = function() {\n return new SpecManager([\n new Doc$1(),\n new Paragraph$1(),\n new Widget(),\n new Text$1(),\n new Heading$1(),\n new BlockQuote$1(),\n new CodeBlock$1(),\n new CustomBlock$1(),\n new Table$1(),\n new TableCell(),\n new ThematicBreak$1(),\n new ListItem$1(),\n new Strong$1(),\n new Strike$1(),\n new Emph$1(),\n new Code$1(),\n new Link$1(),\n new Delimiter(),\n new TaskDelimiter(),\n new MarkedText(),\n new Meta(),\n new Html()\n ]);\n };\n MdEditor2.prototype.createPlugins = function() {\n return __spreadArray$1([\n syntaxHighlight(this.context),\n previewHighlight(this.context),\n smartTask(this.context)\n ], this.createPluginProps()).concat(this.defaultPlugins);\n };\n MdEditor2.prototype.createView = function() {\n var _this = this;\n return new EditorView(this.el, {\n state: this.createState(),\n dispatchTransaction: function(tr) {\n _this.updateMarkdown(tr);\n var state = _this.view.state.applyTransaction(tr).state;\n _this.view.updateState(state);\n _this.emitChangeEvent(tr);\n },\n handleKeyDown: function(_, ev) {\n if ((ev.metaKey || ev.ctrlKey) && ev.key.toUpperCase() === \"V\") {\n _this.clipboard.focus();\n }\n _this.eventEmitter.emit(\"keydown\", _this.editorType, ev);\n return false;\n },\n handleDOMEvents: {\n copy: function(_, ev) {\n return _this.captureCopy(ev);\n },\n cut: function(_, ev) {\n return _this.captureCopy(ev, EVENT_TYPE);\n },\n scroll: function() {\n _this.eventEmitter.emit(\"scroll\", \"editor\");\n return true;\n },\n keyup: function(_, ev) {\n _this.eventEmitter.emit(\"keyup\", _this.editorType, ev);\n return false;\n }\n },\n nodeViews: {\n widget: widgetNodeView\n }\n });\n };\n MdEditor2.prototype.createCommands = function() {\n return this.specs.commands(this.view);\n };\n MdEditor2.prototype.captureCopy = function(ev, type) {\n ev.preventDefault();\n var _a = this.view.state, selection = _a.selection, tr = _a.tr;\n if (selection.empty) {\n return true;\n }\n var text2 = this.getChanged(selection.content());\n if (ev.clipboardData) {\n ev.clipboardData.setData(\"text/plain\", text2);\n } else {\n window.clipboardData.setData(\"Text\", text2);\n }\n if (type === EVENT_TYPE) {\n this.view.dispatch(tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", EVENT_TYPE));\n }\n return true;\n };\n MdEditor2.prototype.updateMarkdown = function(tr) {\n var _this = this;\n if (tr.docChanged) {\n tr.steps.forEach(function(step, index2) {\n if (step.slice && !(step instanceof ReplaceAroundStep)) {\n var doc = tr.docs[index2];\n var _a = [step.from, step.to], from = _a[0], to = _a[1];\n var _b = getEditorToMdPos(doc, from, to), startPos = _b[0], endPos = _b[1];\n var changed = _this.getChanged(step.slice);\n if (startPos[0] === endPos[0] && startPos[1] === endPos[1] && changed === \"\") {\n changed = \"\\n\";\n }\n var editResult = _this.toastMark.editMarkdown(startPos, endPos, changed);\n _this.eventEmitter.emit(\"updatePreview\", editResult);\n tr.setMeta(\"editResult\", editResult).scrollIntoView();\n }\n });\n }\n };\n MdEditor2.prototype.getChanged = function(slice) {\n var changed = \"\";\n var from = 0;\n var to = slice.content.size;\n slice.content.nodesBetween(from, to, function(node, pos) {\n if (node.isText) {\n changed += node.text.slice(Math.max(from, pos) - pos, to - pos);\n } else if (node.isBlock && pos > 0) {\n changed += \"\\n\";\n }\n });\n return changed;\n };\n MdEditor2.prototype.setSelection = function(start, end) {\n if (end === void 0) {\n end = start;\n }\n var tr = this.view.state.tr;\n var _a = getMdToEditorPos(tr.doc, start, end), from = _a[0], to = _a[1];\n this.view.dispatch(tr.setSelection(createTextSelection(tr, from, to)).scrollIntoView());\n };\n MdEditor2.prototype.replaceSelection = function(text2, start, end) {\n var newTr;\n var _a = this.view.state, tr = _a.tr, schema = _a.schema, doc = _a.doc;\n var lineTexts = text2.split(reLineEnding$2);\n var nodes = lineTexts.map(function(lineText) {\n return createParagraph(schema, createNodesWithWidget(lineText, schema));\n });\n var slice = new Slice(Fragment.from(nodes), 1, 1);\n this.focus();\n if (start && end) {\n var _b = getMdToEditorPos(doc, start, end), from = _b[0], to = _b[1];\n newTr = tr.replaceRange(from, to, slice);\n } else {\n newTr = tr.replaceSelection(slice);\n }\n this.view.dispatch(newTr.scrollIntoView());\n };\n MdEditor2.prototype.deleteSelection = function(start, end) {\n var newTr;\n var _a = this.view.state, tr = _a.tr, doc = _a.doc;\n if (start && end) {\n var _b = getMdToEditorPos(doc, start, end), from = _b[0], to = _b[1];\n newTr = tr.deleteRange(from, to);\n } else {\n newTr = tr.deleteSelection();\n }\n this.view.dispatch(newTr.scrollIntoView());\n };\n MdEditor2.prototype.getSelectedText = function(start, end) {\n var _a = this.view.state, doc = _a.doc, selection = _a.selection;\n var from = selection.from, to = selection.to;\n if (start && end) {\n var pos = getMdToEditorPos(doc, start, end);\n from = pos[0];\n to = pos[1];\n }\n return doc.textBetween(from, to, \"\\n\");\n };\n MdEditor2.prototype.getSelection = function() {\n var _a = this.view.state.selection, from = _a.from, to = _a.to;\n return getEditorToMdPos(this.view.state.tr.doc, from, to);\n };\n MdEditor2.prototype.setMarkdown = function(markdown, cursorToEnd) {\n if (cursorToEnd === void 0) {\n cursorToEnd = true;\n }\n var lineTexts = markdown.split(reLineEnding$2);\n var _a = this.view.state, tr = _a.tr, doc = _a.doc, schema = _a.schema;\n var nodes = lineTexts.map(function(lineText) {\n return createParagraph(schema, createNodesWithWidget(lineText, schema));\n });\n this.view.dispatch(tr.replaceWith(0, doc.content.size, nodes));\n if (cursorToEnd) {\n this.moveCursorToEnd(true);\n }\n };\n MdEditor2.prototype.addWidget = function(node, style, mdPos) {\n var _a = this.view.state, tr = _a.tr, doc = _a.doc, selection = _a.selection;\n var pos = mdPos ? getMdToEditorPos(doc, mdPos, mdPos)[0] : selection.to;\n this.view.dispatch(tr.setMeta(\"widget\", { pos, node, style }));\n };\n MdEditor2.prototype.replaceWithWidget = function(start, end, text2) {\n var _a = this.view.state, tr = _a.tr, schema = _a.schema, doc = _a.doc;\n var pos = getMdToEditorPos(doc, start, end);\n var nodes = createNodesWithWidget(text2, schema);\n this.view.dispatch(tr.replaceWith(pos[0], pos[1], nodes));\n };\n MdEditor2.prototype.getRangeInfoOfNode = function(pos) {\n var _a = this.view.state, doc = _a.doc, selection = _a.selection;\n var mdPos = pos || getEditorToMdPos(doc, selection.from)[0];\n var mdNode = this.toastMark.findNodeAtPosition(mdPos);\n if (mdNode.type === \"text\" && mdNode.parent.type !== \"paragraph\") {\n mdNode = mdNode.parent;\n }\n mdNode.sourcepos[1][1] += 1;\n return { range: mdNode.sourcepos, type: mdNode.type };\n };\n MdEditor2.prototype.getMarkdown = function() {\n return this.toastMark.getLineTexts().map(function(lineText) {\n return unwrapWidgetSyntax(lineText);\n }).join(\"\\n\");\n };\n MdEditor2.prototype.getToastMark = function() {\n return this.toastMark;\n };\n return MdEditor2;\n }(EditorBase)\n);\nvar EVENT_KEY = \"_feEventKey\";\nfunction safeEvent$2(element, type) {\n var events = element[EVENT_KEY];\n var handlers;\n if (!events) {\n events = element[EVENT_KEY] = {};\n }\n handlers = events[type];\n if (!handlers) {\n handlers = events[type] = [];\n }\n return handlers;\n}\nvar _safeEvent = safeEvent$2;\nvar isString$1 = isString_1;\nvar forEach$1 = forEach_1;\nvar safeEvent$1 = _safeEvent;\nfunction off(element, types, handler) {\n if (isString$1(types)) {\n forEach$1(types.split(/\\s+/g), function(type) {\n unbindEvent(element, type, handler);\n });\n return;\n }\n forEach$1(types, function(func, type) {\n unbindEvent(element, type, func);\n });\n}\nfunction unbindEvent(element, type, handler) {\n var events = safeEvent$1(element, type);\n var index2;\n if (!handler) {\n forEach$1(events, function(item2) {\n removeHandler(element, type, item2.wrappedHandler);\n });\n events.splice(0, events.length);\n } else {\n forEach$1(events, function(item2, idx) {\n if (handler === item2.handler) {\n removeHandler(element, type, item2.wrappedHandler);\n index2 = idx;\n return false;\n }\n return true;\n });\n events.splice(index2, 1);\n }\n}\nfunction removeHandler(element, type, handler) {\n if (\"removeEventListener\" in element) {\n element.removeEventListener(type, handler);\n } else if (\"detachEvent\" in element) {\n element.detachEvent(\"on\" + type, handler);\n }\n}\nvar off_1 = off;\nvar isString = isString_1;\nvar forEach = forEach_1;\nvar safeEvent = _safeEvent;\nfunction on(element, types, handler, context) {\n if (isString(types)) {\n forEach(types.split(/\\s+/g), function(type) {\n bindEvent(element, type, handler, context);\n });\n return;\n }\n forEach(types, function(func, type) {\n bindEvent(element, type, func, handler);\n });\n}\nfunction bindEvent(element, type, handler, context) {\n function eventHandler(e) {\n handler.call(context || element, e || window.event);\n }\n if (\"addEventListener\" in element) {\n element.addEventListener(type, eventHandler);\n } else if (\"attachEvent\" in element) {\n element.attachEvent(\"on\" + type, eventHandler);\n }\n memorizeHandler(element, type, handler, eventHandler);\n}\nfunction memorizeHandler(element, type, handler, wrappedHandler) {\n var events = safeEvent(element, type);\n var existInEvents = false;\n forEach(events, function(obj) {\n if (obj.handler === handler) {\n existInEvents = true;\n return false;\n }\n return true;\n });\n if (!existInEvents) {\n events.push({\n handler,\n wrappedHandler\n });\n }\n}\nvar on_1 = on;\n/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n d2.__proto__ = b2;\n } || function(d2, b2) {\n for (var p in b2)\n if (Object.prototype.hasOwnProperty.call(b2, p))\n d2[p] = b2[p];\n };\n return extendStatics(d, b);\n};\nfunction __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() {\n this.constructor = d;\n }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nvar __assign = function() {\n __assign = Object.assign || function __assign2(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s)\n if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2)\n for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar)\n ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\nvar commonjsGlobal = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nvar encodeCache = {};\nfunction getEncodeCache(exclude) {\n var i, ch, cache2 = encodeCache[exclude];\n if (cache2) {\n return cache2;\n }\n cache2 = encodeCache[exclude] = [];\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n if (/^[0-9a-z]$/i.test(ch)) {\n cache2.push(ch);\n } else {\n cache2.push(\"%\" + (\"0\" + i.toString(16).toUpperCase()).slice(-2));\n }\n }\n for (i = 0; i < exclude.length; i++) {\n cache2[exclude.charCodeAt(i)] = exclude[i];\n }\n return cache2;\n}\nfunction encode$1(string, exclude, keepEscaped) {\n var i, l, code2, nextCode, cache2, result = \"\";\n if (typeof exclude !== \"string\") {\n keepEscaped = exclude;\n exclude = encode$1.defaultChars;\n }\n if (typeof keepEscaped === \"undefined\") {\n keepEscaped = true;\n }\n cache2 = getEncodeCache(exclude);\n for (i = 0, l = string.length; i < l; i++) {\n code2 = string.charCodeAt(i);\n if (keepEscaped && code2 === 37 && i + 2 < l) {\n if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n result += string.slice(i, i + 3);\n i += 2;\n continue;\n }\n }\n if (code2 < 128) {\n result += cache2[code2];\n continue;\n }\n if (code2 >= 55296 && code2 <= 57343) {\n if (code2 >= 55296 && code2 <= 56319 && i + 1 < l) {\n nextCode = string.charCodeAt(i + 1);\n if (nextCode >= 56320 && nextCode <= 57343) {\n result += encodeURIComponent(string[i] + string[i + 1]);\n i++;\n continue;\n }\n }\n result += \"%EF%BF%BD\";\n continue;\n }\n result += encodeURIComponent(string[i]);\n }\n return result;\n}\nencode$1.defaultChars = \";/?:@&=+$,-_.!~*'()#\";\nencode$1.componentChars = \"-_.!~*'()\";\nvar encode_1 = encode$1;\nvar lib = {};\nvar decode = {};\nvar Aacute$1 = \"\\xC1\";\nvar aacute$1 = \"\\xE1\";\nvar Abreve = \"\\u0102\";\nvar abreve = \"\\u0103\";\nvar ac = \"\\u223E\";\nvar acd = \"\\u223F\";\nvar acE = \"\\u223E\\u0333\";\nvar Acirc$1 = \"\\xC2\";\nvar acirc$1 = \"\\xE2\";\nvar acute$1 = \"\\xB4\";\nvar Acy = \"\\u0410\";\nvar acy = \"\\u0430\";\nvar AElig$1 = \"\\xC6\";\nvar aelig$1 = \"\\xE6\";\nvar af = \"\\u2061\";\nvar Afr = \"\\u{1D504}\";\nvar afr = \"\\u{1D51E}\";\nvar Agrave$1 = \"\\xC0\";\nvar agrave$1 = \"\\xE0\";\nvar alefsym = \"\\u2135\";\nvar aleph = \"\\u2135\";\nvar Alpha = \"\\u0391\";\nvar alpha = \"\\u03B1\";\nvar Amacr = \"\\u0100\";\nvar amacr = \"\\u0101\";\nvar amalg = \"\\u2A3F\";\nvar amp$2 = \"&\";\nvar AMP$1 = \"&\";\nvar andand = \"\\u2A55\";\nvar And = \"\\u2A53\";\nvar and = \"\\u2227\";\nvar andd = \"\\u2A5C\";\nvar andslope = \"\\u2A58\";\nvar andv = \"\\u2A5A\";\nvar ang = \"\\u2220\";\nvar ange = \"\\u29A4\";\nvar angle = \"\\u2220\";\nvar angmsdaa = \"\\u29A8\";\nvar angmsdab = \"\\u29A9\";\nvar angmsdac = \"\\u29AA\";\nvar angmsdad = \"\\u29AB\";\nvar angmsdae = \"\\u29AC\";\nvar angmsdaf = \"\\u29AD\";\nvar angmsdag = \"\\u29AE\";\nvar angmsdah = \"\\u29AF\";\nvar angmsd = \"\\u2221\";\nvar angrt = \"\\u221F\";\nvar angrtvb = \"\\u22BE\";\nvar angrtvbd = \"\\u299D\";\nvar angsph = \"\\u2222\";\nvar angst = \"\\xC5\";\nvar angzarr = \"\\u237C\";\nvar Aogon = \"\\u0104\";\nvar aogon = \"\\u0105\";\nvar Aopf = \"\\u{1D538}\";\nvar aopf = \"\\u{1D552}\";\nvar apacir = \"\\u2A6F\";\nvar ap = \"\\u2248\";\nvar apE = \"\\u2A70\";\nvar ape = \"\\u224A\";\nvar apid = \"\\u224B\";\nvar apos$1 = \"'\";\nvar ApplyFunction = \"\\u2061\";\nvar approx = \"\\u2248\";\nvar approxeq = \"\\u224A\";\nvar Aring$1 = \"\\xC5\";\nvar aring$1 = \"\\xE5\";\nvar Ascr = \"\\u{1D49C}\";\nvar ascr = \"\\u{1D4B6}\";\nvar Assign = \"\\u2254\";\nvar ast = \"*\";\nvar asymp = \"\\u2248\";\nvar asympeq = \"\\u224D\";\nvar Atilde$1 = \"\\xC3\";\nvar atilde$1 = \"\\xE3\";\nvar Auml$1 = \"\\xC4\";\nvar auml$1 = \"\\xE4\";\nvar awconint = \"\\u2233\";\nvar awint = \"\\u2A11\";\nvar backcong = \"\\u224C\";\nvar backepsilon = \"\\u03F6\";\nvar backprime = \"\\u2035\";\nvar backsim = \"\\u223D\";\nvar backsimeq = \"\\u22CD\";\nvar Backslash = \"\\u2216\";\nvar Barv = \"\\u2AE7\";\nvar barvee = \"\\u22BD\";\nvar barwed = \"\\u2305\";\nvar Barwed = \"\\u2306\";\nvar barwedge = \"\\u2305\";\nvar bbrk = \"\\u23B5\";\nvar bbrktbrk = \"\\u23B6\";\nvar bcong = \"\\u224C\";\nvar Bcy = \"\\u0411\";\nvar bcy = \"\\u0431\";\nvar bdquo = \"\\u201E\";\nvar becaus = \"\\u2235\";\nvar because = \"\\u2235\";\nvar Because = \"\\u2235\";\nvar bemptyv = \"\\u29B0\";\nvar bepsi = \"\\u03F6\";\nvar bernou = \"\\u212C\";\nvar Bernoullis = \"\\u212C\";\nvar Beta = \"\\u0392\";\nvar beta = \"\\u03B2\";\nvar beth = \"\\u2136\";\nvar between = \"\\u226C\";\nvar Bfr = \"\\u{1D505}\";\nvar bfr = \"\\u{1D51F}\";\nvar bigcap = \"\\u22C2\";\nvar bigcirc = \"\\u25EF\";\nvar bigcup = \"\\u22C3\";\nvar bigodot = \"\\u2A00\";\nvar bigoplus = \"\\u2A01\";\nvar bigotimes = \"\\u2A02\";\nvar bigsqcup = \"\\u2A06\";\nvar bigstar = \"\\u2605\";\nvar bigtriangledown = \"\\u25BD\";\nvar bigtriangleup = \"\\u25B3\";\nvar biguplus = \"\\u2A04\";\nvar bigvee = \"\\u22C1\";\nvar bigwedge = \"\\u22C0\";\nvar bkarow = \"\\u290D\";\nvar blacklozenge = \"\\u29EB\";\nvar blacksquare = \"\\u25AA\";\nvar blacktriangle = \"\\u25B4\";\nvar blacktriangledown = \"\\u25BE\";\nvar blacktriangleleft = \"\\u25C2\";\nvar blacktriangleright = \"\\u25B8\";\nvar blank = \"\\u2423\";\nvar blk12 = \"\\u2592\";\nvar blk14 = \"\\u2591\";\nvar blk34 = \"\\u2593\";\nvar block = \"\\u2588\";\nvar bne = \"=\\u20E5\";\nvar bnequiv = \"\\u2261\\u20E5\";\nvar bNot = \"\\u2AED\";\nvar bnot = \"\\u2310\";\nvar Bopf = \"\\u{1D539}\";\nvar bopf = \"\\u{1D553}\";\nvar bot = \"\\u22A5\";\nvar bottom = \"\\u22A5\";\nvar bowtie = \"\\u22C8\";\nvar boxbox = \"\\u29C9\";\nvar boxdl = \"\\u2510\";\nvar boxdL = \"\\u2555\";\nvar boxDl = \"\\u2556\";\nvar boxDL = \"\\u2557\";\nvar boxdr = \"\\u250C\";\nvar boxdR = \"\\u2552\";\nvar boxDr = \"\\u2553\";\nvar boxDR = \"\\u2554\";\nvar boxh = \"\\u2500\";\nvar boxH = \"\\u2550\";\nvar boxhd = \"\\u252C\";\nvar boxHd = \"\\u2564\";\nvar boxhD = \"\\u2565\";\nvar boxHD = \"\\u2566\";\nvar boxhu = \"\\u2534\";\nvar boxHu = \"\\u2567\";\nvar boxhU = \"\\u2568\";\nvar boxHU = \"\\u2569\";\nvar boxminus = \"\\u229F\";\nvar boxplus = \"\\u229E\";\nvar boxtimes = \"\\u22A0\";\nvar boxul = \"\\u2518\";\nvar boxuL = \"\\u255B\";\nvar boxUl = \"\\u255C\";\nvar boxUL = \"\\u255D\";\nvar boxur = \"\\u2514\";\nvar boxuR = \"\\u2558\";\nvar boxUr = \"\\u2559\";\nvar boxUR = \"\\u255A\";\nvar boxv = \"\\u2502\";\nvar boxV = \"\\u2551\";\nvar boxvh = \"\\u253C\";\nvar boxvH = \"\\u256A\";\nvar boxVh = \"\\u256B\";\nvar boxVH = \"\\u256C\";\nvar boxvl = \"\\u2524\";\nvar boxvL = \"\\u2561\";\nvar boxVl = \"\\u2562\";\nvar boxVL = \"\\u2563\";\nvar boxvr = \"\\u251C\";\nvar boxvR = \"\\u255E\";\nvar boxVr = \"\\u255F\";\nvar boxVR = \"\\u2560\";\nvar bprime = \"\\u2035\";\nvar breve = \"\\u02D8\";\nvar Breve = \"\\u02D8\";\nvar brvbar$1 = \"\\xA6\";\nvar bscr = \"\\u{1D4B7}\";\nvar Bscr = \"\\u212C\";\nvar bsemi = \"\\u204F\";\nvar bsim = \"\\u223D\";\nvar bsime = \"\\u22CD\";\nvar bsolb = \"\\u29C5\";\nvar bsol = \"\\\\\";\nvar bsolhsub = \"\\u27C8\";\nvar bull = \"\\u2022\";\nvar bullet = \"\\u2022\";\nvar bump = \"\\u224E\";\nvar bumpE = \"\\u2AAE\";\nvar bumpe = \"\\u224F\";\nvar Bumpeq = \"\\u224E\";\nvar bumpeq = \"\\u224F\";\nvar Cacute = \"\\u0106\";\nvar cacute = \"\\u0107\";\nvar capand = \"\\u2A44\";\nvar capbrcup = \"\\u2A49\";\nvar capcap = \"\\u2A4B\";\nvar cap = \"\\u2229\";\nvar Cap = \"\\u22D2\";\nvar capcup = \"\\u2A47\";\nvar capdot = \"\\u2A40\";\nvar CapitalDifferentialD = \"\\u2145\";\nvar caps = \"\\u2229\\uFE00\";\nvar caret = \"\\u2041\";\nvar caron = \"\\u02C7\";\nvar Cayleys = \"\\u212D\";\nvar ccaps = \"\\u2A4D\";\nvar Ccaron = \"\\u010C\";\nvar ccaron = \"\\u010D\";\nvar Ccedil$1 = \"\\xC7\";\nvar ccedil$1 = \"\\xE7\";\nvar Ccirc = \"\\u0108\";\nvar ccirc = \"\\u0109\";\nvar Cconint = \"\\u2230\";\nvar ccups = \"\\u2A4C\";\nvar ccupssm = \"\\u2A50\";\nvar Cdot = \"\\u010A\";\nvar cdot = \"\\u010B\";\nvar cedil$1 = \"\\xB8\";\nvar Cedilla = \"\\xB8\";\nvar cemptyv = \"\\u29B2\";\nvar cent$1 = \"\\xA2\";\nvar centerdot = \"\\xB7\";\nvar CenterDot = \"\\xB7\";\nvar cfr = \"\\u{1D520}\";\nvar Cfr = \"\\u212D\";\nvar CHcy = \"\\u0427\";\nvar chcy = \"\\u0447\";\nvar check = \"\\u2713\";\nvar checkmark = \"\\u2713\";\nvar Chi = \"\\u03A7\";\nvar chi = \"\\u03C7\";\nvar circ = \"\\u02C6\";\nvar circeq = \"\\u2257\";\nvar circlearrowleft = \"\\u21BA\";\nvar circlearrowright = \"\\u21BB\";\nvar circledast = \"\\u229B\";\nvar circledcirc = \"\\u229A\";\nvar circleddash = \"\\u229D\";\nvar CircleDot = \"\\u2299\";\nvar circledR = \"\\xAE\";\nvar circledS = \"\\u24C8\";\nvar CircleMinus = \"\\u2296\";\nvar CirclePlus = \"\\u2295\";\nvar CircleTimes = \"\\u2297\";\nvar cir = \"\\u25CB\";\nvar cirE = \"\\u29C3\";\nvar cire = \"\\u2257\";\nvar cirfnint = \"\\u2A10\";\nvar cirmid = \"\\u2AEF\";\nvar cirscir = \"\\u29C2\";\nvar ClockwiseContourIntegral = \"\\u2232\";\nvar CloseCurlyDoubleQuote = \"\\u201D\";\nvar CloseCurlyQuote = \"\\u2019\";\nvar clubs = \"\\u2663\";\nvar clubsuit = \"\\u2663\";\nvar colon = \":\";\nvar Colon = \"\\u2237\";\nvar Colone = \"\\u2A74\";\nvar colone = \"\\u2254\";\nvar coloneq = \"\\u2254\";\nvar comma = \",\";\nvar commat = \"@\";\nvar comp = \"\\u2201\";\nvar compfn = \"\\u2218\";\nvar complement = \"\\u2201\";\nvar complexes = \"\\u2102\";\nvar cong = \"\\u2245\";\nvar congdot = \"\\u2A6D\";\nvar Congruent = \"\\u2261\";\nvar conint = \"\\u222E\";\nvar Conint = \"\\u222F\";\nvar ContourIntegral = \"\\u222E\";\nvar copf = \"\\u{1D554}\";\nvar Copf = \"\\u2102\";\nvar coprod = \"\\u2210\";\nvar Coproduct = \"\\u2210\";\nvar copy$1 = \"\\xA9\";\nvar COPY$1 = \"\\xA9\";\nvar copysr = \"\\u2117\";\nvar CounterClockwiseContourIntegral = \"\\u2233\";\nvar crarr = \"\\u21B5\";\nvar cross = \"\\u2717\";\nvar Cross = \"\\u2A2F\";\nvar Cscr = \"\\u{1D49E}\";\nvar cscr = \"\\u{1D4B8}\";\nvar csub = \"\\u2ACF\";\nvar csube = \"\\u2AD1\";\nvar csup = \"\\u2AD0\";\nvar csupe = \"\\u2AD2\";\nvar ctdot = \"\\u22EF\";\nvar cudarrl = \"\\u2938\";\nvar cudarrr = \"\\u2935\";\nvar cuepr = \"\\u22DE\";\nvar cuesc = \"\\u22DF\";\nvar cularr = \"\\u21B6\";\nvar cularrp = \"\\u293D\";\nvar cupbrcap = \"\\u2A48\";\nvar cupcap = \"\\u2A46\";\nvar CupCap = \"\\u224D\";\nvar cup = \"\\u222A\";\nvar Cup = \"\\u22D3\";\nvar cupcup = \"\\u2A4A\";\nvar cupdot = \"\\u228D\";\nvar cupor = \"\\u2A45\";\nvar cups = \"\\u222A\\uFE00\";\nvar curarr = \"\\u21B7\";\nvar curarrm = \"\\u293C\";\nvar curlyeqprec = \"\\u22DE\";\nvar curlyeqsucc = \"\\u22DF\";\nvar curlyvee = \"\\u22CE\";\nvar curlywedge = \"\\u22CF\";\nvar curren$1 = \"\\xA4\";\nvar curvearrowleft = \"\\u21B6\";\nvar curvearrowright = \"\\u21B7\";\nvar cuvee = \"\\u22CE\";\nvar cuwed = \"\\u22CF\";\nvar cwconint = \"\\u2232\";\nvar cwint = \"\\u2231\";\nvar cylcty = \"\\u232D\";\nvar dagger = \"\\u2020\";\nvar Dagger = \"\\u2021\";\nvar daleth = \"\\u2138\";\nvar darr = \"\\u2193\";\nvar Darr = \"\\u21A1\";\nvar dArr = \"\\u21D3\";\nvar dash = \"\\u2010\";\nvar Dashv = \"\\u2AE4\";\nvar dashv = \"\\u22A3\";\nvar dbkarow = \"\\u290F\";\nvar dblac = \"\\u02DD\";\nvar Dcaron = \"\\u010E\";\nvar dcaron = \"\\u010F\";\nvar Dcy = \"\\u0414\";\nvar dcy = \"\\u0434\";\nvar ddagger = \"\\u2021\";\nvar ddarr = \"\\u21CA\";\nvar DD = \"\\u2145\";\nvar dd = \"\\u2146\";\nvar DDotrahd = \"\\u2911\";\nvar ddotseq = \"\\u2A77\";\nvar deg$1 = \"\\xB0\";\nvar Del = \"\\u2207\";\nvar Delta = \"\\u0394\";\nvar delta = \"\\u03B4\";\nvar demptyv = \"\\u29B1\";\nvar dfisht = \"\\u297F\";\nvar Dfr = \"\\u{1D507}\";\nvar dfr = \"\\u{1D521}\";\nvar dHar = \"\\u2965\";\nvar dharl = \"\\u21C3\";\nvar dharr = \"\\u21C2\";\nvar DiacriticalAcute = \"\\xB4\";\nvar DiacriticalDot = \"\\u02D9\";\nvar DiacriticalDoubleAcute = \"\\u02DD\";\nvar DiacriticalGrave = \"`\";\nvar DiacriticalTilde = \"\\u02DC\";\nvar diam = \"\\u22C4\";\nvar diamond = \"\\u22C4\";\nvar Diamond = \"\\u22C4\";\nvar diamondsuit = \"\\u2666\";\nvar diams = \"\\u2666\";\nvar die = \"\\xA8\";\nvar DifferentialD = \"\\u2146\";\nvar digamma = \"\\u03DD\";\nvar disin = \"\\u22F2\";\nvar div = \"\\xF7\";\nvar divide$1 = \"\\xF7\";\nvar divideontimes = \"\\u22C7\";\nvar divonx = \"\\u22C7\";\nvar DJcy = \"\\u0402\";\nvar djcy = \"\\u0452\";\nvar dlcorn = \"\\u231E\";\nvar dlcrop = \"\\u230D\";\nvar dollar = \"$\";\nvar Dopf = \"\\u{1D53B}\";\nvar dopf = \"\\u{1D555}\";\nvar Dot = \"\\xA8\";\nvar dot = \"\\u02D9\";\nvar DotDot = \"\\u20DC\";\nvar doteq = \"\\u2250\";\nvar doteqdot = \"\\u2251\";\nvar DotEqual = \"\\u2250\";\nvar dotminus = \"\\u2238\";\nvar dotplus = \"\\u2214\";\nvar dotsquare = \"\\u22A1\";\nvar doublebarwedge = \"\\u2306\";\nvar DoubleContourIntegral = \"\\u222F\";\nvar DoubleDot = \"\\xA8\";\nvar DoubleDownArrow = \"\\u21D3\";\nvar DoubleLeftArrow = \"\\u21D0\";\nvar DoubleLeftRightArrow = \"\\u21D4\";\nvar DoubleLeftTee = \"\\u2AE4\";\nvar DoubleLongLeftArrow = \"\\u27F8\";\nvar DoubleLongLeftRightArrow = \"\\u27FA\";\nvar DoubleLongRightArrow = \"\\u27F9\";\nvar DoubleRightArrow = \"\\u21D2\";\nvar DoubleRightTee = \"\\u22A8\";\nvar DoubleUpArrow = \"\\u21D1\";\nvar DoubleUpDownArrow = \"\\u21D5\";\nvar DoubleVerticalBar = \"\\u2225\";\nvar DownArrowBar = \"\\u2913\";\nvar downarrow = \"\\u2193\";\nvar DownArrow = \"\\u2193\";\nvar Downarrow = \"\\u21D3\";\nvar DownArrowUpArrow = \"\\u21F5\";\nvar DownBreve = \"\\u0311\";\nvar downdownarrows = \"\\u21CA\";\nvar downharpoonleft = \"\\u21C3\";\nvar downharpoonright = \"\\u21C2\";\nvar DownLeftRightVector = \"\\u2950\";\nvar DownLeftTeeVector = \"\\u295E\";\nvar DownLeftVectorBar = \"\\u2956\";\nvar DownLeftVector = \"\\u21BD\";\nvar DownRightTeeVector = \"\\u295F\";\nvar DownRightVectorBar = \"\\u2957\";\nvar DownRightVector = \"\\u21C1\";\nvar DownTeeArrow = \"\\u21A7\";\nvar DownTee = \"\\u22A4\";\nvar drbkarow = \"\\u2910\";\nvar drcorn = \"\\u231F\";\nvar drcrop = \"\\u230C\";\nvar Dscr = \"\\u{1D49F}\";\nvar dscr = \"\\u{1D4B9}\";\nvar DScy = \"\\u0405\";\nvar dscy = \"\\u0455\";\nvar dsol = \"\\u29F6\";\nvar Dstrok = \"\\u0110\";\nvar dstrok = \"\\u0111\";\nvar dtdot = \"\\u22F1\";\nvar dtri = \"\\u25BF\";\nvar dtrif = \"\\u25BE\";\nvar duarr = \"\\u21F5\";\nvar duhar = \"\\u296F\";\nvar dwangle = \"\\u29A6\";\nvar DZcy = \"\\u040F\";\nvar dzcy = \"\\u045F\";\nvar dzigrarr = \"\\u27FF\";\nvar Eacute$1 = \"\\xC9\";\nvar eacute$1 = \"\\xE9\";\nvar easter = \"\\u2A6E\";\nvar Ecaron = \"\\u011A\";\nvar ecaron = \"\\u011B\";\nvar Ecirc$1 = \"\\xCA\";\nvar ecirc$1 = \"\\xEA\";\nvar ecir = \"\\u2256\";\nvar ecolon = \"\\u2255\";\nvar Ecy = \"\\u042D\";\nvar ecy = \"\\u044D\";\nvar eDDot = \"\\u2A77\";\nvar Edot = \"\\u0116\";\nvar edot = \"\\u0117\";\nvar eDot = \"\\u2251\";\nvar ee = \"\\u2147\";\nvar efDot = \"\\u2252\";\nvar Efr = \"\\u{1D508}\";\nvar efr = \"\\u{1D522}\";\nvar eg = \"\\u2A9A\";\nvar Egrave$1 = \"\\xC8\";\nvar egrave$1 = \"\\xE8\";\nvar egs = \"\\u2A96\";\nvar egsdot = \"\\u2A98\";\nvar el = \"\\u2A99\";\nvar Element$1 = \"\\u2208\";\nvar elinters = \"\\u23E7\";\nvar ell = \"\\u2113\";\nvar els = \"\\u2A95\";\nvar elsdot = \"\\u2A97\";\nvar Emacr = \"\\u0112\";\nvar emacr = \"\\u0113\";\nvar empty = \"\\u2205\";\nvar emptyset = \"\\u2205\";\nvar EmptySmallSquare = \"\\u25FB\";\nvar emptyv = \"\\u2205\";\nvar EmptyVerySmallSquare = \"\\u25AB\";\nvar emsp13 = \"\\u2004\";\nvar emsp14 = \"\\u2005\";\nvar emsp = \"\\u2003\";\nvar ENG = \"\\u014A\";\nvar eng = \"\\u014B\";\nvar ensp = \"\\u2002\";\nvar Eogon = \"\\u0118\";\nvar eogon = \"\\u0119\";\nvar Eopf = \"\\u{1D53C}\";\nvar eopf = \"\\u{1D556}\";\nvar epar = \"\\u22D5\";\nvar eparsl = \"\\u29E3\";\nvar eplus = \"\\u2A71\";\nvar epsi = \"\\u03B5\";\nvar Epsilon = \"\\u0395\";\nvar epsilon = \"\\u03B5\";\nvar epsiv = \"\\u03F5\";\nvar eqcirc = \"\\u2256\";\nvar eqcolon = \"\\u2255\";\nvar eqsim = \"\\u2242\";\nvar eqslantgtr = \"\\u2A96\";\nvar eqslantless = \"\\u2A95\";\nvar Equal = \"\\u2A75\";\nvar equals = \"=\";\nvar EqualTilde = \"\\u2242\";\nvar equest = \"\\u225F\";\nvar Equilibrium = \"\\u21CC\";\nvar equiv = \"\\u2261\";\nvar equivDD = \"\\u2A78\";\nvar eqvparsl = \"\\u29E5\";\nvar erarr = \"\\u2971\";\nvar erDot = \"\\u2253\";\nvar escr = \"\\u212F\";\nvar Escr = \"\\u2130\";\nvar esdot = \"\\u2250\";\nvar Esim = \"\\u2A73\";\nvar esim = \"\\u2242\";\nvar Eta = \"\\u0397\";\nvar eta = \"\\u03B7\";\nvar ETH$1 = \"\\xD0\";\nvar eth$1 = \"\\xF0\";\nvar Euml$1 = \"\\xCB\";\nvar euml$1 = \"\\xEB\";\nvar euro = \"\\u20AC\";\nvar excl = \"!\";\nvar exist = \"\\u2203\";\nvar Exists = \"\\u2203\";\nvar expectation = \"\\u2130\";\nvar exponentiale = \"\\u2147\";\nvar ExponentialE = \"\\u2147\";\nvar fallingdotseq = \"\\u2252\";\nvar Fcy = \"\\u0424\";\nvar fcy = \"\\u0444\";\nvar female = \"\\u2640\";\nvar ffilig = \"\\uFB03\";\nvar fflig = \"\\uFB00\";\nvar ffllig = \"\\uFB04\";\nvar Ffr = \"\\u{1D509}\";\nvar ffr = \"\\u{1D523}\";\nvar filig = \"\\uFB01\";\nvar FilledSmallSquare = \"\\u25FC\";\nvar FilledVerySmallSquare = \"\\u25AA\";\nvar fjlig = \"fj\";\nvar flat = \"\\u266D\";\nvar fllig = \"\\uFB02\";\nvar fltns = \"\\u25B1\";\nvar fnof = \"\\u0192\";\nvar Fopf = \"\\u{1D53D}\";\nvar fopf = \"\\u{1D557}\";\nvar forall = \"\\u2200\";\nvar ForAll = \"\\u2200\";\nvar fork = \"\\u22D4\";\nvar forkv = \"\\u2AD9\";\nvar Fouriertrf = \"\\u2131\";\nvar fpartint = \"\\u2A0D\";\nvar frac12$1 = \"\\xBD\";\nvar frac13 = \"\\u2153\";\nvar frac14$1 = \"\\xBC\";\nvar frac15 = \"\\u2155\";\nvar frac16 = \"\\u2159\";\nvar frac18 = \"\\u215B\";\nvar frac23 = \"\\u2154\";\nvar frac25 = \"\\u2156\";\nvar frac34$1 = \"\\xBE\";\nvar frac35 = \"\\u2157\";\nvar frac38 = \"\\u215C\";\nvar frac45 = \"\\u2158\";\nvar frac56 = \"\\u215A\";\nvar frac58 = \"\\u215D\";\nvar frac78 = \"\\u215E\";\nvar frasl = \"\\u2044\";\nvar frown = \"\\u2322\";\nvar fscr = \"\\u{1D4BB}\";\nvar Fscr = \"\\u2131\";\nvar gacute = \"\\u01F5\";\nvar Gamma = \"\\u0393\";\nvar gamma = \"\\u03B3\";\nvar Gammad = \"\\u03DC\";\nvar gammad = \"\\u03DD\";\nvar gap = \"\\u2A86\";\nvar Gbreve = \"\\u011E\";\nvar gbreve = \"\\u011F\";\nvar Gcedil = \"\\u0122\";\nvar Gcirc = \"\\u011C\";\nvar gcirc = \"\\u011D\";\nvar Gcy = \"\\u0413\";\nvar gcy = \"\\u0433\";\nvar Gdot = \"\\u0120\";\nvar gdot = \"\\u0121\";\nvar ge = \"\\u2265\";\nvar gE = \"\\u2267\";\nvar gEl = \"\\u2A8C\";\nvar gel = \"\\u22DB\";\nvar geq = \"\\u2265\";\nvar geqq = \"\\u2267\";\nvar geqslant = \"\\u2A7E\";\nvar gescc = \"\\u2AA9\";\nvar ges = \"\\u2A7E\";\nvar gesdot = \"\\u2A80\";\nvar gesdoto = \"\\u2A82\";\nvar gesdotol = \"\\u2A84\";\nvar gesl = \"\\u22DB\\uFE00\";\nvar gesles = \"\\u2A94\";\nvar Gfr = \"\\u{1D50A}\";\nvar gfr = \"\\u{1D524}\";\nvar gg = \"\\u226B\";\nvar Gg = \"\\u22D9\";\nvar ggg = \"\\u22D9\";\nvar gimel = \"\\u2137\";\nvar GJcy = \"\\u0403\";\nvar gjcy = \"\\u0453\";\nvar gla = \"\\u2AA5\";\nvar gl = \"\\u2277\";\nvar glE = \"\\u2A92\";\nvar glj = \"\\u2AA4\";\nvar gnap = \"\\u2A8A\";\nvar gnapprox = \"\\u2A8A\";\nvar gne = \"\\u2A88\";\nvar gnE = \"\\u2269\";\nvar gneq = \"\\u2A88\";\nvar gneqq = \"\\u2269\";\nvar gnsim = \"\\u22E7\";\nvar Gopf = \"\\u{1D53E}\";\nvar gopf = \"\\u{1D558}\";\nvar grave = \"`\";\nvar GreaterEqual = \"\\u2265\";\nvar GreaterEqualLess = \"\\u22DB\";\nvar GreaterFullEqual = \"\\u2267\";\nvar GreaterGreater = \"\\u2AA2\";\nvar GreaterLess = \"\\u2277\";\nvar GreaterSlantEqual = \"\\u2A7E\";\nvar GreaterTilde = \"\\u2273\";\nvar Gscr = \"\\u{1D4A2}\";\nvar gscr = \"\\u210A\";\nvar gsim = \"\\u2273\";\nvar gsime = \"\\u2A8E\";\nvar gsiml = \"\\u2A90\";\nvar gtcc = \"\\u2AA7\";\nvar gtcir = \"\\u2A7A\";\nvar gt$2 = \">\";\nvar GT$1 = \">\";\nvar Gt = \"\\u226B\";\nvar gtdot = \"\\u22D7\";\nvar gtlPar = \"\\u2995\";\nvar gtquest = \"\\u2A7C\";\nvar gtrapprox = \"\\u2A86\";\nvar gtrarr = \"\\u2978\";\nvar gtrdot = \"\\u22D7\";\nvar gtreqless = \"\\u22DB\";\nvar gtreqqless = \"\\u2A8C\";\nvar gtrless = \"\\u2277\";\nvar gtrsim = \"\\u2273\";\nvar gvertneqq = \"\\u2269\\uFE00\";\nvar gvnE = \"\\u2269\\uFE00\";\nvar Hacek = \"\\u02C7\";\nvar hairsp = \"\\u200A\";\nvar half = \"\\xBD\";\nvar hamilt = \"\\u210B\";\nvar HARDcy = \"\\u042A\";\nvar hardcy = \"\\u044A\";\nvar harrcir = \"\\u2948\";\nvar harr = \"\\u2194\";\nvar hArr = \"\\u21D4\";\nvar harrw = \"\\u21AD\";\nvar Hat = \"^\";\nvar hbar = \"\\u210F\";\nvar Hcirc = \"\\u0124\";\nvar hcirc = \"\\u0125\";\nvar hearts = \"\\u2665\";\nvar heartsuit = \"\\u2665\";\nvar hellip = \"\\u2026\";\nvar hercon = \"\\u22B9\";\nvar hfr = \"\\u{1D525}\";\nvar Hfr = \"\\u210C\";\nvar HilbertSpace = \"\\u210B\";\nvar hksearow = \"\\u2925\";\nvar hkswarow = \"\\u2926\";\nvar hoarr = \"\\u21FF\";\nvar homtht = \"\\u223B\";\nvar hookleftarrow = \"\\u21A9\";\nvar hookrightarrow = \"\\u21AA\";\nvar hopf = \"\\u{1D559}\";\nvar Hopf = \"\\u210D\";\nvar horbar = \"\\u2015\";\nvar HorizontalLine = \"\\u2500\";\nvar hscr = \"\\u{1D4BD}\";\nvar Hscr = \"\\u210B\";\nvar hslash = \"\\u210F\";\nvar Hstrok = \"\\u0126\";\nvar hstrok = \"\\u0127\";\nvar HumpDownHump = \"\\u224E\";\nvar HumpEqual = \"\\u224F\";\nvar hybull = \"\\u2043\";\nvar hyphen = \"\\u2010\";\nvar Iacute$1 = \"\\xCD\";\nvar iacute$1 = \"\\xED\";\nvar ic = \"\\u2063\";\nvar Icirc$1 = \"\\xCE\";\nvar icirc$1 = \"\\xEE\";\nvar Icy = \"\\u0418\";\nvar icy = \"\\u0438\";\nvar Idot = \"\\u0130\";\nvar IEcy = \"\\u0415\";\nvar iecy = \"\\u0435\";\nvar iexcl$1 = \"\\xA1\";\nvar iff = \"\\u21D4\";\nvar ifr = \"\\u{1D526}\";\nvar Ifr = \"\\u2111\";\nvar Igrave$1 = \"\\xCC\";\nvar igrave$1 = \"\\xEC\";\nvar ii = \"\\u2148\";\nvar iiiint = \"\\u2A0C\";\nvar iiint = \"\\u222D\";\nvar iinfin = \"\\u29DC\";\nvar iiota = \"\\u2129\";\nvar IJlig = \"\\u0132\";\nvar ijlig = \"\\u0133\";\nvar Imacr = \"\\u012A\";\nvar imacr = \"\\u012B\";\nvar image = \"\\u2111\";\nvar ImaginaryI = \"\\u2148\";\nvar imagline = \"\\u2110\";\nvar imagpart = \"\\u2111\";\nvar imath = \"\\u0131\";\nvar Im = \"\\u2111\";\nvar imof = \"\\u22B7\";\nvar imped = \"\\u01B5\";\nvar Implies = \"\\u21D2\";\nvar incare = \"\\u2105\";\nvar infin = \"\\u221E\";\nvar infintie = \"\\u29DD\";\nvar inodot = \"\\u0131\";\nvar intcal = \"\\u22BA\";\nvar int = \"\\u222B\";\nvar Int = \"\\u222C\";\nvar integers = \"\\u2124\";\nvar Integral = \"\\u222B\";\nvar intercal = \"\\u22BA\";\nvar Intersection = \"\\u22C2\";\nvar intlarhk = \"\\u2A17\";\nvar intprod = \"\\u2A3C\";\nvar InvisibleComma = \"\\u2063\";\nvar InvisibleTimes = \"\\u2062\";\nvar IOcy = \"\\u0401\";\nvar iocy = \"\\u0451\";\nvar Iogon = \"\\u012E\";\nvar iogon = \"\\u012F\";\nvar Iopf = \"\\u{1D540}\";\nvar iopf = \"\\u{1D55A}\";\nvar Iota = \"\\u0399\";\nvar iota = \"\\u03B9\";\nvar iprod = \"\\u2A3C\";\nvar iquest$1 = \"\\xBF\";\nvar iscr = \"\\u{1D4BE}\";\nvar Iscr = \"\\u2110\";\nvar isin = \"\\u2208\";\nvar isindot = \"\\u22F5\";\nvar isinE = \"\\u22F9\";\nvar isins = \"\\u22F4\";\nvar isinsv = \"\\u22F3\";\nvar isinv = \"\\u2208\";\nvar it = \"\\u2062\";\nvar Itilde = \"\\u0128\";\nvar itilde = \"\\u0129\";\nvar Iukcy = \"\\u0406\";\nvar iukcy = \"\\u0456\";\nvar Iuml$1 = \"\\xCF\";\nvar iuml$1 = \"\\xEF\";\nvar Jcirc = \"\\u0134\";\nvar jcirc = \"\\u0135\";\nvar Jcy = \"\\u0419\";\nvar jcy = \"\\u0439\";\nvar Jfr = \"\\u{1D50D}\";\nvar jfr = \"\\u{1D527}\";\nvar jmath = \"\\u0237\";\nvar Jopf = \"\\u{1D541}\";\nvar jopf = \"\\u{1D55B}\";\nvar Jscr = \"\\u{1D4A5}\";\nvar jscr = \"\\u{1D4BF}\";\nvar Jsercy = \"\\u0408\";\nvar jsercy = \"\\u0458\";\nvar Jukcy = \"\\u0404\";\nvar jukcy = \"\\u0454\";\nvar Kappa = \"\\u039A\";\nvar kappa = \"\\u03BA\";\nvar kappav = \"\\u03F0\";\nvar Kcedil = \"\\u0136\";\nvar kcedil = \"\\u0137\";\nvar Kcy = \"\\u041A\";\nvar kcy = \"\\u043A\";\nvar Kfr = \"\\u{1D50E}\";\nvar kfr = \"\\u{1D528}\";\nvar kgreen = \"\\u0138\";\nvar KHcy = \"\\u0425\";\nvar khcy = \"\\u0445\";\nvar KJcy = \"\\u040C\";\nvar kjcy = \"\\u045C\";\nvar Kopf = \"\\u{1D542}\";\nvar kopf = \"\\u{1D55C}\";\nvar Kscr = \"\\u{1D4A6}\";\nvar kscr = \"\\u{1D4C0}\";\nvar lAarr = \"\\u21DA\";\nvar Lacute = \"\\u0139\";\nvar lacute = \"\\u013A\";\nvar laemptyv = \"\\u29B4\";\nvar lagran = \"\\u2112\";\nvar Lambda = \"\\u039B\";\nvar lambda = \"\\u03BB\";\nvar lang = \"\\u27E8\";\nvar Lang = \"\\u27EA\";\nvar langd = \"\\u2991\";\nvar langle = \"\\u27E8\";\nvar lap = \"\\u2A85\";\nvar Laplacetrf = \"\\u2112\";\nvar laquo$1 = \"\\xAB\";\nvar larrb = \"\\u21E4\";\nvar larrbfs = \"\\u291F\";\nvar larr = \"\\u2190\";\nvar Larr = \"\\u219E\";\nvar lArr = \"\\u21D0\";\nvar larrfs = \"\\u291D\";\nvar larrhk = \"\\u21A9\";\nvar larrlp = \"\\u21AB\";\nvar larrpl = \"\\u2939\";\nvar larrsim = \"\\u2973\";\nvar larrtl = \"\\u21A2\";\nvar latail = \"\\u2919\";\nvar lAtail = \"\\u291B\";\nvar lat = \"\\u2AAB\";\nvar late = \"\\u2AAD\";\nvar lates = \"\\u2AAD\\uFE00\";\nvar lbarr = \"\\u290C\";\nvar lBarr = \"\\u290E\";\nvar lbbrk = \"\\u2772\";\nvar lbrace = \"{\";\nvar lbrack = \"[\";\nvar lbrke = \"\\u298B\";\nvar lbrksld = \"\\u298F\";\nvar lbrkslu = \"\\u298D\";\nvar Lcaron = \"\\u013D\";\nvar lcaron = \"\\u013E\";\nvar Lcedil = \"\\u013B\";\nvar lcedil = \"\\u013C\";\nvar lceil = \"\\u2308\";\nvar lcub = \"{\";\nvar Lcy = \"\\u041B\";\nvar lcy = \"\\u043B\";\nvar ldca = \"\\u2936\";\nvar ldquo = \"\\u201C\";\nvar ldquor = \"\\u201E\";\nvar ldrdhar = \"\\u2967\";\nvar ldrushar = \"\\u294B\";\nvar ldsh = \"\\u21B2\";\nvar le = \"\\u2264\";\nvar lE = \"\\u2266\";\nvar LeftAngleBracket = \"\\u27E8\";\nvar LeftArrowBar = \"\\u21E4\";\nvar leftarrow = \"\\u2190\";\nvar LeftArrow = \"\\u2190\";\nvar Leftarrow = \"\\u21D0\";\nvar LeftArrowRightArrow = \"\\u21C6\";\nvar leftarrowtail = \"\\u21A2\";\nvar LeftCeiling = \"\\u2308\";\nvar LeftDoubleBracket = \"\\u27E6\";\nvar LeftDownTeeVector = \"\\u2961\";\nvar LeftDownVectorBar = \"\\u2959\";\nvar LeftDownVector = \"\\u21C3\";\nvar LeftFloor = \"\\u230A\";\nvar leftharpoondown = \"\\u21BD\";\nvar leftharpoonup = \"\\u21BC\";\nvar leftleftarrows = \"\\u21C7\";\nvar leftrightarrow = \"\\u2194\";\nvar LeftRightArrow = \"\\u2194\";\nvar Leftrightarrow = \"\\u21D4\";\nvar leftrightarrows = \"\\u21C6\";\nvar leftrightharpoons = \"\\u21CB\";\nvar leftrightsquigarrow = \"\\u21AD\";\nvar LeftRightVector = \"\\u294E\";\nvar LeftTeeArrow = \"\\u21A4\";\nvar LeftTee = \"\\u22A3\";\nvar LeftTeeVector = \"\\u295A\";\nvar leftthreetimes = \"\\u22CB\";\nvar LeftTriangleBar = \"\\u29CF\";\nvar LeftTriangle = \"\\u22B2\";\nvar LeftTriangleEqual = \"\\u22B4\";\nvar LeftUpDownVector = \"\\u2951\";\nvar LeftUpTeeVector = \"\\u2960\";\nvar LeftUpVectorBar = \"\\u2958\";\nvar LeftUpVector = \"\\u21BF\";\nvar LeftVectorBar = \"\\u2952\";\nvar LeftVector = \"\\u21BC\";\nvar lEg = \"\\u2A8B\";\nvar leg = \"\\u22DA\";\nvar leq = \"\\u2264\";\nvar leqq = \"\\u2266\";\nvar leqslant = \"\\u2A7D\";\nvar lescc = \"\\u2AA8\";\nvar les = \"\\u2A7D\";\nvar lesdot = \"\\u2A7F\";\nvar lesdoto = \"\\u2A81\";\nvar lesdotor = \"\\u2A83\";\nvar lesg = \"\\u22DA\\uFE00\";\nvar lesges = \"\\u2A93\";\nvar lessapprox = \"\\u2A85\";\nvar lessdot = \"\\u22D6\";\nvar lesseqgtr = \"\\u22DA\";\nvar lesseqqgtr = \"\\u2A8B\";\nvar LessEqualGreater = \"\\u22DA\";\nvar LessFullEqual = \"\\u2266\";\nvar LessGreater = \"\\u2276\";\nvar lessgtr = \"\\u2276\";\nvar LessLess = \"\\u2AA1\";\nvar lesssim = \"\\u2272\";\nvar LessSlantEqual = \"\\u2A7D\";\nvar LessTilde = \"\\u2272\";\nvar lfisht = \"\\u297C\";\nvar lfloor = \"\\u230A\";\nvar Lfr = \"\\u{1D50F}\";\nvar lfr = \"\\u{1D529}\";\nvar lg = \"\\u2276\";\nvar lgE = \"\\u2A91\";\nvar lHar = \"\\u2962\";\nvar lhard = \"\\u21BD\";\nvar lharu = \"\\u21BC\";\nvar lharul = \"\\u296A\";\nvar lhblk = \"\\u2584\";\nvar LJcy = \"\\u0409\";\nvar ljcy = \"\\u0459\";\nvar llarr = \"\\u21C7\";\nvar ll = \"\\u226A\";\nvar Ll = \"\\u22D8\";\nvar llcorner = \"\\u231E\";\nvar Lleftarrow = \"\\u21DA\";\nvar llhard = \"\\u296B\";\nvar lltri = \"\\u25FA\";\nvar Lmidot = \"\\u013F\";\nvar lmidot = \"\\u0140\";\nvar lmoustache = \"\\u23B0\";\nvar lmoust = \"\\u23B0\";\nvar lnap = \"\\u2A89\";\nvar lnapprox = \"\\u2A89\";\nvar lne = \"\\u2A87\";\nvar lnE = \"\\u2268\";\nvar lneq = \"\\u2A87\";\nvar lneqq = \"\\u2268\";\nvar lnsim = \"\\u22E6\";\nvar loang = \"\\u27EC\";\nvar loarr = \"\\u21FD\";\nvar lobrk = \"\\u27E6\";\nvar longleftarrow = \"\\u27F5\";\nvar LongLeftArrow = \"\\u27F5\";\nvar Longleftarrow = \"\\u27F8\";\nvar longleftrightarrow = \"\\u27F7\";\nvar LongLeftRightArrow = \"\\u27F7\";\nvar Longleftrightarrow = \"\\u27FA\";\nvar longmapsto = \"\\u27FC\";\nvar longrightarrow = \"\\u27F6\";\nvar LongRightArrow = \"\\u27F6\";\nvar Longrightarrow = \"\\u27F9\";\nvar looparrowleft = \"\\u21AB\";\nvar looparrowright = \"\\u21AC\";\nvar lopar = \"\\u2985\";\nvar Lopf = \"\\u{1D543}\";\nvar lopf = \"\\u{1D55D}\";\nvar loplus = \"\\u2A2D\";\nvar lotimes = \"\\u2A34\";\nvar lowast = \"\\u2217\";\nvar lowbar = \"_\";\nvar LowerLeftArrow = \"\\u2199\";\nvar LowerRightArrow = \"\\u2198\";\nvar loz = \"\\u25CA\";\nvar lozenge = \"\\u25CA\";\nvar lozf = \"\\u29EB\";\nvar lpar = \"(\";\nvar lparlt = \"\\u2993\";\nvar lrarr = \"\\u21C6\";\nvar lrcorner = \"\\u231F\";\nvar lrhar = \"\\u21CB\";\nvar lrhard = \"\\u296D\";\nvar lrm = \"\\u200E\";\nvar lrtri = \"\\u22BF\";\nvar lsaquo = \"\\u2039\";\nvar lscr = \"\\u{1D4C1}\";\nvar Lscr = \"\\u2112\";\nvar lsh = \"\\u21B0\";\nvar Lsh = \"\\u21B0\";\nvar lsim = \"\\u2272\";\nvar lsime = \"\\u2A8D\";\nvar lsimg = \"\\u2A8F\";\nvar lsqb = \"[\";\nvar lsquo = \"\\u2018\";\nvar lsquor = \"\\u201A\";\nvar Lstrok = \"\\u0141\";\nvar lstrok = \"\\u0142\";\nvar ltcc = \"\\u2AA6\";\nvar ltcir = \"\\u2A79\";\nvar lt$2 = \"<\";\nvar LT$1 = \"<\";\nvar Lt = \"\\u226A\";\nvar ltdot = \"\\u22D6\";\nvar lthree = \"\\u22CB\";\nvar ltimes = \"\\u22C9\";\nvar ltlarr = \"\\u2976\";\nvar ltquest = \"\\u2A7B\";\nvar ltri = \"\\u25C3\";\nvar ltrie = \"\\u22B4\";\nvar ltrif = \"\\u25C2\";\nvar ltrPar = \"\\u2996\";\nvar lurdshar = \"\\u294A\";\nvar luruhar = \"\\u2966\";\nvar lvertneqq = \"\\u2268\\uFE00\";\nvar lvnE = \"\\u2268\\uFE00\";\nvar macr$1 = \"\\xAF\";\nvar male = \"\\u2642\";\nvar malt = \"\\u2720\";\nvar maltese = \"\\u2720\";\nvar map = \"\\u21A6\";\nvar mapsto = \"\\u21A6\";\nvar mapstodown = \"\\u21A7\";\nvar mapstoleft = \"\\u21A4\";\nvar mapstoup = \"\\u21A5\";\nvar marker = \"\\u25AE\";\nvar mcomma = \"\\u2A29\";\nvar Mcy = \"\\u041C\";\nvar mcy = \"\\u043C\";\nvar mdash = \"\\u2014\";\nvar mDDot = \"\\u223A\";\nvar measuredangle = \"\\u2221\";\nvar MediumSpace = \"\\u205F\";\nvar Mellintrf = \"\\u2133\";\nvar Mfr = \"\\u{1D510}\";\nvar mfr = \"\\u{1D52A}\";\nvar mho = \"\\u2127\";\nvar micro$1 = \"\\xB5\";\nvar midast = \"*\";\nvar midcir = \"\\u2AF0\";\nvar mid = \"\\u2223\";\nvar middot$1 = \"\\xB7\";\nvar minusb = \"\\u229F\";\nvar minus = \"\\u2212\";\nvar minusd = \"\\u2238\";\nvar minusdu = \"\\u2A2A\";\nvar MinusPlus = \"\\u2213\";\nvar mlcp = \"\\u2ADB\";\nvar mldr = \"\\u2026\";\nvar mnplus = \"\\u2213\";\nvar models = \"\\u22A7\";\nvar Mopf = \"\\u{1D544}\";\nvar mopf = \"\\u{1D55E}\";\nvar mp = \"\\u2213\";\nvar mscr = \"\\u{1D4C2}\";\nvar Mscr = \"\\u2133\";\nvar mstpos = \"\\u223E\";\nvar Mu = \"\\u039C\";\nvar mu = \"\\u03BC\";\nvar multimap = \"\\u22B8\";\nvar mumap = \"\\u22B8\";\nvar nabla = \"\\u2207\";\nvar Nacute = \"\\u0143\";\nvar nacute = \"\\u0144\";\nvar nang = \"\\u2220\\u20D2\";\nvar nap = \"\\u2249\";\nvar napE = \"\\u2A70\\u0338\";\nvar napid = \"\\u224B\\u0338\";\nvar napos = \"\\u0149\";\nvar napprox = \"\\u2249\";\nvar natural = \"\\u266E\";\nvar naturals = \"\\u2115\";\nvar natur = \"\\u266E\";\nvar nbsp$1 = \"\\xA0\";\nvar nbump = \"\\u224E\\u0338\";\nvar nbumpe = \"\\u224F\\u0338\";\nvar ncap = \"\\u2A43\";\nvar Ncaron = \"\\u0147\";\nvar ncaron = \"\\u0148\";\nvar Ncedil = \"\\u0145\";\nvar ncedil = \"\\u0146\";\nvar ncong = \"\\u2247\";\nvar ncongdot = \"\\u2A6D\\u0338\";\nvar ncup = \"\\u2A42\";\nvar Ncy = \"\\u041D\";\nvar ncy = \"\\u043D\";\nvar ndash = \"\\u2013\";\nvar nearhk = \"\\u2924\";\nvar nearr = \"\\u2197\";\nvar neArr = \"\\u21D7\";\nvar nearrow = \"\\u2197\";\nvar ne = \"\\u2260\";\nvar nedot = \"\\u2250\\u0338\";\nvar NegativeMediumSpace = \"\\u200B\";\nvar NegativeThickSpace = \"\\u200B\";\nvar NegativeThinSpace = \"\\u200B\";\nvar NegativeVeryThinSpace = \"\\u200B\";\nvar nequiv = \"\\u2262\";\nvar nesear = \"\\u2928\";\nvar nesim = \"\\u2242\\u0338\";\nvar NestedGreaterGreater = \"\\u226B\";\nvar NestedLessLess = \"\\u226A\";\nvar NewLine = \"\\n\";\nvar nexist = \"\\u2204\";\nvar nexists = \"\\u2204\";\nvar Nfr = \"\\u{1D511}\";\nvar nfr = \"\\u{1D52B}\";\nvar ngE = \"\\u2267\\u0338\";\nvar nge = \"\\u2271\";\nvar ngeq = \"\\u2271\";\nvar ngeqq = \"\\u2267\\u0338\";\nvar ngeqslant = \"\\u2A7E\\u0338\";\nvar nges = \"\\u2A7E\\u0338\";\nvar nGg = \"\\u22D9\\u0338\";\nvar ngsim = \"\\u2275\";\nvar nGt = \"\\u226B\\u20D2\";\nvar ngt = \"\\u226F\";\nvar ngtr = \"\\u226F\";\nvar nGtv = \"\\u226B\\u0338\";\nvar nharr = \"\\u21AE\";\nvar nhArr = \"\\u21CE\";\nvar nhpar = \"\\u2AF2\";\nvar ni = \"\\u220B\";\nvar nis = \"\\u22FC\";\nvar nisd = \"\\u22FA\";\nvar niv = \"\\u220B\";\nvar NJcy = \"\\u040A\";\nvar njcy = \"\\u045A\";\nvar nlarr = \"\\u219A\";\nvar nlArr = \"\\u21CD\";\nvar nldr = \"\\u2025\";\nvar nlE = \"\\u2266\\u0338\";\nvar nle = \"\\u2270\";\nvar nleftarrow = \"\\u219A\";\nvar nLeftarrow = \"\\u21CD\";\nvar nleftrightarrow = \"\\u21AE\";\nvar nLeftrightarrow = \"\\u21CE\";\nvar nleq = \"\\u2270\";\nvar nleqq = \"\\u2266\\u0338\";\nvar nleqslant = \"\\u2A7D\\u0338\";\nvar nles = \"\\u2A7D\\u0338\";\nvar nless = \"\\u226E\";\nvar nLl = \"\\u22D8\\u0338\";\nvar nlsim = \"\\u2274\";\nvar nLt = \"\\u226A\\u20D2\";\nvar nlt = \"\\u226E\";\nvar nltri = \"\\u22EA\";\nvar nltrie = \"\\u22EC\";\nvar nLtv = \"\\u226A\\u0338\";\nvar nmid = \"\\u2224\";\nvar NoBreak = \"\\u2060\";\nvar NonBreakingSpace = \"\\xA0\";\nvar nopf = \"\\u{1D55F}\";\nvar Nopf = \"\\u2115\";\nvar Not = \"\\u2AEC\";\nvar not$1 = \"\\xAC\";\nvar NotCongruent = \"\\u2262\";\nvar NotCupCap = \"\\u226D\";\nvar NotDoubleVerticalBar = \"\\u2226\";\nvar NotElement = \"\\u2209\";\nvar NotEqual = \"\\u2260\";\nvar NotEqualTilde = \"\\u2242\\u0338\";\nvar NotExists = \"\\u2204\";\nvar NotGreater = \"\\u226F\";\nvar NotGreaterEqual = \"\\u2271\";\nvar NotGreaterFullEqual = \"\\u2267\\u0338\";\nvar NotGreaterGreater = \"\\u226B\\u0338\";\nvar NotGreaterLess = \"\\u2279\";\nvar NotGreaterSlantEqual = \"\\u2A7E\\u0338\";\nvar NotGreaterTilde = \"\\u2275\";\nvar NotHumpDownHump = \"\\u224E\\u0338\";\nvar NotHumpEqual = \"\\u224F\\u0338\";\nvar notin = \"\\u2209\";\nvar notindot = \"\\u22F5\\u0338\";\nvar notinE = \"\\u22F9\\u0338\";\nvar notinva = \"\\u2209\";\nvar notinvb = \"\\u22F7\";\nvar notinvc = \"\\u22F6\";\nvar NotLeftTriangleBar = \"\\u29CF\\u0338\";\nvar NotLeftTriangle = \"\\u22EA\";\nvar NotLeftTriangleEqual = \"\\u22EC\";\nvar NotLess = \"\\u226E\";\nvar NotLessEqual = \"\\u2270\";\nvar NotLessGreater = \"\\u2278\";\nvar NotLessLess = \"\\u226A\\u0338\";\nvar NotLessSlantEqual = \"\\u2A7D\\u0338\";\nvar NotLessTilde = \"\\u2274\";\nvar NotNestedGreaterGreater = \"\\u2AA2\\u0338\";\nvar NotNestedLessLess = \"\\u2AA1\\u0338\";\nvar notni = \"\\u220C\";\nvar notniva = \"\\u220C\";\nvar notnivb = \"\\u22FE\";\nvar notnivc = \"\\u22FD\";\nvar NotPrecedes = \"\\u2280\";\nvar NotPrecedesEqual = \"\\u2AAF\\u0338\";\nvar NotPrecedesSlantEqual = \"\\u22E0\";\nvar NotReverseElement = \"\\u220C\";\nvar NotRightTriangleBar = \"\\u29D0\\u0338\";\nvar NotRightTriangle = \"\\u22EB\";\nvar NotRightTriangleEqual = \"\\u22ED\";\nvar NotSquareSubset = \"\\u228F\\u0338\";\nvar NotSquareSubsetEqual = \"\\u22E2\";\nvar NotSquareSuperset = \"\\u2290\\u0338\";\nvar NotSquareSupersetEqual = \"\\u22E3\";\nvar NotSubset = \"\\u2282\\u20D2\";\nvar NotSubsetEqual = \"\\u2288\";\nvar NotSucceeds = \"\\u2281\";\nvar NotSucceedsEqual = \"\\u2AB0\\u0338\";\nvar NotSucceedsSlantEqual = \"\\u22E1\";\nvar NotSucceedsTilde = \"\\u227F\\u0338\";\nvar NotSuperset = \"\\u2283\\u20D2\";\nvar NotSupersetEqual = \"\\u2289\";\nvar NotTilde = \"\\u2241\";\nvar NotTildeEqual = \"\\u2244\";\nvar NotTildeFullEqual = \"\\u2247\";\nvar NotTildeTilde = \"\\u2249\";\nvar NotVerticalBar = \"\\u2224\";\nvar nparallel = \"\\u2226\";\nvar npar = \"\\u2226\";\nvar nparsl = \"\\u2AFD\\u20E5\";\nvar npart = \"\\u2202\\u0338\";\nvar npolint = \"\\u2A14\";\nvar npr = \"\\u2280\";\nvar nprcue = \"\\u22E0\";\nvar nprec = \"\\u2280\";\nvar npreceq = \"\\u2AAF\\u0338\";\nvar npre = \"\\u2AAF\\u0338\";\nvar nrarrc = \"\\u2933\\u0338\";\nvar nrarr = \"\\u219B\";\nvar nrArr = \"\\u21CF\";\nvar nrarrw = \"\\u219D\\u0338\";\nvar nrightarrow = \"\\u219B\";\nvar nRightarrow = \"\\u21CF\";\nvar nrtri = \"\\u22EB\";\nvar nrtrie = \"\\u22ED\";\nvar nsc = \"\\u2281\";\nvar nsccue = \"\\u22E1\";\nvar nsce = \"\\u2AB0\\u0338\";\nvar Nscr = \"\\u{1D4A9}\";\nvar nscr = \"\\u{1D4C3}\";\nvar nshortmid = \"\\u2224\";\nvar nshortparallel = \"\\u2226\";\nvar nsim = \"\\u2241\";\nvar nsime = \"\\u2244\";\nvar nsimeq = \"\\u2244\";\nvar nsmid = \"\\u2224\";\nvar nspar = \"\\u2226\";\nvar nsqsube = \"\\u22E2\";\nvar nsqsupe = \"\\u22E3\";\nvar nsub = \"\\u2284\";\nvar nsubE = \"\\u2AC5\\u0338\";\nvar nsube = \"\\u2288\";\nvar nsubset = \"\\u2282\\u20D2\";\nvar nsubseteq = \"\\u2288\";\nvar nsubseteqq = \"\\u2AC5\\u0338\";\nvar nsucc = \"\\u2281\";\nvar nsucceq = \"\\u2AB0\\u0338\";\nvar nsup = \"\\u2285\";\nvar nsupE = \"\\u2AC6\\u0338\";\nvar nsupe = \"\\u2289\";\nvar nsupset = \"\\u2283\\u20D2\";\nvar nsupseteq = \"\\u2289\";\nvar nsupseteqq = \"\\u2AC6\\u0338\";\nvar ntgl = \"\\u2279\";\nvar Ntilde$1 = \"\\xD1\";\nvar ntilde$1 = \"\\xF1\";\nvar ntlg = \"\\u2278\";\nvar ntriangleleft = \"\\u22EA\";\nvar ntrianglelefteq = \"\\u22EC\";\nvar ntriangleright = \"\\u22EB\";\nvar ntrianglerighteq = \"\\u22ED\";\nvar Nu = \"\\u039D\";\nvar nu = \"\\u03BD\";\nvar num = \"#\";\nvar numero = \"\\u2116\";\nvar numsp = \"\\u2007\";\nvar nvap = \"\\u224D\\u20D2\";\nvar nvdash = \"\\u22AC\";\nvar nvDash = \"\\u22AD\";\nvar nVdash = \"\\u22AE\";\nvar nVDash = \"\\u22AF\";\nvar nvge = \"\\u2265\\u20D2\";\nvar nvgt = \">\\u20D2\";\nvar nvHarr = \"\\u2904\";\nvar nvinfin = \"\\u29DE\";\nvar nvlArr = \"\\u2902\";\nvar nvle = \"\\u2264\\u20D2\";\nvar nvlt = \"<\\u20D2\";\nvar nvltrie = \"\\u22B4\\u20D2\";\nvar nvrArr = \"\\u2903\";\nvar nvrtrie = \"\\u22B5\\u20D2\";\nvar nvsim = \"\\u223C\\u20D2\";\nvar nwarhk = \"\\u2923\";\nvar nwarr = \"\\u2196\";\nvar nwArr = \"\\u21D6\";\nvar nwarrow = \"\\u2196\";\nvar nwnear = \"\\u2927\";\nvar Oacute$1 = \"\\xD3\";\nvar oacute$1 = \"\\xF3\";\nvar oast = \"\\u229B\";\nvar Ocirc$1 = \"\\xD4\";\nvar ocirc$1 = \"\\xF4\";\nvar ocir = \"\\u229A\";\nvar Ocy = \"\\u041E\";\nvar ocy = \"\\u043E\";\nvar odash = \"\\u229D\";\nvar Odblac = \"\\u0150\";\nvar odblac = \"\\u0151\";\nvar odiv = \"\\u2A38\";\nvar odot = \"\\u2299\";\nvar odsold = \"\\u29BC\";\nvar OElig = \"\\u0152\";\nvar oelig = \"\\u0153\";\nvar ofcir = \"\\u29BF\";\nvar Ofr = \"\\u{1D512}\";\nvar ofr = \"\\u{1D52C}\";\nvar ogon = \"\\u02DB\";\nvar Ograve$1 = \"\\xD2\";\nvar ograve$1 = \"\\xF2\";\nvar ogt = \"\\u29C1\";\nvar ohbar = \"\\u29B5\";\nvar ohm = \"\\u03A9\";\nvar oint = \"\\u222E\";\nvar olarr = \"\\u21BA\";\nvar olcir = \"\\u29BE\";\nvar olcross = \"\\u29BB\";\nvar oline = \"\\u203E\";\nvar olt = \"\\u29C0\";\nvar Omacr = \"\\u014C\";\nvar omacr = \"\\u014D\";\nvar Omega = \"\\u03A9\";\nvar omega = \"\\u03C9\";\nvar Omicron = \"\\u039F\";\nvar omicron = \"\\u03BF\";\nvar omid = \"\\u29B6\";\nvar ominus = \"\\u2296\";\nvar Oopf = \"\\u{1D546}\";\nvar oopf = \"\\u{1D560}\";\nvar opar = \"\\u29B7\";\nvar OpenCurlyDoubleQuote = \"\\u201C\";\nvar OpenCurlyQuote = \"\\u2018\";\nvar operp = \"\\u29B9\";\nvar oplus = \"\\u2295\";\nvar orarr = \"\\u21BB\";\nvar Or = \"\\u2A54\";\nvar or = \"\\u2228\";\nvar ord = \"\\u2A5D\";\nvar order = \"\\u2134\";\nvar orderof = \"\\u2134\";\nvar ordf$1 = \"\\xAA\";\nvar ordm$1 = \"\\xBA\";\nvar origof = \"\\u22B6\";\nvar oror = \"\\u2A56\";\nvar orslope = \"\\u2A57\";\nvar orv = \"\\u2A5B\";\nvar oS = \"\\u24C8\";\nvar Oscr = \"\\u{1D4AA}\";\nvar oscr = \"\\u2134\";\nvar Oslash$1 = \"\\xD8\";\nvar oslash$1 = \"\\xF8\";\nvar osol = \"\\u2298\";\nvar Otilde$1 = \"\\xD5\";\nvar otilde$1 = \"\\xF5\";\nvar otimesas = \"\\u2A36\";\nvar Otimes = \"\\u2A37\";\nvar otimes = \"\\u2297\";\nvar Ouml$1 = \"\\xD6\";\nvar ouml$1 = \"\\xF6\";\nvar ovbar = \"\\u233D\";\nvar OverBar = \"\\u203E\";\nvar OverBrace = \"\\u23DE\";\nvar OverBracket = \"\\u23B4\";\nvar OverParenthesis = \"\\u23DC\";\nvar para$1 = \"\\xB6\";\nvar parallel = \"\\u2225\";\nvar par = \"\\u2225\";\nvar parsim = \"\\u2AF3\";\nvar parsl = \"\\u2AFD\";\nvar part = \"\\u2202\";\nvar PartialD = \"\\u2202\";\nvar Pcy = \"\\u041F\";\nvar pcy = \"\\u043F\";\nvar percnt = \"%\";\nvar period = \".\";\nvar permil = \"\\u2030\";\nvar perp = \"\\u22A5\";\nvar pertenk = \"\\u2031\";\nvar Pfr = \"\\u{1D513}\";\nvar pfr = \"\\u{1D52D}\";\nvar Phi = \"\\u03A6\";\nvar phi = \"\\u03C6\";\nvar phiv = \"\\u03D5\";\nvar phmmat = \"\\u2133\";\nvar phone = \"\\u260E\";\nvar Pi = \"\\u03A0\";\nvar pi = \"\\u03C0\";\nvar pitchfork = \"\\u22D4\";\nvar piv = \"\\u03D6\";\nvar planck = \"\\u210F\";\nvar planckh = \"\\u210E\";\nvar plankv = \"\\u210F\";\nvar plusacir = \"\\u2A23\";\nvar plusb = \"\\u229E\";\nvar pluscir = \"\\u2A22\";\nvar plus = \"+\";\nvar plusdo = \"\\u2214\";\nvar plusdu = \"\\u2A25\";\nvar pluse = \"\\u2A72\";\nvar PlusMinus = \"\\xB1\";\nvar plusmn$1 = \"\\xB1\";\nvar plussim = \"\\u2A26\";\nvar plustwo = \"\\u2A27\";\nvar pm = \"\\xB1\";\nvar Poincareplane = \"\\u210C\";\nvar pointint = \"\\u2A15\";\nvar popf = \"\\u{1D561}\";\nvar Popf = \"\\u2119\";\nvar pound$1 = \"\\xA3\";\nvar prap = \"\\u2AB7\";\nvar Pr = \"\\u2ABB\";\nvar pr = \"\\u227A\";\nvar prcue = \"\\u227C\";\nvar precapprox = \"\\u2AB7\";\nvar prec = \"\\u227A\";\nvar preccurlyeq = \"\\u227C\";\nvar Precedes = \"\\u227A\";\nvar PrecedesEqual = \"\\u2AAF\";\nvar PrecedesSlantEqual = \"\\u227C\";\nvar PrecedesTilde = \"\\u227E\";\nvar preceq = \"\\u2AAF\";\nvar precnapprox = \"\\u2AB9\";\nvar precneqq = \"\\u2AB5\";\nvar precnsim = \"\\u22E8\";\nvar pre = \"\\u2AAF\";\nvar prE = \"\\u2AB3\";\nvar precsim = \"\\u227E\";\nvar prime = \"\\u2032\";\nvar Prime = \"\\u2033\";\nvar primes = \"\\u2119\";\nvar prnap = \"\\u2AB9\";\nvar prnE = \"\\u2AB5\";\nvar prnsim = \"\\u22E8\";\nvar prod = \"\\u220F\";\nvar Product = \"\\u220F\";\nvar profalar = \"\\u232E\";\nvar profline = \"\\u2312\";\nvar profsurf = \"\\u2313\";\nvar prop = \"\\u221D\";\nvar Proportional = \"\\u221D\";\nvar Proportion = \"\\u2237\";\nvar propto = \"\\u221D\";\nvar prsim = \"\\u227E\";\nvar prurel = \"\\u22B0\";\nvar Pscr = \"\\u{1D4AB}\";\nvar pscr = \"\\u{1D4C5}\";\nvar Psi = \"\\u03A8\";\nvar psi = \"\\u03C8\";\nvar puncsp = \"\\u2008\";\nvar Qfr = \"\\u{1D514}\";\nvar qfr = \"\\u{1D52E}\";\nvar qint = \"\\u2A0C\";\nvar qopf = \"\\u{1D562}\";\nvar Qopf = \"\\u211A\";\nvar qprime = \"\\u2057\";\nvar Qscr = \"\\u{1D4AC}\";\nvar qscr = \"\\u{1D4C6}\";\nvar quaternions = \"\\u210D\";\nvar quatint = \"\\u2A16\";\nvar quest = \"?\";\nvar questeq = \"\\u225F\";\nvar quot$2 = '\"';\nvar QUOT$1 = '\"';\nvar rAarr = \"\\u21DB\";\nvar race = \"\\u223D\\u0331\";\nvar Racute = \"\\u0154\";\nvar racute = \"\\u0155\";\nvar radic = \"\\u221A\";\nvar raemptyv = \"\\u29B3\";\nvar rang = \"\\u27E9\";\nvar Rang = \"\\u27EB\";\nvar rangd = \"\\u2992\";\nvar range = \"\\u29A5\";\nvar rangle = \"\\u27E9\";\nvar raquo$1 = \"\\xBB\";\nvar rarrap = \"\\u2975\";\nvar rarrb = \"\\u21E5\";\nvar rarrbfs = \"\\u2920\";\nvar rarrc = \"\\u2933\";\nvar rarr = \"\\u2192\";\nvar Rarr = \"\\u21A0\";\nvar rArr = \"\\u21D2\";\nvar rarrfs = \"\\u291E\";\nvar rarrhk = \"\\u21AA\";\nvar rarrlp = \"\\u21AC\";\nvar rarrpl = \"\\u2945\";\nvar rarrsim = \"\\u2974\";\nvar Rarrtl = \"\\u2916\";\nvar rarrtl = \"\\u21A3\";\nvar rarrw = \"\\u219D\";\nvar ratail = \"\\u291A\";\nvar rAtail = \"\\u291C\";\nvar ratio = \"\\u2236\";\nvar rationals = \"\\u211A\";\nvar rbarr = \"\\u290D\";\nvar rBarr = \"\\u290F\";\nvar RBarr = \"\\u2910\";\nvar rbbrk = \"\\u2773\";\nvar rbrace = \"}\";\nvar rbrack = \"]\";\nvar rbrke = \"\\u298C\";\nvar rbrksld = \"\\u298E\";\nvar rbrkslu = \"\\u2990\";\nvar Rcaron = \"\\u0158\";\nvar rcaron = \"\\u0159\";\nvar Rcedil = \"\\u0156\";\nvar rcedil = \"\\u0157\";\nvar rceil = \"\\u2309\";\nvar rcub = \"}\";\nvar Rcy = \"\\u0420\";\nvar rcy = \"\\u0440\";\nvar rdca = \"\\u2937\";\nvar rdldhar = \"\\u2969\";\nvar rdquo = \"\\u201D\";\nvar rdquor = \"\\u201D\";\nvar rdsh = \"\\u21B3\";\nvar real = \"\\u211C\";\nvar realine = \"\\u211B\";\nvar realpart = \"\\u211C\";\nvar reals = \"\\u211D\";\nvar Re = \"\\u211C\";\nvar rect = \"\\u25AD\";\nvar reg$1 = \"\\xAE\";\nvar REG$1 = \"\\xAE\";\nvar ReverseElement = \"\\u220B\";\nvar ReverseEquilibrium = \"\\u21CB\";\nvar ReverseUpEquilibrium = \"\\u296F\";\nvar rfisht = \"\\u297D\";\nvar rfloor = \"\\u230B\";\nvar rfr = \"\\u{1D52F}\";\nvar Rfr = \"\\u211C\";\nvar rHar = \"\\u2964\";\nvar rhard = \"\\u21C1\";\nvar rharu = \"\\u21C0\";\nvar rharul = \"\\u296C\";\nvar Rho = \"\\u03A1\";\nvar rho = \"\\u03C1\";\nvar rhov = \"\\u03F1\";\nvar RightAngleBracket = \"\\u27E9\";\nvar RightArrowBar = \"\\u21E5\";\nvar rightarrow = \"\\u2192\";\nvar RightArrow = \"\\u2192\";\nvar Rightarrow = \"\\u21D2\";\nvar RightArrowLeftArrow = \"\\u21C4\";\nvar rightarrowtail = \"\\u21A3\";\nvar RightCeiling = \"\\u2309\";\nvar RightDoubleBracket = \"\\u27E7\";\nvar RightDownTeeVector = \"\\u295D\";\nvar RightDownVectorBar = \"\\u2955\";\nvar RightDownVector = \"\\u21C2\";\nvar RightFloor = \"\\u230B\";\nvar rightharpoondown = \"\\u21C1\";\nvar rightharpoonup = \"\\u21C0\";\nvar rightleftarrows = \"\\u21C4\";\nvar rightleftharpoons = \"\\u21CC\";\nvar rightrightarrows = \"\\u21C9\";\nvar rightsquigarrow = \"\\u219D\";\nvar RightTeeArrow = \"\\u21A6\";\nvar RightTee = \"\\u22A2\";\nvar RightTeeVector = \"\\u295B\";\nvar rightthreetimes = \"\\u22CC\";\nvar RightTriangleBar = \"\\u29D0\";\nvar RightTriangle = \"\\u22B3\";\nvar RightTriangleEqual = \"\\u22B5\";\nvar RightUpDownVector = \"\\u294F\";\nvar RightUpTeeVector = \"\\u295C\";\nvar RightUpVectorBar = \"\\u2954\";\nvar RightUpVector = \"\\u21BE\";\nvar RightVectorBar = \"\\u2953\";\nvar RightVector = \"\\u21C0\";\nvar ring = \"\\u02DA\";\nvar risingdotseq = \"\\u2253\";\nvar rlarr = \"\\u21C4\";\nvar rlhar = \"\\u21CC\";\nvar rlm = \"\\u200F\";\nvar rmoustache = \"\\u23B1\";\nvar rmoust = \"\\u23B1\";\nvar rnmid = \"\\u2AEE\";\nvar roang = \"\\u27ED\";\nvar roarr = \"\\u21FE\";\nvar robrk = \"\\u27E7\";\nvar ropar = \"\\u2986\";\nvar ropf = \"\\u{1D563}\";\nvar Ropf = \"\\u211D\";\nvar roplus = \"\\u2A2E\";\nvar rotimes = \"\\u2A35\";\nvar RoundImplies = \"\\u2970\";\nvar rpar = \")\";\nvar rpargt = \"\\u2994\";\nvar rppolint = \"\\u2A12\";\nvar rrarr = \"\\u21C9\";\nvar Rrightarrow = \"\\u21DB\";\nvar rsaquo = \"\\u203A\";\nvar rscr = \"\\u{1D4C7}\";\nvar Rscr = \"\\u211B\";\nvar rsh = \"\\u21B1\";\nvar Rsh = \"\\u21B1\";\nvar rsqb = \"]\";\nvar rsquo = \"\\u2019\";\nvar rsquor = \"\\u2019\";\nvar rthree = \"\\u22CC\";\nvar rtimes = \"\\u22CA\";\nvar rtri = \"\\u25B9\";\nvar rtrie = \"\\u22B5\";\nvar rtrif = \"\\u25B8\";\nvar rtriltri = \"\\u29CE\";\nvar RuleDelayed = \"\\u29F4\";\nvar ruluhar = \"\\u2968\";\nvar rx = \"\\u211E\";\nvar Sacute = \"\\u015A\";\nvar sacute = \"\\u015B\";\nvar sbquo = \"\\u201A\";\nvar scap = \"\\u2AB8\";\nvar Scaron = \"\\u0160\";\nvar scaron = \"\\u0161\";\nvar Sc = \"\\u2ABC\";\nvar sc = \"\\u227B\";\nvar sccue = \"\\u227D\";\nvar sce = \"\\u2AB0\";\nvar scE = \"\\u2AB4\";\nvar Scedil = \"\\u015E\";\nvar scedil = \"\\u015F\";\nvar Scirc = \"\\u015C\";\nvar scirc = \"\\u015D\";\nvar scnap = \"\\u2ABA\";\nvar scnE = \"\\u2AB6\";\nvar scnsim = \"\\u22E9\";\nvar scpolint = \"\\u2A13\";\nvar scsim = \"\\u227F\";\nvar Scy = \"\\u0421\";\nvar scy = \"\\u0441\";\nvar sdotb = \"\\u22A1\";\nvar sdot = \"\\u22C5\";\nvar sdote = \"\\u2A66\";\nvar searhk = \"\\u2925\";\nvar searr = \"\\u2198\";\nvar seArr = \"\\u21D8\";\nvar searrow = \"\\u2198\";\nvar sect$1 = \"\\xA7\";\nvar semi = \";\";\nvar seswar = \"\\u2929\";\nvar setminus = \"\\u2216\";\nvar setmn = \"\\u2216\";\nvar sext = \"\\u2736\";\nvar Sfr = \"\\u{1D516}\";\nvar sfr = \"\\u{1D530}\";\nvar sfrown = \"\\u2322\";\nvar sharp = \"\\u266F\";\nvar SHCHcy = \"\\u0429\";\nvar shchcy = \"\\u0449\";\nvar SHcy = \"\\u0428\";\nvar shcy = \"\\u0448\";\nvar ShortDownArrow = \"\\u2193\";\nvar ShortLeftArrow = \"\\u2190\";\nvar shortmid = \"\\u2223\";\nvar shortparallel = \"\\u2225\";\nvar ShortRightArrow = \"\\u2192\";\nvar ShortUpArrow = \"\\u2191\";\nvar shy$1 = \"\\xAD\";\nvar Sigma = \"\\u03A3\";\nvar sigma = \"\\u03C3\";\nvar sigmaf = \"\\u03C2\";\nvar sigmav = \"\\u03C2\";\nvar sim = \"\\u223C\";\nvar simdot = \"\\u2A6A\";\nvar sime = \"\\u2243\";\nvar simeq = \"\\u2243\";\nvar simg = \"\\u2A9E\";\nvar simgE = \"\\u2AA0\";\nvar siml = \"\\u2A9D\";\nvar simlE = \"\\u2A9F\";\nvar simne = \"\\u2246\";\nvar simplus = \"\\u2A24\";\nvar simrarr = \"\\u2972\";\nvar slarr = \"\\u2190\";\nvar SmallCircle = \"\\u2218\";\nvar smallsetminus = \"\\u2216\";\nvar smashp = \"\\u2A33\";\nvar smeparsl = \"\\u29E4\";\nvar smid = \"\\u2223\";\nvar smile = \"\\u2323\";\nvar smt = \"\\u2AAA\";\nvar smte = \"\\u2AAC\";\nvar smtes = \"\\u2AAC\\uFE00\";\nvar SOFTcy = \"\\u042C\";\nvar softcy = \"\\u044C\";\nvar solbar = \"\\u233F\";\nvar solb = \"\\u29C4\";\nvar sol = \"/\";\nvar Sopf = \"\\u{1D54A}\";\nvar sopf = \"\\u{1D564}\";\nvar spades = \"\\u2660\";\nvar spadesuit = \"\\u2660\";\nvar spar = \"\\u2225\";\nvar sqcap = \"\\u2293\";\nvar sqcaps = \"\\u2293\\uFE00\";\nvar sqcup = \"\\u2294\";\nvar sqcups = \"\\u2294\\uFE00\";\nvar Sqrt = \"\\u221A\";\nvar sqsub = \"\\u228F\";\nvar sqsube = \"\\u2291\";\nvar sqsubset = \"\\u228F\";\nvar sqsubseteq = \"\\u2291\";\nvar sqsup = \"\\u2290\";\nvar sqsupe = \"\\u2292\";\nvar sqsupset = \"\\u2290\";\nvar sqsupseteq = \"\\u2292\";\nvar square = \"\\u25A1\";\nvar Square = \"\\u25A1\";\nvar SquareIntersection = \"\\u2293\";\nvar SquareSubset = \"\\u228F\";\nvar SquareSubsetEqual = \"\\u2291\";\nvar SquareSuperset = \"\\u2290\";\nvar SquareSupersetEqual = \"\\u2292\";\nvar SquareUnion = \"\\u2294\";\nvar squarf = \"\\u25AA\";\nvar squ = \"\\u25A1\";\nvar squf = \"\\u25AA\";\nvar srarr = \"\\u2192\";\nvar Sscr = \"\\u{1D4AE}\";\nvar sscr = \"\\u{1D4C8}\";\nvar ssetmn = \"\\u2216\";\nvar ssmile = \"\\u2323\";\nvar sstarf = \"\\u22C6\";\nvar Star = \"\\u22C6\";\nvar star = \"\\u2606\";\nvar starf = \"\\u2605\";\nvar straightepsilon = \"\\u03F5\";\nvar straightphi = \"\\u03D5\";\nvar strns = \"\\xAF\";\nvar sub = \"\\u2282\";\nvar Sub = \"\\u22D0\";\nvar subdot = \"\\u2ABD\";\nvar subE = \"\\u2AC5\";\nvar sube = \"\\u2286\";\nvar subedot = \"\\u2AC3\";\nvar submult = \"\\u2AC1\";\nvar subnE = \"\\u2ACB\";\nvar subne = \"\\u228A\";\nvar subplus = \"\\u2ABF\";\nvar subrarr = \"\\u2979\";\nvar subset = \"\\u2282\";\nvar Subset = \"\\u22D0\";\nvar subseteq = \"\\u2286\";\nvar subseteqq = \"\\u2AC5\";\nvar SubsetEqual = \"\\u2286\";\nvar subsetneq = \"\\u228A\";\nvar subsetneqq = \"\\u2ACB\";\nvar subsim = \"\\u2AC7\";\nvar subsub = \"\\u2AD5\";\nvar subsup = \"\\u2AD3\";\nvar succapprox = \"\\u2AB8\";\nvar succ = \"\\u227B\";\nvar succcurlyeq = \"\\u227D\";\nvar Succeeds = \"\\u227B\";\nvar SucceedsEqual = \"\\u2AB0\";\nvar SucceedsSlantEqual = \"\\u227D\";\nvar SucceedsTilde = \"\\u227F\";\nvar succeq = \"\\u2AB0\";\nvar succnapprox = \"\\u2ABA\";\nvar succneqq = \"\\u2AB6\";\nvar succnsim = \"\\u22E9\";\nvar succsim = \"\\u227F\";\nvar SuchThat = \"\\u220B\";\nvar sum = \"\\u2211\";\nvar Sum = \"\\u2211\";\nvar sung = \"\\u266A\";\nvar sup1$1 = \"\\xB9\";\nvar sup2$1 = \"\\xB2\";\nvar sup3$1 = \"\\xB3\";\nvar sup = \"\\u2283\";\nvar Sup = \"\\u22D1\";\nvar supdot = \"\\u2ABE\";\nvar supdsub = \"\\u2AD8\";\nvar supE = \"\\u2AC6\";\nvar supe = \"\\u2287\";\nvar supedot = \"\\u2AC4\";\nvar Superset = \"\\u2283\";\nvar SupersetEqual = \"\\u2287\";\nvar suphsol = \"\\u27C9\";\nvar suphsub = \"\\u2AD7\";\nvar suplarr = \"\\u297B\";\nvar supmult = \"\\u2AC2\";\nvar supnE = \"\\u2ACC\";\nvar supne = \"\\u228B\";\nvar supplus = \"\\u2AC0\";\nvar supset = \"\\u2283\";\nvar Supset = \"\\u22D1\";\nvar supseteq = \"\\u2287\";\nvar supseteqq = \"\\u2AC6\";\nvar supsetneq = \"\\u228B\";\nvar supsetneqq = \"\\u2ACC\";\nvar supsim = \"\\u2AC8\";\nvar supsub = \"\\u2AD4\";\nvar supsup = \"\\u2AD6\";\nvar swarhk = \"\\u2926\";\nvar swarr = \"\\u2199\";\nvar swArr = \"\\u21D9\";\nvar swarrow = \"\\u2199\";\nvar swnwar = \"\\u292A\";\nvar szlig$1 = \"\\xDF\";\nvar Tab = \"\t\";\nvar target = \"\\u2316\";\nvar Tau = \"\\u03A4\";\nvar tau = \"\\u03C4\";\nvar tbrk = \"\\u23B4\";\nvar Tcaron = \"\\u0164\";\nvar tcaron = \"\\u0165\";\nvar Tcedil = \"\\u0162\";\nvar tcedil = \"\\u0163\";\nvar Tcy = \"\\u0422\";\nvar tcy = \"\\u0442\";\nvar tdot = \"\\u20DB\";\nvar telrec = \"\\u2315\";\nvar Tfr = \"\\u{1D517}\";\nvar tfr = \"\\u{1D531}\";\nvar there4 = \"\\u2234\";\nvar therefore = \"\\u2234\";\nvar Therefore = \"\\u2234\";\nvar Theta = \"\\u0398\";\nvar theta = \"\\u03B8\";\nvar thetasym = \"\\u03D1\";\nvar thetav = \"\\u03D1\";\nvar thickapprox = \"\\u2248\";\nvar thicksim = \"\\u223C\";\nvar ThickSpace = \"\\u205F\\u200A\";\nvar ThinSpace = \"\\u2009\";\nvar thinsp = \"\\u2009\";\nvar thkap = \"\\u2248\";\nvar thksim = \"\\u223C\";\nvar THORN$1 = \"\\xDE\";\nvar thorn$1 = \"\\xFE\";\nvar tilde = \"\\u02DC\";\nvar Tilde = \"\\u223C\";\nvar TildeEqual = \"\\u2243\";\nvar TildeFullEqual = \"\\u2245\";\nvar TildeTilde = \"\\u2248\";\nvar timesbar = \"\\u2A31\";\nvar timesb = \"\\u22A0\";\nvar times$1 = \"\\xD7\";\nvar timesd = \"\\u2A30\";\nvar tint = \"\\u222D\";\nvar toea = \"\\u2928\";\nvar topbot = \"\\u2336\";\nvar topcir = \"\\u2AF1\";\nvar top = \"\\u22A4\";\nvar Topf = \"\\u{1D54B}\";\nvar topf = \"\\u{1D565}\";\nvar topfork = \"\\u2ADA\";\nvar tosa = \"\\u2929\";\nvar tprime = \"\\u2034\";\nvar trade = \"\\u2122\";\nvar TRADE = \"\\u2122\";\nvar triangle = \"\\u25B5\";\nvar triangledown = \"\\u25BF\";\nvar triangleleft = \"\\u25C3\";\nvar trianglelefteq = \"\\u22B4\";\nvar triangleq = \"\\u225C\";\nvar triangleright = \"\\u25B9\";\nvar trianglerighteq = \"\\u22B5\";\nvar tridot = \"\\u25EC\";\nvar trie = \"\\u225C\";\nvar triminus = \"\\u2A3A\";\nvar TripleDot = \"\\u20DB\";\nvar triplus = \"\\u2A39\";\nvar trisb = \"\\u29CD\";\nvar tritime = \"\\u2A3B\";\nvar trpezium = \"\\u23E2\";\nvar Tscr = \"\\u{1D4AF}\";\nvar tscr = \"\\u{1D4C9}\";\nvar TScy = \"\\u0426\";\nvar tscy = \"\\u0446\";\nvar TSHcy = \"\\u040B\";\nvar tshcy = \"\\u045B\";\nvar Tstrok = \"\\u0166\";\nvar tstrok = \"\\u0167\";\nvar twixt = \"\\u226C\";\nvar twoheadleftarrow = \"\\u219E\";\nvar twoheadrightarrow = \"\\u21A0\";\nvar Uacute$1 = \"\\xDA\";\nvar uacute$1 = \"\\xFA\";\nvar uarr = \"\\u2191\";\nvar Uarr = \"\\u219F\";\nvar uArr = \"\\u21D1\";\nvar Uarrocir = \"\\u2949\";\nvar Ubrcy = \"\\u040E\";\nvar ubrcy = \"\\u045E\";\nvar Ubreve = \"\\u016C\";\nvar ubreve = \"\\u016D\";\nvar Ucirc$1 = \"\\xDB\";\nvar ucirc$1 = \"\\xFB\";\nvar Ucy = \"\\u0423\";\nvar ucy = \"\\u0443\";\nvar udarr = \"\\u21C5\";\nvar Udblac = \"\\u0170\";\nvar udblac = \"\\u0171\";\nvar udhar = \"\\u296E\";\nvar ufisht = \"\\u297E\";\nvar Ufr = \"\\u{1D518}\";\nvar ufr = \"\\u{1D532}\";\nvar Ugrave$1 = \"\\xD9\";\nvar ugrave$1 = \"\\xF9\";\nvar uHar = \"\\u2963\";\nvar uharl = \"\\u21BF\";\nvar uharr = \"\\u21BE\";\nvar uhblk = \"\\u2580\";\nvar ulcorn = \"\\u231C\";\nvar ulcorner = \"\\u231C\";\nvar ulcrop = \"\\u230F\";\nvar ultri = \"\\u25F8\";\nvar Umacr = \"\\u016A\";\nvar umacr = \"\\u016B\";\nvar uml$1 = \"\\xA8\";\nvar UnderBar = \"_\";\nvar UnderBrace = \"\\u23DF\";\nvar UnderBracket = \"\\u23B5\";\nvar UnderParenthesis = \"\\u23DD\";\nvar Union = \"\\u22C3\";\nvar UnionPlus = \"\\u228E\";\nvar Uogon = \"\\u0172\";\nvar uogon = \"\\u0173\";\nvar Uopf = \"\\u{1D54C}\";\nvar uopf = \"\\u{1D566}\";\nvar UpArrowBar = \"\\u2912\";\nvar uparrow = \"\\u2191\";\nvar UpArrow = \"\\u2191\";\nvar Uparrow = \"\\u21D1\";\nvar UpArrowDownArrow = \"\\u21C5\";\nvar updownarrow = \"\\u2195\";\nvar UpDownArrow = \"\\u2195\";\nvar Updownarrow = \"\\u21D5\";\nvar UpEquilibrium = \"\\u296E\";\nvar upharpoonleft = \"\\u21BF\";\nvar upharpoonright = \"\\u21BE\";\nvar uplus = \"\\u228E\";\nvar UpperLeftArrow = \"\\u2196\";\nvar UpperRightArrow = \"\\u2197\";\nvar upsi = \"\\u03C5\";\nvar Upsi = \"\\u03D2\";\nvar upsih = \"\\u03D2\";\nvar Upsilon = \"\\u03A5\";\nvar upsilon = \"\\u03C5\";\nvar UpTeeArrow = \"\\u21A5\";\nvar UpTee = \"\\u22A5\";\nvar upuparrows = \"\\u21C8\";\nvar urcorn = \"\\u231D\";\nvar urcorner = \"\\u231D\";\nvar urcrop = \"\\u230E\";\nvar Uring = \"\\u016E\";\nvar uring = \"\\u016F\";\nvar urtri = \"\\u25F9\";\nvar Uscr = \"\\u{1D4B0}\";\nvar uscr = \"\\u{1D4CA}\";\nvar utdot = \"\\u22F0\";\nvar Utilde = \"\\u0168\";\nvar utilde = \"\\u0169\";\nvar utri = \"\\u25B5\";\nvar utrif = \"\\u25B4\";\nvar uuarr = \"\\u21C8\";\nvar Uuml$1 = \"\\xDC\";\nvar uuml$1 = \"\\xFC\";\nvar uwangle = \"\\u29A7\";\nvar vangrt = \"\\u299C\";\nvar varepsilon = \"\\u03F5\";\nvar varkappa = \"\\u03F0\";\nvar varnothing = \"\\u2205\";\nvar varphi = \"\\u03D5\";\nvar varpi = \"\\u03D6\";\nvar varpropto = \"\\u221D\";\nvar varr = \"\\u2195\";\nvar vArr = \"\\u21D5\";\nvar varrho = \"\\u03F1\";\nvar varsigma = \"\\u03C2\";\nvar varsubsetneq = \"\\u228A\\uFE00\";\nvar varsubsetneqq = \"\\u2ACB\\uFE00\";\nvar varsupsetneq = \"\\u228B\\uFE00\";\nvar varsupsetneqq = \"\\u2ACC\\uFE00\";\nvar vartheta = \"\\u03D1\";\nvar vartriangleleft = \"\\u22B2\";\nvar vartriangleright = \"\\u22B3\";\nvar vBar = \"\\u2AE8\";\nvar Vbar = \"\\u2AEB\";\nvar vBarv = \"\\u2AE9\";\nvar Vcy = \"\\u0412\";\nvar vcy = \"\\u0432\";\nvar vdash = \"\\u22A2\";\nvar vDash = \"\\u22A8\";\nvar Vdash = \"\\u22A9\";\nvar VDash = \"\\u22AB\";\nvar Vdashl = \"\\u2AE6\";\nvar veebar = \"\\u22BB\";\nvar vee = \"\\u2228\";\nvar Vee = \"\\u22C1\";\nvar veeeq = \"\\u225A\";\nvar vellip = \"\\u22EE\";\nvar verbar = \"|\";\nvar Verbar = \"\\u2016\";\nvar vert = \"|\";\nvar Vert = \"\\u2016\";\nvar VerticalBar = \"\\u2223\";\nvar VerticalLine = \"|\";\nvar VerticalSeparator = \"\\u2758\";\nvar VerticalTilde = \"\\u2240\";\nvar VeryThinSpace = \"\\u200A\";\nvar Vfr = \"\\u{1D519}\";\nvar vfr = \"\\u{1D533}\";\nvar vltri = \"\\u22B2\";\nvar vnsub = \"\\u2282\\u20D2\";\nvar vnsup = \"\\u2283\\u20D2\";\nvar Vopf = \"\\u{1D54D}\";\nvar vopf = \"\\u{1D567}\";\nvar vprop = \"\\u221D\";\nvar vrtri = \"\\u22B3\";\nvar Vscr = \"\\u{1D4B1}\";\nvar vscr = \"\\u{1D4CB}\";\nvar vsubnE = \"\\u2ACB\\uFE00\";\nvar vsubne = \"\\u228A\\uFE00\";\nvar vsupnE = \"\\u2ACC\\uFE00\";\nvar vsupne = \"\\u228B\\uFE00\";\nvar Vvdash = \"\\u22AA\";\nvar vzigzag = \"\\u299A\";\nvar Wcirc = \"\\u0174\";\nvar wcirc = \"\\u0175\";\nvar wedbar = \"\\u2A5F\";\nvar wedge = \"\\u2227\";\nvar Wedge = \"\\u22C0\";\nvar wedgeq = \"\\u2259\";\nvar weierp = \"\\u2118\";\nvar Wfr = \"\\u{1D51A}\";\nvar wfr = \"\\u{1D534}\";\nvar Wopf = \"\\u{1D54E}\";\nvar wopf = \"\\u{1D568}\";\nvar wp = \"\\u2118\";\nvar wr = \"\\u2240\";\nvar wreath = \"\\u2240\";\nvar Wscr = \"\\u{1D4B2}\";\nvar wscr = \"\\u{1D4CC}\";\nvar xcap = \"\\u22C2\";\nvar xcirc = \"\\u25EF\";\nvar xcup = \"\\u22C3\";\nvar xdtri = \"\\u25BD\";\nvar Xfr = \"\\u{1D51B}\";\nvar xfr = \"\\u{1D535}\";\nvar xharr = \"\\u27F7\";\nvar xhArr = \"\\u27FA\";\nvar Xi = \"\\u039E\";\nvar xi = \"\\u03BE\";\nvar xlarr = \"\\u27F5\";\nvar xlArr = \"\\u27F8\";\nvar xmap = \"\\u27FC\";\nvar xnis = \"\\u22FB\";\nvar xodot = \"\\u2A00\";\nvar Xopf = \"\\u{1D54F}\";\nvar xopf = \"\\u{1D569}\";\nvar xoplus = \"\\u2A01\";\nvar xotime = \"\\u2A02\";\nvar xrarr = \"\\u27F6\";\nvar xrArr = \"\\u27F9\";\nvar Xscr = \"\\u{1D4B3}\";\nvar xscr = \"\\u{1D4CD}\";\nvar xsqcup = \"\\u2A06\";\nvar xuplus = \"\\u2A04\";\nvar xutri = \"\\u25B3\";\nvar xvee = \"\\u22C1\";\nvar xwedge = \"\\u22C0\";\nvar Yacute$1 = \"\\xDD\";\nvar yacute$1 = \"\\xFD\";\nvar YAcy = \"\\u042F\";\nvar yacy = \"\\u044F\";\nvar Ycirc = \"\\u0176\";\nvar ycirc = \"\\u0177\";\nvar Ycy = \"\\u042B\";\nvar ycy = \"\\u044B\";\nvar yen$1 = \"\\xA5\";\nvar Yfr = \"\\u{1D51C}\";\nvar yfr = \"\\u{1D536}\";\nvar YIcy = \"\\u0407\";\nvar yicy = \"\\u0457\";\nvar Yopf = \"\\u{1D550}\";\nvar yopf = \"\\u{1D56A}\";\nvar Yscr = \"\\u{1D4B4}\";\nvar yscr = \"\\u{1D4CE}\";\nvar YUcy = \"\\u042E\";\nvar yucy = \"\\u044E\";\nvar yuml$1 = \"\\xFF\";\nvar Yuml = \"\\u0178\";\nvar Zacute = \"\\u0179\";\nvar zacute = \"\\u017A\";\nvar Zcaron = \"\\u017D\";\nvar zcaron = \"\\u017E\";\nvar Zcy = \"\\u0417\";\nvar zcy = \"\\u0437\";\nvar Zdot = \"\\u017B\";\nvar zdot = \"\\u017C\";\nvar zeetrf = \"\\u2128\";\nvar ZeroWidthSpace = \"\\u200B\";\nvar Zeta = \"\\u0396\";\nvar zeta = \"\\u03B6\";\nvar zfr = \"\\u{1D537}\";\nvar Zfr = \"\\u2128\";\nvar ZHcy = \"\\u0416\";\nvar zhcy = \"\\u0436\";\nvar zigrarr = \"\\u21DD\";\nvar zopf = \"\\u{1D56B}\";\nvar Zopf = \"\\u2124\";\nvar Zscr = \"\\u{1D4B5}\";\nvar zscr = \"\\u{1D4CF}\";\nvar zwj = \"\\u200D\";\nvar zwnj = \"\\u200C\";\nvar require$$1$1 = {\n Aacute: Aacute$1,\n aacute: aacute$1,\n Abreve,\n abreve,\n ac,\n acd,\n acE,\n Acirc: Acirc$1,\n acirc: acirc$1,\n acute: acute$1,\n Acy,\n acy,\n AElig: AElig$1,\n aelig: aelig$1,\n af,\n Afr,\n afr,\n Agrave: Agrave$1,\n agrave: agrave$1,\n alefsym,\n aleph,\n Alpha,\n alpha,\n Amacr,\n amacr,\n amalg,\n amp: amp$2,\n AMP: AMP$1,\n andand,\n And,\n and,\n andd,\n andslope,\n andv,\n ang,\n ange,\n angle,\n angmsdaa,\n angmsdab,\n angmsdac,\n angmsdad,\n angmsdae,\n angmsdaf,\n angmsdag,\n angmsdah,\n angmsd,\n angrt,\n angrtvb,\n angrtvbd,\n angsph,\n angst,\n angzarr,\n Aogon,\n aogon,\n Aopf,\n aopf,\n apacir,\n ap,\n apE,\n ape,\n apid,\n apos: apos$1,\n ApplyFunction,\n approx,\n approxeq,\n Aring: Aring$1,\n aring: aring$1,\n Ascr,\n ascr,\n Assign,\n ast,\n asymp,\n asympeq,\n Atilde: Atilde$1,\n atilde: atilde$1,\n Auml: Auml$1,\n auml: auml$1,\n awconint,\n awint,\n backcong,\n backepsilon,\n backprime,\n backsim,\n backsimeq,\n Backslash,\n Barv,\n barvee,\n barwed,\n Barwed,\n barwedge,\n bbrk,\n bbrktbrk,\n bcong,\n Bcy,\n bcy,\n bdquo,\n becaus,\n because,\n Because,\n bemptyv,\n bepsi,\n bernou,\n Bernoullis,\n Beta,\n beta,\n beth,\n between,\n Bfr,\n bfr,\n bigcap,\n bigcirc,\n bigcup,\n bigodot,\n bigoplus,\n bigotimes,\n bigsqcup,\n bigstar,\n bigtriangledown,\n bigtriangleup,\n biguplus,\n bigvee,\n bigwedge,\n bkarow,\n blacklozenge,\n blacksquare,\n blacktriangle,\n blacktriangledown,\n blacktriangleleft,\n blacktriangleright,\n blank,\n blk12,\n blk14,\n blk34,\n block,\n bne,\n bnequiv,\n bNot,\n bnot,\n Bopf,\n bopf,\n bot,\n bottom,\n bowtie,\n boxbox,\n boxdl,\n boxdL,\n boxDl,\n boxDL,\n boxdr,\n boxdR,\n boxDr,\n boxDR,\n boxh,\n boxH,\n boxhd,\n boxHd,\n boxhD,\n boxHD,\n boxhu,\n boxHu,\n boxhU,\n boxHU,\n boxminus,\n boxplus,\n boxtimes,\n boxul,\n boxuL,\n boxUl,\n boxUL,\n boxur,\n boxuR,\n boxUr,\n boxUR,\n boxv,\n boxV,\n boxvh,\n boxvH,\n boxVh,\n boxVH,\n boxvl,\n boxvL,\n boxVl,\n boxVL,\n boxvr,\n boxvR,\n boxVr,\n boxVR,\n bprime,\n breve,\n Breve,\n brvbar: brvbar$1,\n bscr,\n Bscr,\n bsemi,\n bsim,\n bsime,\n bsolb,\n bsol,\n bsolhsub,\n bull,\n bullet,\n bump,\n bumpE,\n bumpe,\n Bumpeq,\n bumpeq,\n Cacute,\n cacute,\n capand,\n capbrcup,\n capcap,\n cap,\n Cap,\n capcup,\n capdot,\n CapitalDifferentialD,\n caps,\n caret,\n caron,\n Cayleys,\n ccaps,\n Ccaron,\n ccaron,\n Ccedil: Ccedil$1,\n ccedil: ccedil$1,\n Ccirc,\n ccirc,\n Cconint,\n ccups,\n ccupssm,\n Cdot,\n cdot,\n cedil: cedil$1,\n Cedilla,\n cemptyv,\n cent: cent$1,\n centerdot,\n CenterDot,\n cfr,\n Cfr,\n CHcy,\n chcy,\n check,\n checkmark,\n Chi,\n chi,\n circ,\n circeq,\n circlearrowleft,\n circlearrowright,\n circledast,\n circledcirc,\n circleddash,\n CircleDot,\n circledR,\n circledS,\n CircleMinus,\n CirclePlus,\n CircleTimes,\n cir,\n cirE,\n cire,\n cirfnint,\n cirmid,\n cirscir,\n ClockwiseContourIntegral,\n CloseCurlyDoubleQuote,\n CloseCurlyQuote,\n clubs,\n clubsuit,\n colon,\n Colon,\n Colone,\n colone,\n coloneq,\n comma,\n commat,\n comp,\n compfn,\n complement,\n complexes,\n cong,\n congdot,\n Congruent,\n conint,\n Conint,\n ContourIntegral,\n copf,\n Copf,\n coprod,\n Coproduct,\n copy: copy$1,\n COPY: COPY$1,\n copysr,\n CounterClockwiseContourIntegral,\n crarr,\n cross,\n Cross,\n Cscr,\n cscr,\n csub,\n csube,\n csup,\n csupe,\n ctdot,\n cudarrl,\n cudarrr,\n cuepr,\n cuesc,\n cularr,\n cularrp,\n cupbrcap,\n cupcap,\n CupCap,\n cup,\n Cup,\n cupcup,\n cupdot,\n cupor,\n cups,\n curarr,\n curarrm,\n curlyeqprec,\n curlyeqsucc,\n curlyvee,\n curlywedge,\n curren: curren$1,\n curvearrowleft,\n curvearrowright,\n cuvee,\n cuwed,\n cwconint,\n cwint,\n cylcty,\n dagger,\n Dagger,\n daleth,\n darr,\n Darr,\n dArr,\n dash,\n Dashv,\n dashv,\n dbkarow,\n dblac,\n Dcaron,\n dcaron,\n Dcy,\n dcy,\n ddagger,\n ddarr,\n DD,\n dd,\n DDotrahd,\n ddotseq,\n deg: deg$1,\n Del,\n Delta,\n delta,\n demptyv,\n dfisht,\n Dfr,\n dfr,\n dHar,\n dharl,\n dharr,\n DiacriticalAcute,\n DiacriticalDot,\n DiacriticalDoubleAcute,\n DiacriticalGrave,\n DiacriticalTilde,\n diam,\n diamond,\n Diamond,\n diamondsuit,\n diams,\n die,\n DifferentialD,\n digamma,\n disin,\n div,\n divide: divide$1,\n divideontimes,\n divonx,\n DJcy,\n djcy,\n dlcorn,\n dlcrop,\n dollar,\n Dopf,\n dopf,\n Dot,\n dot,\n DotDot,\n doteq,\n doteqdot,\n DotEqual,\n dotminus,\n dotplus,\n dotsquare,\n doublebarwedge,\n DoubleContourIntegral,\n DoubleDot,\n DoubleDownArrow,\n DoubleLeftArrow,\n DoubleLeftRightArrow,\n DoubleLeftTee,\n DoubleLongLeftArrow,\n DoubleLongLeftRightArrow,\n DoubleLongRightArrow,\n DoubleRightArrow,\n DoubleRightTee,\n DoubleUpArrow,\n DoubleUpDownArrow,\n DoubleVerticalBar,\n DownArrowBar,\n downarrow,\n DownArrow,\n Downarrow,\n DownArrowUpArrow,\n DownBreve,\n downdownarrows,\n downharpoonleft,\n downharpoonright,\n DownLeftRightVector,\n DownLeftTeeVector,\n DownLeftVectorBar,\n DownLeftVector,\n DownRightTeeVector,\n DownRightVectorBar,\n DownRightVector,\n DownTeeArrow,\n DownTee,\n drbkarow,\n drcorn,\n drcrop,\n Dscr,\n dscr,\n DScy,\n dscy,\n dsol,\n Dstrok,\n dstrok,\n dtdot,\n dtri,\n dtrif,\n duarr,\n duhar,\n dwangle,\n DZcy,\n dzcy,\n dzigrarr,\n Eacute: Eacute$1,\n eacute: eacute$1,\n easter,\n Ecaron,\n ecaron,\n Ecirc: Ecirc$1,\n ecirc: ecirc$1,\n ecir,\n ecolon,\n Ecy,\n ecy,\n eDDot,\n Edot,\n edot,\n eDot,\n ee,\n efDot,\n Efr,\n efr,\n eg,\n Egrave: Egrave$1,\n egrave: egrave$1,\n egs,\n egsdot,\n el,\n Element: Element$1,\n elinters,\n ell,\n els,\n elsdot,\n Emacr,\n emacr,\n empty,\n emptyset,\n EmptySmallSquare,\n emptyv,\n EmptyVerySmallSquare,\n emsp13,\n emsp14,\n emsp,\n ENG,\n eng,\n ensp,\n Eogon,\n eogon,\n Eopf,\n eopf,\n epar,\n eparsl,\n eplus,\n epsi,\n Epsilon,\n epsilon,\n epsiv,\n eqcirc,\n eqcolon,\n eqsim,\n eqslantgtr,\n eqslantless,\n Equal,\n equals,\n EqualTilde,\n equest,\n Equilibrium,\n equiv,\n equivDD,\n eqvparsl,\n erarr,\n erDot,\n escr,\n Escr,\n esdot,\n Esim,\n esim,\n Eta,\n eta,\n ETH: ETH$1,\n eth: eth$1,\n Euml: Euml$1,\n euml: euml$1,\n euro,\n excl,\n exist,\n Exists,\n expectation,\n exponentiale,\n ExponentialE,\n fallingdotseq,\n Fcy,\n fcy,\n female,\n ffilig,\n fflig,\n ffllig,\n Ffr,\n ffr,\n filig,\n FilledSmallSquare,\n FilledVerySmallSquare,\n fjlig,\n flat,\n fllig,\n fltns,\n fnof,\n Fopf,\n fopf,\n forall,\n ForAll,\n fork,\n forkv,\n Fouriertrf,\n fpartint,\n frac12: frac12$1,\n frac13,\n frac14: frac14$1,\n frac15,\n frac16,\n frac18,\n frac23,\n frac25,\n frac34: frac34$1,\n frac35,\n frac38,\n frac45,\n frac56,\n frac58,\n frac78,\n frasl,\n frown,\n fscr,\n Fscr,\n gacute,\n Gamma,\n gamma,\n Gammad,\n gammad,\n gap,\n Gbreve,\n gbreve,\n Gcedil,\n Gcirc,\n gcirc,\n Gcy,\n gcy,\n Gdot,\n gdot,\n ge,\n gE,\n gEl,\n gel,\n geq,\n geqq,\n geqslant,\n gescc,\n ges,\n gesdot,\n gesdoto,\n gesdotol,\n gesl,\n gesles,\n Gfr,\n gfr,\n gg,\n Gg,\n ggg,\n gimel,\n GJcy,\n gjcy,\n gla,\n gl,\n glE,\n glj,\n gnap,\n gnapprox,\n gne,\n gnE,\n gneq,\n gneqq,\n gnsim,\n Gopf,\n gopf,\n grave,\n GreaterEqual,\n GreaterEqualLess,\n GreaterFullEqual,\n GreaterGreater,\n GreaterLess,\n GreaterSlantEqual,\n GreaterTilde,\n Gscr,\n gscr,\n gsim,\n gsime,\n gsiml,\n gtcc,\n gtcir,\n gt: gt$2,\n GT: GT$1,\n Gt,\n gtdot,\n gtlPar,\n gtquest,\n gtrapprox,\n gtrarr,\n gtrdot,\n gtreqless,\n gtreqqless,\n gtrless,\n gtrsim,\n gvertneqq,\n gvnE,\n Hacek,\n hairsp,\n half,\n hamilt,\n HARDcy,\n hardcy,\n harrcir,\n harr,\n hArr,\n harrw,\n Hat,\n hbar,\n Hcirc,\n hcirc,\n hearts,\n heartsuit,\n hellip,\n hercon,\n hfr,\n Hfr,\n HilbertSpace,\n hksearow,\n hkswarow,\n hoarr,\n homtht,\n hookleftarrow,\n hookrightarrow,\n hopf,\n Hopf,\n horbar,\n HorizontalLine,\n hscr,\n Hscr,\n hslash,\n Hstrok,\n hstrok,\n HumpDownHump,\n HumpEqual,\n hybull,\n hyphen,\n Iacute: Iacute$1,\n iacute: iacute$1,\n ic,\n Icirc: Icirc$1,\n icirc: icirc$1,\n Icy,\n icy,\n Idot,\n IEcy,\n iecy,\n iexcl: iexcl$1,\n iff,\n ifr,\n Ifr,\n Igrave: Igrave$1,\n igrave: igrave$1,\n ii,\n iiiint,\n iiint,\n iinfin,\n iiota,\n IJlig,\n ijlig,\n Imacr,\n imacr,\n image,\n ImaginaryI,\n imagline,\n imagpart,\n imath,\n Im,\n imof,\n imped,\n Implies,\n incare,\n \"in\": \"\\u2208\",\n infin,\n infintie,\n inodot,\n intcal,\n int,\n Int,\n integers,\n Integral,\n intercal,\n Intersection,\n intlarhk,\n intprod,\n InvisibleComma,\n InvisibleTimes,\n IOcy,\n iocy,\n Iogon,\n iogon,\n Iopf,\n iopf,\n Iota,\n iota,\n iprod,\n iquest: iquest$1,\n iscr,\n Iscr,\n isin,\n isindot,\n isinE,\n isins,\n isinsv,\n isinv,\n it,\n Itilde,\n itilde,\n Iukcy,\n iukcy,\n Iuml: Iuml$1,\n iuml: iuml$1,\n Jcirc,\n jcirc,\n Jcy,\n jcy,\n Jfr,\n jfr,\n jmath,\n Jopf,\n jopf,\n Jscr,\n jscr,\n Jsercy,\n jsercy,\n Jukcy,\n jukcy,\n Kappa,\n kappa,\n kappav,\n Kcedil,\n kcedil,\n Kcy,\n kcy,\n Kfr,\n kfr,\n kgreen,\n KHcy,\n khcy,\n KJcy,\n kjcy,\n Kopf,\n kopf,\n Kscr,\n kscr,\n lAarr,\n Lacute,\n lacute,\n laemptyv,\n lagran,\n Lambda,\n lambda,\n lang,\n Lang,\n langd,\n langle,\n lap,\n Laplacetrf,\n laquo: laquo$1,\n larrb,\n larrbfs,\n larr,\n Larr,\n lArr,\n larrfs,\n larrhk,\n larrlp,\n larrpl,\n larrsim,\n larrtl,\n latail,\n lAtail,\n lat,\n late,\n lates,\n lbarr,\n lBarr,\n lbbrk,\n lbrace,\n lbrack,\n lbrke,\n lbrksld,\n lbrkslu,\n Lcaron,\n lcaron,\n Lcedil,\n lcedil,\n lceil,\n lcub,\n Lcy,\n lcy,\n ldca,\n ldquo,\n ldquor,\n ldrdhar,\n ldrushar,\n ldsh,\n le,\n lE,\n LeftAngleBracket,\n LeftArrowBar,\n leftarrow,\n LeftArrow,\n Leftarrow,\n LeftArrowRightArrow,\n leftarrowtail,\n LeftCeiling,\n LeftDoubleBracket,\n LeftDownTeeVector,\n LeftDownVectorBar,\n LeftDownVector,\n LeftFloor,\n leftharpoondown,\n leftharpoonup,\n leftleftarrows,\n leftrightarrow,\n LeftRightArrow,\n Leftrightarrow,\n leftrightarrows,\n leftrightharpoons,\n leftrightsquigarrow,\n LeftRightVector,\n LeftTeeArrow,\n LeftTee,\n LeftTeeVector,\n leftthreetimes,\n LeftTriangleBar,\n LeftTriangle,\n LeftTriangleEqual,\n LeftUpDownVector,\n LeftUpTeeVector,\n LeftUpVectorBar,\n LeftUpVector,\n LeftVectorBar,\n LeftVector,\n lEg,\n leg,\n leq,\n leqq,\n leqslant,\n lescc,\n les,\n lesdot,\n lesdoto,\n lesdotor,\n lesg,\n lesges,\n lessapprox,\n lessdot,\n lesseqgtr,\n lesseqqgtr,\n LessEqualGreater,\n LessFullEqual,\n LessGreater,\n lessgtr,\n LessLess,\n lesssim,\n LessSlantEqual,\n LessTilde,\n lfisht,\n lfloor,\n Lfr,\n lfr,\n lg,\n lgE,\n lHar,\n lhard,\n lharu,\n lharul,\n lhblk,\n LJcy,\n ljcy,\n llarr,\n ll,\n Ll,\n llcorner,\n Lleftarrow,\n llhard,\n lltri,\n Lmidot,\n lmidot,\n lmoustache,\n lmoust,\n lnap,\n lnapprox,\n lne,\n lnE,\n lneq,\n lneqq,\n lnsim,\n loang,\n loarr,\n lobrk,\n longleftarrow,\n LongLeftArrow,\n Longleftarrow,\n longleftrightarrow,\n LongLeftRightArrow,\n Longleftrightarrow,\n longmapsto,\n longrightarrow,\n LongRightArrow,\n Longrightarrow,\n looparrowleft,\n looparrowright,\n lopar,\n Lopf,\n lopf,\n loplus,\n lotimes,\n lowast,\n lowbar,\n LowerLeftArrow,\n LowerRightArrow,\n loz,\n lozenge,\n lozf,\n lpar,\n lparlt,\n lrarr,\n lrcorner,\n lrhar,\n lrhard,\n lrm,\n lrtri,\n lsaquo,\n lscr,\n Lscr,\n lsh,\n Lsh,\n lsim,\n lsime,\n lsimg,\n lsqb,\n lsquo,\n lsquor,\n Lstrok,\n lstrok,\n ltcc,\n ltcir,\n lt: lt$2,\n LT: LT$1,\n Lt,\n ltdot,\n lthree,\n ltimes,\n ltlarr,\n ltquest,\n ltri,\n ltrie,\n ltrif,\n ltrPar,\n lurdshar,\n luruhar,\n lvertneqq,\n lvnE,\n macr: macr$1,\n male,\n malt,\n maltese,\n \"Map\": \"\\u2905\",\n map,\n mapsto,\n mapstodown,\n mapstoleft,\n mapstoup,\n marker,\n mcomma,\n Mcy,\n mcy,\n mdash,\n mDDot,\n measuredangle,\n MediumSpace,\n Mellintrf,\n Mfr,\n mfr,\n mho,\n micro: micro$1,\n midast,\n midcir,\n mid,\n middot: middot$1,\n minusb,\n minus,\n minusd,\n minusdu,\n MinusPlus,\n mlcp,\n mldr,\n mnplus,\n models,\n Mopf,\n mopf,\n mp,\n mscr,\n Mscr,\n mstpos,\n Mu,\n mu,\n multimap,\n mumap,\n nabla,\n Nacute,\n nacute,\n nang,\n nap,\n napE,\n napid,\n napos,\n napprox,\n natural,\n naturals,\n natur,\n nbsp: nbsp$1,\n nbump,\n nbumpe,\n ncap,\n Ncaron,\n ncaron,\n Ncedil,\n ncedil,\n ncong,\n ncongdot,\n ncup,\n Ncy,\n ncy,\n ndash,\n nearhk,\n nearr,\n neArr,\n nearrow,\n ne,\n nedot,\n NegativeMediumSpace,\n NegativeThickSpace,\n NegativeThinSpace,\n NegativeVeryThinSpace,\n nequiv,\n nesear,\n nesim,\n NestedGreaterGreater,\n NestedLessLess,\n NewLine,\n nexist,\n nexists,\n Nfr,\n nfr,\n ngE,\n nge,\n ngeq,\n ngeqq,\n ngeqslant,\n nges,\n nGg,\n ngsim,\n nGt,\n ngt,\n ngtr,\n nGtv,\n nharr,\n nhArr,\n nhpar,\n ni,\n nis,\n nisd,\n niv,\n NJcy,\n njcy,\n nlarr,\n nlArr,\n nldr,\n nlE,\n nle,\n nleftarrow,\n nLeftarrow,\n nleftrightarrow,\n nLeftrightarrow,\n nleq,\n nleqq,\n nleqslant,\n nles,\n nless,\n nLl,\n nlsim,\n nLt,\n nlt,\n nltri,\n nltrie,\n nLtv,\n nmid,\n NoBreak,\n NonBreakingSpace,\n nopf,\n Nopf,\n Not,\n not: not$1,\n NotCongruent,\n NotCupCap,\n NotDoubleVerticalBar,\n NotElement,\n NotEqual,\n NotEqualTilde,\n NotExists,\n NotGreater,\n NotGreaterEqual,\n NotGreaterFullEqual,\n NotGreaterGreater,\n NotGreaterLess,\n NotGreaterSlantEqual,\n NotGreaterTilde,\n NotHumpDownHump,\n NotHumpEqual,\n notin,\n notindot,\n notinE,\n notinva,\n notinvb,\n notinvc,\n NotLeftTriangleBar,\n NotLeftTriangle,\n NotLeftTriangleEqual,\n NotLess,\n NotLessEqual,\n NotLessGreater,\n NotLessLess,\n NotLessSlantEqual,\n NotLessTilde,\n NotNestedGreaterGreater,\n NotNestedLessLess,\n notni,\n notniva,\n notnivb,\n notnivc,\n NotPrecedes,\n NotPrecedesEqual,\n NotPrecedesSlantEqual,\n NotReverseElement,\n NotRightTriangleBar,\n NotRightTriangle,\n NotRightTriangleEqual,\n NotSquareSubset,\n NotSquareSubsetEqual,\n NotSquareSuperset,\n NotSquareSupersetEqual,\n NotSubset,\n NotSubsetEqual,\n NotSucceeds,\n NotSucceedsEqual,\n NotSucceedsSlantEqual,\n NotSucceedsTilde,\n NotSuperset,\n NotSupersetEqual,\n NotTilde,\n NotTildeEqual,\n NotTildeFullEqual,\n NotTildeTilde,\n NotVerticalBar,\n nparallel,\n npar,\n nparsl,\n npart,\n npolint,\n npr,\n nprcue,\n nprec,\n npreceq,\n npre,\n nrarrc,\n nrarr,\n nrArr,\n nrarrw,\n nrightarrow,\n nRightarrow,\n nrtri,\n nrtrie,\n nsc,\n nsccue,\n nsce,\n Nscr,\n nscr,\n nshortmid,\n nshortparallel,\n nsim,\n nsime,\n nsimeq,\n nsmid,\n nspar,\n nsqsube,\n nsqsupe,\n nsub,\n nsubE,\n nsube,\n nsubset,\n nsubseteq,\n nsubseteqq,\n nsucc,\n nsucceq,\n nsup,\n nsupE,\n nsupe,\n nsupset,\n nsupseteq,\n nsupseteqq,\n ntgl,\n Ntilde: Ntilde$1,\n ntilde: ntilde$1,\n ntlg,\n ntriangleleft,\n ntrianglelefteq,\n ntriangleright,\n ntrianglerighteq,\n Nu,\n nu,\n num,\n numero,\n numsp,\n nvap,\n nvdash,\n nvDash,\n nVdash,\n nVDash,\n nvge,\n nvgt,\n nvHarr,\n nvinfin,\n nvlArr,\n nvle,\n nvlt,\n nvltrie,\n nvrArr,\n nvrtrie,\n nvsim,\n nwarhk,\n nwarr,\n nwArr,\n nwarrow,\n nwnear,\n Oacute: Oacute$1,\n oacute: oacute$1,\n oast,\n Ocirc: Ocirc$1,\n ocirc: ocirc$1,\n ocir,\n Ocy,\n ocy,\n odash,\n Odblac,\n odblac,\n odiv,\n odot,\n odsold,\n OElig,\n oelig,\n ofcir,\n Ofr,\n ofr,\n ogon,\n Ograve: Ograve$1,\n ograve: ograve$1,\n ogt,\n ohbar,\n ohm,\n oint,\n olarr,\n olcir,\n olcross,\n oline,\n olt,\n Omacr,\n omacr,\n Omega,\n omega,\n Omicron,\n omicron,\n omid,\n ominus,\n Oopf,\n oopf,\n opar,\n OpenCurlyDoubleQuote,\n OpenCurlyQuote,\n operp,\n oplus,\n orarr,\n Or,\n or,\n ord,\n order,\n orderof,\n ordf: ordf$1,\n ordm: ordm$1,\n origof,\n oror,\n orslope,\n orv,\n oS,\n Oscr,\n oscr,\n Oslash: Oslash$1,\n oslash: oslash$1,\n osol,\n Otilde: Otilde$1,\n otilde: otilde$1,\n otimesas,\n Otimes,\n otimes,\n Ouml: Ouml$1,\n ouml: ouml$1,\n ovbar,\n OverBar,\n OverBrace,\n OverBracket,\n OverParenthesis,\n para: para$1,\n parallel,\n par,\n parsim,\n parsl,\n part,\n PartialD,\n Pcy,\n pcy,\n percnt,\n period,\n permil,\n perp,\n pertenk,\n Pfr,\n pfr,\n Phi,\n phi,\n phiv,\n phmmat,\n phone,\n Pi,\n pi,\n pitchfork,\n piv,\n planck,\n planckh,\n plankv,\n plusacir,\n plusb,\n pluscir,\n plus,\n plusdo,\n plusdu,\n pluse,\n PlusMinus,\n plusmn: plusmn$1,\n plussim,\n plustwo,\n pm,\n Poincareplane,\n pointint,\n popf,\n Popf,\n pound: pound$1,\n prap,\n Pr,\n pr,\n prcue,\n precapprox,\n prec,\n preccurlyeq,\n Precedes,\n PrecedesEqual,\n PrecedesSlantEqual,\n PrecedesTilde,\n preceq,\n precnapprox,\n precneqq,\n precnsim,\n pre,\n prE,\n precsim,\n prime,\n Prime,\n primes,\n prnap,\n prnE,\n prnsim,\n prod,\n Product,\n profalar,\n profline,\n profsurf,\n prop,\n Proportional,\n Proportion,\n propto,\n prsim,\n prurel,\n Pscr,\n pscr,\n Psi,\n psi,\n puncsp,\n Qfr,\n qfr,\n qint,\n qopf,\n Qopf,\n qprime,\n Qscr,\n qscr,\n quaternions,\n quatint,\n quest,\n questeq,\n quot: quot$2,\n QUOT: QUOT$1,\n rAarr,\n race,\n Racute,\n racute,\n radic,\n raemptyv,\n rang,\n Rang,\n rangd,\n range,\n rangle,\n raquo: raquo$1,\n rarrap,\n rarrb,\n rarrbfs,\n rarrc,\n rarr,\n Rarr,\n rArr,\n rarrfs,\n rarrhk,\n rarrlp,\n rarrpl,\n rarrsim,\n Rarrtl,\n rarrtl,\n rarrw,\n ratail,\n rAtail,\n ratio,\n rationals,\n rbarr,\n rBarr,\n RBarr,\n rbbrk,\n rbrace,\n rbrack,\n rbrke,\n rbrksld,\n rbrkslu,\n Rcaron,\n rcaron,\n Rcedil,\n rcedil,\n rceil,\n rcub,\n Rcy,\n rcy,\n rdca,\n rdldhar,\n rdquo,\n rdquor,\n rdsh,\n real,\n realine,\n realpart,\n reals,\n Re,\n rect,\n reg: reg$1,\n REG: REG$1,\n ReverseElement,\n ReverseEquilibrium,\n ReverseUpEquilibrium,\n rfisht,\n rfloor,\n rfr,\n Rfr,\n rHar,\n rhard,\n rharu,\n rharul,\n Rho,\n rho,\n rhov,\n RightAngleBracket,\n RightArrowBar,\n rightarrow,\n RightArrow,\n Rightarrow,\n RightArrowLeftArrow,\n rightarrowtail,\n RightCeiling,\n RightDoubleBracket,\n RightDownTeeVector,\n RightDownVectorBar,\n RightDownVector,\n RightFloor,\n rightharpoondown,\n rightharpoonup,\n rightleftarrows,\n rightleftharpoons,\n rightrightarrows,\n rightsquigarrow,\n RightTeeArrow,\n RightTee,\n RightTeeVector,\n rightthreetimes,\n RightTriangleBar,\n RightTriangle,\n RightTriangleEqual,\n RightUpDownVector,\n RightUpTeeVector,\n RightUpVectorBar,\n RightUpVector,\n RightVectorBar,\n RightVector,\n ring,\n risingdotseq,\n rlarr,\n rlhar,\n rlm,\n rmoustache,\n rmoust,\n rnmid,\n roang,\n roarr,\n robrk,\n ropar,\n ropf,\n Ropf,\n roplus,\n rotimes,\n RoundImplies,\n rpar,\n rpargt,\n rppolint,\n rrarr,\n Rrightarrow,\n rsaquo,\n rscr,\n Rscr,\n rsh,\n Rsh,\n rsqb,\n rsquo,\n rsquor,\n rthree,\n rtimes,\n rtri,\n rtrie,\n rtrif,\n rtriltri,\n RuleDelayed,\n ruluhar,\n rx,\n Sacute,\n sacute,\n sbquo,\n scap,\n Scaron,\n scaron,\n Sc,\n sc,\n sccue,\n sce,\n scE,\n Scedil,\n scedil,\n Scirc,\n scirc,\n scnap,\n scnE,\n scnsim,\n scpolint,\n scsim,\n Scy,\n scy,\n sdotb,\n sdot,\n sdote,\n searhk,\n searr,\n seArr,\n searrow,\n sect: sect$1,\n semi,\n seswar,\n setminus,\n setmn,\n sext,\n Sfr,\n sfr,\n sfrown,\n sharp,\n SHCHcy,\n shchcy,\n SHcy,\n shcy,\n ShortDownArrow,\n ShortLeftArrow,\n shortmid,\n shortparallel,\n ShortRightArrow,\n ShortUpArrow,\n shy: shy$1,\n Sigma,\n sigma,\n sigmaf,\n sigmav,\n sim,\n simdot,\n sime,\n simeq,\n simg,\n simgE,\n siml,\n simlE,\n simne,\n simplus,\n simrarr,\n slarr,\n SmallCircle,\n smallsetminus,\n smashp,\n smeparsl,\n smid,\n smile,\n smt,\n smte,\n smtes,\n SOFTcy,\n softcy,\n solbar,\n solb,\n sol,\n Sopf,\n sopf,\n spades,\n spadesuit,\n spar,\n sqcap,\n sqcaps,\n sqcup,\n sqcups,\n Sqrt,\n sqsub,\n sqsube,\n sqsubset,\n sqsubseteq,\n sqsup,\n sqsupe,\n sqsupset,\n sqsupseteq,\n square,\n Square,\n SquareIntersection,\n SquareSubset,\n SquareSubsetEqual,\n SquareSuperset,\n SquareSupersetEqual,\n SquareUnion,\n squarf,\n squ,\n squf,\n srarr,\n Sscr,\n sscr,\n ssetmn,\n ssmile,\n sstarf,\n Star,\n star,\n starf,\n straightepsilon,\n straightphi,\n strns,\n sub,\n Sub,\n subdot,\n subE,\n sube,\n subedot,\n submult,\n subnE,\n subne,\n subplus,\n subrarr,\n subset,\n Subset,\n subseteq,\n subseteqq,\n SubsetEqual,\n subsetneq,\n subsetneqq,\n subsim,\n subsub,\n subsup,\n succapprox,\n succ,\n succcurlyeq,\n Succeeds,\n SucceedsEqual,\n SucceedsSlantEqual,\n SucceedsTilde,\n succeq,\n succnapprox,\n succneqq,\n succnsim,\n succsim,\n SuchThat,\n sum,\n Sum,\n sung,\n sup1: sup1$1,\n sup2: sup2$1,\n sup3: sup3$1,\n sup,\n Sup,\n supdot,\n supdsub,\n supE,\n supe,\n supedot,\n Superset,\n SupersetEqual,\n suphsol,\n suphsub,\n suplarr,\n supmult,\n supnE,\n supne,\n supplus,\n supset,\n Supset,\n supseteq,\n supseteqq,\n supsetneq,\n supsetneqq,\n supsim,\n supsub,\n supsup,\n swarhk,\n swarr,\n swArr,\n swarrow,\n swnwar,\n szlig: szlig$1,\n Tab,\n target,\n Tau,\n tau,\n tbrk,\n Tcaron,\n tcaron,\n Tcedil,\n tcedil,\n Tcy,\n tcy,\n tdot,\n telrec,\n Tfr,\n tfr,\n there4,\n therefore,\n Therefore,\n Theta,\n theta,\n thetasym,\n thetav,\n thickapprox,\n thicksim,\n ThickSpace,\n ThinSpace,\n thinsp,\n thkap,\n thksim,\n THORN: THORN$1,\n thorn: thorn$1,\n tilde,\n Tilde,\n TildeEqual,\n TildeFullEqual,\n TildeTilde,\n timesbar,\n timesb,\n times: times$1,\n timesd,\n tint,\n toea,\n topbot,\n topcir,\n top,\n Topf,\n topf,\n topfork,\n tosa,\n tprime,\n trade,\n TRADE,\n triangle,\n triangledown,\n triangleleft,\n trianglelefteq,\n triangleq,\n triangleright,\n trianglerighteq,\n tridot,\n trie,\n triminus,\n TripleDot,\n triplus,\n trisb,\n tritime,\n trpezium,\n Tscr,\n tscr,\n TScy,\n tscy,\n TSHcy,\n tshcy,\n Tstrok,\n tstrok,\n twixt,\n twoheadleftarrow,\n twoheadrightarrow,\n Uacute: Uacute$1,\n uacute: uacute$1,\n uarr,\n Uarr,\n uArr,\n Uarrocir,\n Ubrcy,\n ubrcy,\n Ubreve,\n ubreve,\n Ucirc: Ucirc$1,\n ucirc: ucirc$1,\n Ucy,\n ucy,\n udarr,\n Udblac,\n udblac,\n udhar,\n ufisht,\n Ufr,\n ufr,\n Ugrave: Ugrave$1,\n ugrave: ugrave$1,\n uHar,\n uharl,\n uharr,\n uhblk,\n ulcorn,\n ulcorner,\n ulcrop,\n ultri,\n Umacr,\n umacr,\n uml: uml$1,\n UnderBar,\n UnderBrace,\n UnderBracket,\n UnderParenthesis,\n Union,\n UnionPlus,\n Uogon,\n uogon,\n Uopf,\n uopf,\n UpArrowBar,\n uparrow,\n UpArrow,\n Uparrow,\n UpArrowDownArrow,\n updownarrow,\n UpDownArrow,\n Updownarrow,\n UpEquilibrium,\n upharpoonleft,\n upharpoonright,\n uplus,\n UpperLeftArrow,\n UpperRightArrow,\n upsi,\n Upsi,\n upsih,\n Upsilon,\n upsilon,\n UpTeeArrow,\n UpTee,\n upuparrows,\n urcorn,\n urcorner,\n urcrop,\n Uring,\n uring,\n urtri,\n Uscr,\n uscr,\n utdot,\n Utilde,\n utilde,\n utri,\n utrif,\n uuarr,\n Uuml: Uuml$1,\n uuml: uuml$1,\n uwangle,\n vangrt,\n varepsilon,\n varkappa,\n varnothing,\n varphi,\n varpi,\n varpropto,\n varr,\n vArr,\n varrho,\n varsigma,\n varsubsetneq,\n varsubsetneqq,\n varsupsetneq,\n varsupsetneqq,\n vartheta,\n vartriangleleft,\n vartriangleright,\n vBar,\n Vbar,\n vBarv,\n Vcy,\n vcy,\n vdash,\n vDash,\n Vdash,\n VDash,\n Vdashl,\n veebar,\n vee,\n Vee,\n veeeq,\n vellip,\n verbar,\n Verbar,\n vert,\n Vert,\n VerticalBar,\n VerticalLine,\n VerticalSeparator,\n VerticalTilde,\n VeryThinSpace,\n Vfr,\n vfr,\n vltri,\n vnsub,\n vnsup,\n Vopf,\n vopf,\n vprop,\n vrtri,\n Vscr,\n vscr,\n vsubnE,\n vsubne,\n vsupnE,\n vsupne,\n Vvdash,\n vzigzag,\n Wcirc,\n wcirc,\n wedbar,\n wedge,\n Wedge,\n wedgeq,\n weierp,\n Wfr,\n wfr,\n Wopf,\n wopf,\n wp,\n wr,\n wreath,\n Wscr,\n wscr,\n xcap,\n xcirc,\n xcup,\n xdtri,\n Xfr,\n xfr,\n xharr,\n xhArr,\n Xi,\n xi,\n xlarr,\n xlArr,\n xmap,\n xnis,\n xodot,\n Xopf,\n xopf,\n xoplus,\n xotime,\n xrarr,\n xrArr,\n Xscr,\n xscr,\n xsqcup,\n xuplus,\n xutri,\n xvee,\n xwedge,\n Yacute: Yacute$1,\n yacute: yacute$1,\n YAcy,\n yacy,\n Ycirc,\n ycirc,\n Ycy,\n ycy,\n yen: yen$1,\n Yfr,\n yfr,\n YIcy,\n yicy,\n Yopf,\n yopf,\n Yscr,\n yscr,\n YUcy,\n yucy,\n yuml: yuml$1,\n Yuml,\n Zacute,\n zacute,\n Zcaron,\n zcaron,\n Zcy,\n zcy,\n Zdot,\n zdot,\n zeetrf,\n ZeroWidthSpace,\n Zeta,\n zeta,\n zfr,\n Zfr,\n ZHcy,\n zhcy,\n zigrarr,\n zopf,\n Zopf,\n Zscr,\n zscr,\n zwj,\n zwnj\n};\nvar Aacute = \"\\xC1\";\nvar aacute = \"\\xE1\";\nvar Acirc = \"\\xC2\";\nvar acirc = \"\\xE2\";\nvar acute = \"\\xB4\";\nvar AElig = \"\\xC6\";\nvar aelig = \"\\xE6\";\nvar Agrave = \"\\xC0\";\nvar agrave = \"\\xE0\";\nvar amp$1 = \"&\";\nvar AMP = \"&\";\nvar Aring = \"\\xC5\";\nvar aring = \"\\xE5\";\nvar Atilde = \"\\xC3\";\nvar atilde = \"\\xE3\";\nvar Auml = \"\\xC4\";\nvar auml = \"\\xE4\";\nvar brvbar = \"\\xA6\";\nvar Ccedil = \"\\xC7\";\nvar ccedil = \"\\xE7\";\nvar cedil = \"\\xB8\";\nvar cent = \"\\xA2\";\nvar copy = \"\\xA9\";\nvar COPY = \"\\xA9\";\nvar curren = \"\\xA4\";\nvar deg = \"\\xB0\";\nvar divide = \"\\xF7\";\nvar Eacute = \"\\xC9\";\nvar eacute = \"\\xE9\";\nvar Ecirc = \"\\xCA\";\nvar ecirc = \"\\xEA\";\nvar Egrave = \"\\xC8\";\nvar egrave = \"\\xE8\";\nvar ETH = \"\\xD0\";\nvar eth = \"\\xF0\";\nvar Euml = \"\\xCB\";\nvar euml = \"\\xEB\";\nvar frac12 = \"\\xBD\";\nvar frac14 = \"\\xBC\";\nvar frac34 = \"\\xBE\";\nvar gt$1 = \">\";\nvar GT = \">\";\nvar Iacute = \"\\xCD\";\nvar iacute = \"\\xED\";\nvar Icirc = \"\\xCE\";\nvar icirc = \"\\xEE\";\nvar iexcl = \"\\xA1\";\nvar Igrave = \"\\xCC\";\nvar igrave = \"\\xEC\";\nvar iquest = \"\\xBF\";\nvar Iuml = \"\\xCF\";\nvar iuml = \"\\xEF\";\nvar laquo = \"\\xAB\";\nvar lt$1 = \"<\";\nvar LT = \"<\";\nvar macr = \"\\xAF\";\nvar micro = \"\\xB5\";\nvar middot = \"\\xB7\";\nvar nbsp = \"\\xA0\";\nvar not = \"\\xAC\";\nvar Ntilde = \"\\xD1\";\nvar ntilde = \"\\xF1\";\nvar Oacute = \"\\xD3\";\nvar oacute = \"\\xF3\";\nvar Ocirc = \"\\xD4\";\nvar ocirc = \"\\xF4\";\nvar Ograve = \"\\xD2\";\nvar ograve = \"\\xF2\";\nvar ordf = \"\\xAA\";\nvar ordm = \"\\xBA\";\nvar Oslash = \"\\xD8\";\nvar oslash = \"\\xF8\";\nvar Otilde = \"\\xD5\";\nvar otilde = \"\\xF5\";\nvar Ouml = \"\\xD6\";\nvar ouml = \"\\xF6\";\nvar para = \"\\xB6\";\nvar plusmn = \"\\xB1\";\nvar pound = \"\\xA3\";\nvar quot$1 = '\"';\nvar QUOT = '\"';\nvar raquo = \"\\xBB\";\nvar reg = \"\\xAE\";\nvar REG = \"\\xAE\";\nvar sect = \"\\xA7\";\nvar shy = \"\\xAD\";\nvar sup1 = \"\\xB9\";\nvar sup2 = \"\\xB2\";\nvar sup3 = \"\\xB3\";\nvar szlig = \"\\xDF\";\nvar THORN = \"\\xDE\";\nvar thorn = \"\\xFE\";\nvar times = \"\\xD7\";\nvar Uacute = \"\\xDA\";\nvar uacute = \"\\xFA\";\nvar Ucirc = \"\\xDB\";\nvar ucirc = \"\\xFB\";\nvar Ugrave = \"\\xD9\";\nvar ugrave = \"\\xF9\";\nvar uml = \"\\xA8\";\nvar Uuml = \"\\xDC\";\nvar uuml = \"\\xFC\";\nvar Yacute = \"\\xDD\";\nvar yacute = \"\\xFD\";\nvar yen = \"\\xA5\";\nvar yuml = \"\\xFF\";\nvar require$$1 = {\n Aacute,\n aacute,\n Acirc,\n acirc,\n acute,\n AElig,\n aelig,\n Agrave,\n agrave,\n amp: amp$1,\n AMP,\n Aring,\n aring,\n Atilde,\n atilde,\n Auml,\n auml,\n brvbar,\n Ccedil,\n ccedil,\n cedil,\n cent,\n copy,\n COPY,\n curren,\n deg,\n divide,\n Eacute,\n eacute,\n Ecirc,\n ecirc,\n Egrave,\n egrave,\n ETH,\n eth,\n Euml,\n euml,\n frac12,\n frac14,\n frac34,\n gt: gt$1,\n GT,\n Iacute,\n iacute,\n Icirc,\n icirc,\n iexcl,\n Igrave,\n igrave,\n iquest,\n Iuml,\n iuml,\n laquo,\n lt: lt$1,\n LT,\n macr,\n micro,\n middot,\n nbsp,\n not,\n Ntilde,\n ntilde,\n Oacute,\n oacute,\n Ocirc,\n ocirc,\n Ograve,\n ograve,\n ordf,\n ordm,\n Oslash,\n oslash,\n Otilde,\n otilde,\n Ouml,\n ouml,\n para,\n plusmn,\n pound,\n quot: quot$1,\n QUOT,\n raquo,\n reg,\n REG,\n sect,\n shy,\n sup1,\n sup2,\n sup3,\n szlig,\n THORN,\n thorn,\n times,\n Uacute,\n uacute,\n Ucirc,\n ucirc,\n Ugrave,\n ugrave,\n uml,\n Uuml,\n uuml,\n Yacute,\n yacute,\n yen,\n yuml\n};\nvar amp = \"&\";\nvar apos = \"'\";\nvar gt = \">\";\nvar lt = \"<\";\nvar quot = '\"';\nvar require$$0$1 = {\n amp,\n apos,\n gt,\n lt,\n quot\n};\nvar decode_codepoint = {};\nvar require$$0 = {\n \"0\": 65533,\n \"128\": 8364,\n \"130\": 8218,\n \"131\": 402,\n \"132\": 8222,\n \"133\": 8230,\n \"134\": 8224,\n \"135\": 8225,\n \"136\": 710,\n \"137\": 8240,\n \"138\": 352,\n \"139\": 8249,\n \"140\": 338,\n \"142\": 381,\n \"145\": 8216,\n \"146\": 8217,\n \"147\": 8220,\n \"148\": 8221,\n \"149\": 8226,\n \"150\": 8211,\n \"151\": 8212,\n \"152\": 732,\n \"153\": 8482,\n \"154\": 353,\n \"155\": 8250,\n \"156\": 339,\n \"158\": 382,\n \"159\": 376\n};\nvar __importDefault$2 = commonjsGlobal && commonjsGlobal.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : { \"default\": mod };\n};\nObject.defineProperty(decode_codepoint, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault$2(require$$0);\nvar fromCodePoint$2 = (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n String.fromCodePoint || function(codePoint) {\n var output = \"\";\n if (codePoint > 65535) {\n codePoint -= 65536;\n output += String.fromCharCode(codePoint >>> 10 & 1023 | 55296);\n codePoint = 56320 | codePoint & 1023;\n }\n output += String.fromCharCode(codePoint);\n return output;\n }\n);\nfunction decodeCodePoint(codePoint) {\n if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) {\n return \"\\uFFFD\";\n }\n if (codePoint in decode_json_1.default) {\n codePoint = decode_json_1.default[codePoint];\n }\n return fromCodePoint$2(codePoint);\n}\ndecode_codepoint.default = decodeCodePoint;\nvar __importDefault$1 = commonjsGlobal && commonjsGlobal.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : { \"default\": mod };\n};\nObject.defineProperty(decode, \"__esModule\", { value: true });\ndecode.decodeHTML = decode.decodeHTMLStrict = decode.decodeXML = void 0;\nvar entities_json_1$1 = __importDefault$1(require$$1$1);\nvar legacy_json_1 = __importDefault$1(require$$1);\nvar xml_json_1$1 = __importDefault$1(require$$0$1);\nvar decode_codepoint_1 = __importDefault$1(decode_codepoint);\nvar strictEntityRe = /&(?:[a-zA-Z0-9]+|#[xX][\\da-fA-F]+|#\\d+);/g;\ndecode.decodeXML = getStrictDecoder(xml_json_1$1.default);\ndecode.decodeHTMLStrict = getStrictDecoder(entities_json_1$1.default);\nfunction getStrictDecoder(map2) {\n var replace = getReplacer(map2);\n return function(str) {\n return String(str).replace(strictEntityRe, replace);\n };\n}\nvar sorter = function(a, b) {\n return a < b ? 1 : -1;\n};\ndecode.decodeHTML = function() {\n var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n var keys = Object.keys(entities_json_1$1.default).sort(sorter);\n for (var i = 0, j = 0; i < keys.length; i++) {\n if (legacy[j] === keys[i]) {\n keys[i] += \";?\";\n j++;\n } else {\n keys[i] += \";\";\n }\n }\n var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n var replace = getReplacer(entities_json_1$1.default);\n function replacer(str) {\n if (str.substr(-1) !== \";\")\n str += \";\";\n return replace(str);\n }\n return function(str) {\n return String(str).replace(re, replacer);\n };\n}();\nfunction getReplacer(map2) {\n return function replace(str) {\n if (str.charAt(1) === \"#\") {\n var secondChar = str.charAt(2);\n if (secondChar === \"X\" || secondChar === \"x\") {\n return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n }\n return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n }\n return map2[str.slice(1, -1)] || str;\n };\n}\nvar encode = {};\nvar __importDefault = commonjsGlobal && commonjsGlobal.__importDefault || function(mod) {\n return mod && mod.__esModule ? mod : { \"default\": mod };\n};\nObject.defineProperty(encode, \"__esModule\", { value: true });\nencode.escapeUTF8 = encode.escape = encode.encodeNonAsciiHTML = encode.encodeHTML = encode.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require$$0$1);\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\nencode.encodeXML = getASCIIEncoder(inverseXML);\nvar entities_json_1 = __importDefault(require$$1$1);\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\nencode.encodeHTML = getInverse(inverseHTML, htmlReplacer);\nencode.encodeNonAsciiHTML = getASCIIEncoder(inverseHTML);\nfunction getInverseObj(obj) {\n return Object.keys(obj).sort().reduce(function(inverse, name) {\n inverse[obj[name]] = \"&\" + name + \";\";\n return inverse;\n }, {});\n}\nfunction getInverseReplacer(inverse) {\n var single = [];\n var multiple = [];\n for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n var k = _a[_i];\n if (k.length === 1) {\n single.push(\"\\\\\" + k);\n } else {\n multiple.push(k);\n }\n }\n single.sort();\n for (var start = 0; start < single.length - 1; start++) {\n var end = start;\n while (end < single.length - 1 && single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n end += 1;\n }\n var count = 1 + end - start;\n if (count < 3)\n continue;\n single.splice(start, count, single[start] + \"-\" + single[end]);\n }\n multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n return new RegExp(multiple.join(\"|\"), \"g\");\n}\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nvar getCodePoint = (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n String.prototype.codePointAt != null ? (\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n function(str) {\n return str.codePointAt(0);\n }\n ) : (\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n function(c) {\n return (c.charCodeAt(0) - 55296) * 1024 + c.charCodeAt(1) - 56320 + 65536;\n }\n )\n);\nfunction singleCharReplacer(c) {\n return \"&#x\" + (c.length > 1 ? getCodePoint(c) : c.charCodeAt(0)).toString(16).toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n return function(data) {\n return data.replace(re, function(name) {\n return inverse[name];\n }).replace(reNonASCII, singleCharReplacer);\n };\n}\nvar reEscapeChars = new RegExp(xmlReplacer.source + \"|\" + reNonASCII.source, \"g\");\nfunction escape(data) {\n return data.replace(reEscapeChars, singleCharReplacer);\n}\nencode.escape = escape;\nfunction escapeUTF8(data) {\n return data.replace(xmlReplacer, singleCharReplacer);\n}\nencode.escapeUTF8 = escapeUTF8;\nfunction getASCIIEncoder(obj) {\n return function(data) {\n return data.replace(reEscapeChars, function(c) {\n return obj[c] || singleCharReplacer(c);\n });\n };\n}\n(function(exports) {\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = void 0;\n var decode_1 = decode;\n var encode_12 = encode;\n function decode$1(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n }\n exports.decode = decode$1;\n function decodeStrict(data, level) {\n return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n }\n exports.decodeStrict = decodeStrict;\n function encode$12(data, level) {\n return (!level || level <= 0 ? encode_12.encodeXML : encode_12.encodeHTML)(data);\n }\n exports.encode = encode$12;\n var encode_2 = encode;\n Object.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function() {\n return encode_2.encodeXML;\n } });\n Object.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function() {\n return encode_2.encodeHTML;\n } });\n Object.defineProperty(exports, \"encodeNonAsciiHTML\", { enumerable: true, get: function() {\n return encode_2.encodeNonAsciiHTML;\n } });\n Object.defineProperty(exports, \"escape\", { enumerable: true, get: function() {\n return encode_2.escape;\n } });\n Object.defineProperty(exports, \"escapeUTF8\", { enumerable: true, get: function() {\n return encode_2.escapeUTF8;\n } });\n Object.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function() {\n return encode_2.encodeHTML;\n } });\n Object.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function() {\n return encode_2.encodeHTML;\n } });\n var decode_2 = decode;\n Object.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function() {\n return decode_2.decodeXML;\n } });\n Object.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function() {\n return decode_2.decodeHTML;\n } });\n Object.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function() {\n return decode_2.decodeHTMLStrict;\n } });\n Object.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function() {\n return decode_2.decodeHTML;\n } });\n Object.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function() {\n return decode_2.decodeHTML;\n } });\n Object.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function() {\n return decode_2.decodeHTMLStrict;\n } });\n Object.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function() {\n return decode_2.decodeHTMLStrict;\n } });\n Object.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function() {\n return decode_2.decodeXML;\n } });\n})(lib);\nvar ENTITY = \"&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});\";\nvar C_BACKSLASH$1 = 92;\nvar reBackslashOrAmp = /[\\\\&]/;\nvar ESCAPABLE = \"[!\\\"#$%&'()*+,./:;<=>?@[\\\\\\\\\\\\]^_`{|}~-]\";\nvar reEntityOrEscapedChar = new RegExp(\"\\\\\\\\\" + ESCAPABLE + \"|\" + ENTITY, \"gi\");\nvar XMLSPECIAL = '[&<>\"]';\nvar reXmlSpecial = new RegExp(XMLSPECIAL, \"g\");\nvar unescapeChar = function(s) {\n if (s.charCodeAt(0) === C_BACKSLASH$1) {\n return s.charAt(1);\n }\n return lib.decodeHTML(s);\n};\nfunction unescapeString(s) {\n if (reBackslashOrAmp.test(s)) {\n return s.replace(reEntityOrEscapedChar, unescapeChar);\n }\n return s;\n}\nfunction normalizeURI(uri) {\n try {\n return encode_1(uri);\n } catch (err) {\n return uri;\n }\n}\nfunction replaceUnsafeChar(s) {\n switch (s) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n default:\n return s;\n }\n}\nfunction escapeXml(s) {\n if (reXmlSpecial.test(s)) {\n return s.replace(reXmlSpecial, replaceUnsafeChar);\n }\n return s;\n}\nfunction repeat(str, count) {\n var arr = [];\n for (var i = 0; i < count; i++) {\n arr.push(str);\n }\n return arr.join(\"\");\n}\nfunction isEmpty(str) {\n if (!str) {\n return true;\n }\n return !/[^ \\t]+/.test(str);\n}\nvar NodeWalker = (\n /** @class */\n function() {\n function NodeWalker2(root) {\n this.current = root;\n this.root = root;\n this.entering = true;\n }\n NodeWalker2.prototype.next = function() {\n var cur = this.current;\n var entering = this.entering;\n if (cur === null) {\n return null;\n }\n var container = isContainer$1(cur);\n if (entering && container) {\n if (cur.firstChild) {\n this.current = cur.firstChild;\n this.entering = true;\n } else {\n this.entering = false;\n }\n } else if (cur === this.root) {\n this.current = null;\n } else if (cur.next === null) {\n this.current = cur.parent;\n this.entering = false;\n } else {\n this.current = cur.next;\n this.entering = true;\n }\n return { entering, node: cur };\n };\n NodeWalker2.prototype.resumeAt = function(node, entering) {\n this.current = node;\n this.entering = entering === true;\n };\n return NodeWalker2;\n }()\n);\nfunction isContainer$1(node) {\n switch (node.type) {\n case \"document\":\n case \"blockQuote\":\n case \"list\":\n case \"item\":\n case \"paragraph\":\n case \"heading\":\n case \"emph\":\n case \"strong\":\n case \"strike\":\n case \"link\":\n case \"image\":\n case \"table\":\n case \"tableHead\":\n case \"tableBody\":\n case \"tableRow\":\n case \"tableCell\":\n case \"tableDelimRow\":\n case \"customInline\":\n return true;\n default:\n return false;\n }\n}\nvar lastNodeId = 1;\nvar nodeMap = {};\nfunction getNodeById(id) {\n return nodeMap[id];\n}\nfunction removeNodeById(id) {\n delete nodeMap[id];\n}\nfunction removeAllNode() {\n nodeMap = {};\n}\nvar Node$1 = (\n /** @class */\n function() {\n function Node2(nodeType, sourcepos) {\n this.parent = null;\n this.prev = null;\n this.next = null;\n this.firstChild = null;\n this.lastChild = null;\n this.literal = null;\n if (nodeType === \"document\") {\n this.id = -1;\n } else {\n this.id = lastNodeId++;\n }\n this.type = nodeType;\n this.sourcepos = sourcepos;\n nodeMap[this.id] = this;\n }\n Node2.prototype.isContainer = function() {\n return isContainer$1(this);\n };\n Node2.prototype.unlink = function() {\n if (this.prev) {\n this.prev.next = this.next;\n } else if (this.parent) {\n this.parent.firstChild = this.next;\n }\n if (this.next) {\n this.next.prev = this.prev;\n } else if (this.parent) {\n this.parent.lastChild = this.prev;\n }\n this.parent = null;\n this.next = null;\n this.prev = null;\n };\n Node2.prototype.replaceWith = function(node) {\n this.insertBefore(node);\n this.unlink();\n };\n Node2.prototype.insertAfter = function(sibling) {\n sibling.unlink();\n sibling.next = this.next;\n if (sibling.next) {\n sibling.next.prev = sibling;\n }\n sibling.prev = this;\n this.next = sibling;\n if (this.parent) {\n sibling.parent = this.parent;\n if (!sibling.next) {\n sibling.parent.lastChild = sibling;\n }\n }\n };\n Node2.prototype.insertBefore = function(sibling) {\n sibling.unlink();\n sibling.prev = this.prev;\n if (sibling.prev) {\n sibling.prev.next = sibling;\n }\n sibling.next = this;\n this.prev = sibling;\n sibling.parent = this.parent;\n if (!sibling.prev) {\n sibling.parent.firstChild = sibling;\n }\n };\n Node2.prototype.appendChild = function(child) {\n child.unlink();\n child.parent = this;\n if (this.lastChild) {\n this.lastChild.next = child;\n child.prev = this.lastChild;\n this.lastChild = child;\n } else {\n this.firstChild = child;\n this.lastChild = child;\n }\n };\n Node2.prototype.prependChild = function(child) {\n child.unlink();\n child.parent = this;\n if (this.firstChild) {\n this.firstChild.prev = child;\n child.next = this.firstChild;\n this.firstChild = child;\n } else {\n this.firstChild = child;\n this.lastChild = child;\n }\n };\n Node2.prototype.walker = function() {\n return new NodeWalker(this);\n };\n return Node2;\n }()\n);\nvar BlockNode = (\n /** @class */\n function(_super) {\n __extends(BlockNode2, _super);\n function BlockNode2(nodeType, sourcepos) {\n var _this = _super.call(this, nodeType, sourcepos) || this;\n _this.open = true;\n _this.lineOffsets = null;\n _this.stringContent = null;\n _this.lastLineBlank = false;\n _this.lastLineChecked = false;\n _this.type = nodeType;\n return _this;\n }\n return BlockNode2;\n }(Node$1)\n);\nvar ListNode = (\n /** @class */\n function(_super) {\n __extends(ListNode2, _super);\n function ListNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.listData = null;\n return _this;\n }\n return ListNode2;\n }(BlockNode)\n);\nvar HeadingNode = (\n /** @class */\n function(_super) {\n __extends(HeadingNode2, _super);\n function HeadingNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.level = 0;\n _this.headingType = \"atx\";\n return _this;\n }\n return HeadingNode2;\n }(BlockNode)\n);\nvar CodeBlockNode = (\n /** @class */\n function(_super) {\n __extends(CodeBlockNode2, _super);\n function CodeBlockNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.isFenced = false;\n _this.fenceChar = null;\n _this.fenceLength = 0;\n _this.fenceOffset = -1;\n _this.info = null;\n _this.infoPadding = 0;\n return _this;\n }\n return CodeBlockNode2;\n }(BlockNode)\n);\nvar TableNode = (\n /** @class */\n function(_super) {\n __extends(TableNode2, _super);\n function TableNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.columns = [];\n return _this;\n }\n return TableNode2;\n }(BlockNode)\n);\nvar TableCellNode = (\n /** @class */\n function(_super) {\n __extends(TableCellNode2, _super);\n function TableCellNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.startIdx = 0;\n _this.endIdx = 0;\n _this.paddingLeft = 0;\n _this.paddingRight = 0;\n _this.ignored = false;\n return _this;\n }\n return TableCellNode2;\n }(BlockNode)\n);\nvar RefDefNode = (\n /** @class */\n function(_super) {\n __extends(RefDefNode2, _super);\n function RefDefNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.title = \"\";\n _this.dest = \"\";\n _this.label = \"\";\n return _this;\n }\n return RefDefNode2;\n }(BlockNode)\n);\nvar CustomBlockNode = (\n /** @class */\n function(_super) {\n __extends(CustomBlockNode2, _super);\n function CustomBlockNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.syntaxLength = 0;\n _this.offset = -1;\n _this.info = \"\";\n return _this;\n }\n return CustomBlockNode2;\n }(BlockNode)\n);\nvar HtmlBlockNode = (\n /** @class */\n function(_super) {\n __extends(HtmlBlockNode2, _super);\n function HtmlBlockNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.htmlBlockType = -1;\n return _this;\n }\n return HtmlBlockNode2;\n }(BlockNode)\n);\nvar LinkNode = (\n /** @class */\n function(_super) {\n __extends(LinkNode2, _super);\n function LinkNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.destination = null;\n _this.title = null;\n _this.extendedAutolink = false;\n return _this;\n }\n return LinkNode2;\n }(Node$1)\n);\nvar CodeNode = (\n /** @class */\n function(_super) {\n __extends(CodeNode2, _super);\n function CodeNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.tickCount = 0;\n return _this;\n }\n return CodeNode2;\n }(Node$1)\n);\nvar CustomInlineNode = (\n /** @class */\n function(_super) {\n __extends(CustomInlineNode2, _super);\n function CustomInlineNode2() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.info = \"\";\n return _this;\n }\n return CustomInlineNode2;\n }(Node$1)\n);\nfunction createNode$1(type, sourcepos) {\n switch (type) {\n case \"heading\":\n return new HeadingNode(type, sourcepos);\n case \"list\":\n case \"item\":\n return new ListNode(type, sourcepos);\n case \"link\":\n case \"image\":\n return new LinkNode(type, sourcepos);\n case \"codeBlock\":\n return new CodeBlockNode(type, sourcepos);\n case \"htmlBlock\":\n return new HtmlBlockNode(type, sourcepos);\n case \"table\":\n return new TableNode(type, sourcepos);\n case \"tableCell\":\n return new TableCellNode(type, sourcepos);\n case \"document\":\n case \"paragraph\":\n case \"blockQuote\":\n case \"thematicBreak\":\n case \"tableRow\":\n case \"tableBody\":\n case \"tableHead\":\n case \"frontMatter\":\n return new BlockNode(type, sourcepos);\n case \"code\":\n return new CodeNode(type, sourcepos);\n case \"refDef\":\n return new RefDefNode(type, sourcepos);\n case \"customBlock\":\n return new CustomBlockNode(type, sourcepos);\n case \"customInline\":\n return new CustomInlineNode(type, sourcepos);\n default:\n return new Node$1(type, sourcepos);\n }\n}\nfunction isCodeBlock(node) {\n return node.type === \"codeBlock\";\n}\nfunction isHtmlBlock(node) {\n return node.type === \"htmlBlock\";\n}\nfunction isHeading(node) {\n return node.type === \"heading\";\n}\nfunction isList(node) {\n return node.type === \"list\";\n}\nfunction isTable(node) {\n return node.type === \"table\";\n}\nfunction isRefDef(node) {\n return node.type === \"refDef\";\n}\nfunction isCustomBlock(node) {\n return node.type === \"customBlock\";\n}\nfunction isCustomInline(node) {\n return node.type === \"customInline\";\n}\nfunction text$1(s, sourcepos) {\n var node = createNode$1(\"text\", sourcepos);\n node.literal = s;\n return node;\n}\nvar TAGNAME = \"[A-Za-z][A-Za-z0-9-]*\";\nvar ATTRIBUTENAME = \"[a-zA-Z_:][a-zA-Z0-9:._-]*\";\nvar UNQUOTEDVALUE = \"[^\\\"'=<>`\\\\x00-\\\\x20]+\";\nvar SINGLEQUOTEDVALUE = \"'[^']*'\";\nvar DOUBLEQUOTEDVALUE = '\"[^\"]*\"';\nvar ATTRIBUTEVALUE = \"(?:\" + UNQUOTEDVALUE + \"|\" + SINGLEQUOTEDVALUE + \"|\" + DOUBLEQUOTEDVALUE + \")\";\nvar ATTRIBUTEVALUESPEC = \"(?:\\\\s*=\\\\s*\" + ATTRIBUTEVALUE + \")\";\nvar ATTRIBUTE = \"(?:\\\\s+\" + ATTRIBUTENAME + ATTRIBUTEVALUESPEC + \"?)\";\nvar OPENTAG = \"<\" + TAGNAME + ATTRIBUTE + \"*\\\\s*/?>\";\nvar CLOSETAG = \"]\";\nvar HTMLCOMMENT = \"|\";\nvar PROCESSINGINSTRUCTION = \"[<][?].*?[?][>]\";\nvar DECLARATION = \"]*>\";\nvar CDATA = \"\";\nvar HTMLTAG = \"(?:\" + OPENTAG + \"|\" + CLOSETAG + \"|\" + HTMLCOMMENT + \"|\" + PROCESSINGINSTRUCTION + \"|\" + DECLARATION + \"|\" + CDATA + \")\";\nvar reHtmlTag = new RegExp(\"^\" + HTMLTAG, \"i\");\n/*! http://mths.be/fromcodepoint v0.2.1 by @mathias */\nvar fromCodePoint;\nif (String.fromCodePoint) {\n fromCodePoint = function(_) {\n try {\n return String.fromCodePoint(_);\n } catch (e) {\n if (e instanceof RangeError) {\n return String.fromCharCode(65533);\n }\n throw e;\n }\n };\n} else {\n var stringFromCharCode_1 = String.fromCharCode;\n var floor_1 = Math.floor;\n fromCodePoint = function() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var MAX_SIZE = 16384;\n var codeUnits = [];\n var highSurrogate;\n var lowSurrogate;\n var index2 = -1;\n var length = args.length;\n if (!length) {\n return \"\";\n }\n var result = \"\";\n while (++index2 < length) {\n var codePoint = Number(args[index2]);\n if (!isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 1114111 || // not a valid Unicode code point\n floor_1(codePoint) !== codePoint) {\n return String.fromCharCode(65533);\n }\n if (codePoint <= 65535) {\n codeUnits.push(codePoint);\n } else {\n codePoint -= 65536;\n highSurrogate = (codePoint >> 10) + 55296;\n lowSurrogate = codePoint % 1024 + 56320;\n codeUnits.push(highSurrogate, lowSurrogate);\n }\n if (index2 + 1 === length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode_1.apply(void 0, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n };\n}\nvar fromCodePoint$1 = fromCodePoint;\nvar DOMAIN = \"(?:[w-]+.)*[A-Za-z0-9-]+.[A-Za-z0-9-]+\";\nvar PATH = \"[^<\\\\s]*[^ lastIdx) {\n newNodes.push(text$1(literal.substring(lastIdx, range2[0]), sourcepos(lastIdx, range2[0] - 1)));\n }\n var linkNode = createNode$1(\"link\", sourcepos.apply(void 0, range2));\n linkNode.appendChild(text$1(linkText, sourcepos.apply(void 0, range2)));\n linkNode.destination = url;\n linkNode.extendedAutolink = true;\n newNodes.push(linkNode);\n lastIdx = range2[1] + 1;\n }\n if (lastIdx < literal.length) {\n newNodes.push(text$1(literal.substring(lastIdx), sourcepos(lastIdx, literal.length - 1)));\n }\n for (var _c = 0, newNodes_1 = newNodes; _c < newNodes_1.length; _c++) {\n var newNode = newNodes_1[_c];\n node.insertBefore(newNode);\n }\n node.unlink();\n }\n };\n while (event = walker.next()) {\n _loop_1();\n }\n}\nfunction last(arr) {\n return arr[arr.length - 1];\n}\nfunction normalizeReference(str) {\n return str.slice(1, str.length - 1).trim().replace(/[ \\t\\r\\n]+/, \" \").toLowerCase().toUpperCase();\n}\nfunction iterateObject(obj, iteratee) {\n Object.keys(obj).forEach(function(key) {\n iteratee(key, obj[key]);\n });\n}\nfunction omit(obj) {\n var propNames = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n propNames[_i - 1] = arguments[_i];\n }\n var resultMap = __assign({}, obj);\n propNames.forEach(function(key) {\n delete resultMap[key];\n });\n return resultMap;\n}\nfunction isEmptyObj(obj) {\n return !Object.keys(obj).length;\n}\nfunction clearObj(obj) {\n Object.keys(obj).forEach(function(key) {\n delete obj[key];\n });\n}\nvar C_NEWLINE = 10;\nvar C_ASTERISK = 42;\nvar C_UNDERSCORE = 95;\nvar C_BACKTICK = 96;\nvar C_OPEN_BRACKET$1 = 91;\nvar C_CLOSE_BRACKET = 93;\nvar C_TILDE = 126;\nvar C_LESSTHAN$1 = 60;\nvar C_BANG = 33;\nvar C_BACKSLASH = 92;\nvar C_AMPERSAND = 38;\nvar C_OPEN_PAREN = 40;\nvar C_CLOSE_PAREN = 41;\nvar C_COLON = 58;\nvar C_SINGLEQUOTE = 39;\nvar C_DOUBLEQUOTE = 34;\nvar C_DOLLAR = 36;\nvar ESCAPED_CHAR = \"\\\\\\\\\" + ESCAPABLE;\nvar rePunctuation = new RegExp(/[!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/);\nvar reLinkTitle = new RegExp('^(?:\"(' + ESCAPED_CHAR + '|[^\"\\\\x00])*\"|' + (\"'(\" + ESCAPED_CHAR + \"|[^'\\\\x00])*'\") + \"|\" + (\"\\\\((\" + ESCAPED_CHAR + \"|[^()\\\\x00])*\\\\))\"));\nvar reLinkDestinationBraces = /^(?:<(?:[^<>\\n\\\\\\x00]|\\\\.)*>)/;\nvar reEscapable = new RegExp(\"^\" + ESCAPABLE);\nvar reEntityHere = new RegExp(\"^\" + ENTITY, \"i\");\nvar reTicks = /`+/;\nvar reTicksHere = /^`+/;\nvar reEllipses = /\\.\\.\\./g;\nvar reDash = /--+/g;\nvar reEmailAutolink = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\nvar reAutolink = /^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\\x00-\\x20]*>/i;\nvar reSpnl = /^ *(?:\\n *)?/;\nvar reWhitespaceChar = /^[ \\t\\n\\x0b\\x0c\\x0d]/;\nvar reUnicodeWhitespaceChar = /^\\s/;\nvar reFinalSpace = / *$/;\nvar reInitialSpace = /^ */;\nvar reSpaceAtEndOfLine = /^ *(?:\\n|$)/;\nvar reLinkLabel = /^\\[(?:[^\\\\\\[\\]]|\\\\.){0,1000}\\]/;\nvar reMain = /^[^\\n`\\[\\]\\\\!<&*_'\"~$]+/m;\nvar InlineParser = (\n /** @class */\n function() {\n function InlineParser2(options) {\n this.subject = \"\";\n this.delimiters = null;\n this.brackets = null;\n this.pos = 0;\n this.lineStartNum = 0;\n this.lineIdx = 0;\n this.lineOffsets = [0];\n this.linePosOffset = 0;\n this.refMap = {};\n this.refLinkCandidateMap = {};\n this.refDefCandidateMap = {};\n this.options = options;\n }\n InlineParser2.prototype.sourcepos = function(start, end) {\n var linePosOffset = this.linePosOffset + this.lineOffsets[this.lineIdx];\n var lineNum = this.lineStartNum + this.lineIdx;\n var startpos = [lineNum, start + linePosOffset];\n if (typeof end === \"number\") {\n return [startpos, [lineNum, end + linePosOffset]];\n }\n return startpos;\n };\n InlineParser2.prototype.nextLine = function() {\n this.lineIdx += 1;\n this.linePosOffset = -this.pos;\n };\n InlineParser2.prototype.match = function(re) {\n var m = re.exec(this.subject.slice(this.pos));\n if (m === null) {\n return null;\n }\n this.pos += m.index + m[0].length;\n return m[0];\n };\n InlineParser2.prototype.peek = function() {\n if (this.pos < this.subject.length) {\n return this.subject.charCodeAt(this.pos);\n }\n return -1;\n };\n InlineParser2.prototype.spnl = function() {\n this.match(reSpnl);\n return true;\n };\n InlineParser2.prototype.parseBackticks = function(block2) {\n var startpos = this.pos + 1;\n var ticks = this.match(reTicksHere);\n if (ticks === null) {\n return false;\n }\n var afterOpenTicks = this.pos;\n var matched;\n while ((matched = this.match(reTicks)) !== null) {\n if (matched === ticks) {\n var contents = this.subject.slice(afterOpenTicks, this.pos - ticks.length);\n var sourcepos = this.sourcepos(startpos, this.pos);\n var lines = contents.split(\"\\n\");\n if (lines.length > 1) {\n var lastLine = last(lines);\n this.lineIdx += lines.length - 1;\n this.linePosOffset = -(this.pos - lastLine.length - ticks.length);\n sourcepos[1] = this.sourcepos(this.pos);\n contents = lines.join(\" \");\n }\n var node = createNode$1(\"code\", sourcepos);\n if (contents.length > 0 && contents.match(/[^ ]/) !== null && contents[0] == \" \" && contents[contents.length - 1] == \" \") {\n node.literal = contents.slice(1, contents.length - 1);\n } else {\n node.literal = contents;\n }\n node.tickCount = ticks.length;\n block2.appendChild(node);\n return true;\n }\n }\n this.pos = afterOpenTicks;\n block2.appendChild(text$1(ticks, this.sourcepos(startpos, this.pos - 1)));\n return true;\n };\n InlineParser2.prototype.parseBackslash = function(block2) {\n var subj = this.subject;\n var node;\n this.pos += 1;\n var startpos = this.pos;\n if (this.peek() === C_NEWLINE) {\n this.pos += 1;\n node = createNode$1(\"linebreak\", this.sourcepos(this.pos - 1, this.pos));\n block2.appendChild(node);\n this.nextLine();\n } else if (reEscapable.test(subj.charAt(this.pos))) {\n block2.appendChild(text$1(subj.charAt(this.pos), this.sourcepos(startpos, this.pos)));\n this.pos += 1;\n } else {\n block2.appendChild(text$1(\"\\\\\", this.sourcepos(startpos, startpos)));\n }\n return true;\n };\n InlineParser2.prototype.parseAutolink = function(block2) {\n var m;\n var dest;\n var node;\n var startpos = this.pos + 1;\n if (m = this.match(reEmailAutolink)) {\n dest = m.slice(1, m.length - 1);\n node = createNode$1(\"link\", this.sourcepos(startpos, this.pos));\n node.destination = normalizeURI(\"mailto:\" + dest);\n node.title = \"\";\n node.appendChild(text$1(dest, this.sourcepos(startpos + 1, this.pos - 1)));\n block2.appendChild(node);\n return true;\n }\n if (m = this.match(reAutolink)) {\n dest = m.slice(1, m.length - 1);\n node = createNode$1(\"link\", this.sourcepos(startpos, this.pos));\n node.destination = normalizeURI(dest);\n node.title = \"\";\n node.appendChild(text$1(dest, this.sourcepos(startpos + 1, this.pos - 1)));\n block2.appendChild(node);\n return true;\n }\n return false;\n };\n InlineParser2.prototype.parseHtmlTag = function(block2) {\n var startpos = this.pos + 1;\n var m = this.match(reHtmlTag);\n if (m === null) {\n return false;\n }\n var node = createNode$1(\"htmlInline\", this.sourcepos(startpos, this.pos));\n node.literal = m;\n block2.appendChild(node);\n return true;\n };\n InlineParser2.prototype.scanDelims = function(cc) {\n var numdelims = 0;\n var startpos = this.pos;\n if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {\n numdelims++;\n this.pos++;\n } else {\n while (this.peek() === cc) {\n numdelims++;\n this.pos++;\n }\n }\n if (numdelims === 0 || numdelims < 2 && (cc === C_TILDE || cc === C_DOLLAR)) {\n this.pos = startpos;\n return null;\n }\n var charBefore = startpos === 0 ? \"\\n\" : this.subject.charAt(startpos - 1);\n var ccAfter = this.peek();\n var charAfter;\n if (ccAfter === -1) {\n charAfter = \"\\n\";\n } else {\n charAfter = fromCodePoint$1(ccAfter);\n }\n var afterIsWhitespace = reUnicodeWhitespaceChar.test(charAfter);\n var afterIsPunctuation = rePunctuation.test(charAfter);\n var beforeIsWhitespace = reUnicodeWhitespaceChar.test(charBefore);\n var beforeIsPunctuation = rePunctuation.test(charBefore);\n var leftFlanking = !afterIsWhitespace && (!afterIsPunctuation || beforeIsWhitespace || beforeIsPunctuation);\n var rightFlanking = !beforeIsWhitespace && (!beforeIsPunctuation || afterIsWhitespace || afterIsPunctuation);\n var canOpen;\n var canClose;\n if (cc === C_UNDERSCORE) {\n canOpen = leftFlanking && (!rightFlanking || beforeIsPunctuation);\n canClose = rightFlanking && (!leftFlanking || afterIsPunctuation);\n } else if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {\n canOpen = leftFlanking && !rightFlanking;\n canClose = rightFlanking;\n } else if (cc === C_DOLLAR) {\n canOpen = !afterIsWhitespace;\n canClose = !beforeIsWhitespace;\n } else {\n canOpen = leftFlanking;\n canClose = rightFlanking;\n }\n this.pos = startpos;\n return { numdelims, canOpen, canClose };\n };\n InlineParser2.prototype.handleDelim = function(cc, block2) {\n var res = this.scanDelims(cc);\n if (!res) {\n return false;\n }\n var numdelims = res.numdelims;\n var startpos = this.pos + 1;\n var contents;\n this.pos += numdelims;\n if (cc === C_SINGLEQUOTE) {\n contents = \"\\u2019\";\n } else if (cc === C_DOUBLEQUOTE) {\n contents = \"\\u201C\";\n } else {\n contents = this.subject.slice(startpos - 1, this.pos);\n }\n var node = text$1(contents, this.sourcepos(startpos, this.pos));\n block2.appendChild(node);\n if ((res.canOpen || res.canClose) && (this.options.smart || cc !== C_SINGLEQUOTE && cc !== C_DOUBLEQUOTE)) {\n this.delimiters = {\n cc,\n numdelims,\n origdelims: numdelims,\n node,\n previous: this.delimiters,\n next: null,\n canOpen: res.canOpen,\n canClose: res.canClose\n };\n if (this.delimiters.previous) {\n this.delimiters.previous.next = this.delimiters;\n }\n }\n return true;\n };\n InlineParser2.prototype.removeDelimiter = function(delim) {\n if (delim.previous !== null) {\n delim.previous.next = delim.next;\n }\n if (delim.next === null) {\n this.delimiters = delim.previous;\n } else {\n delim.next.previous = delim.previous;\n }\n };\n InlineParser2.prototype.removeDelimitersBetween = function(bottom2, top2) {\n if (bottom2.next !== top2) {\n bottom2.next = top2;\n top2.previous = bottom2;\n }\n };\n InlineParser2.prototype.processEmphasis = function(stackBottom) {\n var _a;\n var opener;\n var closer;\n var oldCloser;\n var openerInl, closerInl;\n var openerFound;\n var oddMatch = false;\n var openersBottom = (_a = {}, _a[C_UNDERSCORE] = [stackBottom, stackBottom, stackBottom], _a[C_ASTERISK] = [stackBottom, stackBottom, stackBottom], _a[C_SINGLEQUOTE] = [stackBottom], _a[C_DOUBLEQUOTE] = [stackBottom], _a[C_TILDE] = [stackBottom], _a[C_DOLLAR] = [stackBottom], _a);\n closer = this.delimiters;\n while (closer !== null && closer.previous !== stackBottom) {\n closer = closer.previous;\n }\n while (closer !== null) {\n var closercc = closer.cc;\n var closerEmph = closercc === C_UNDERSCORE || closercc === C_ASTERISK;\n if (!closer.canClose) {\n closer = closer.next;\n } else {\n opener = closer.previous;\n openerFound = false;\n while (opener !== null && opener !== stackBottom && opener !== openersBottom[closercc][closerEmph ? closer.origdelims % 3 : 0]) {\n oddMatch = closerEmph && (closer.canOpen || opener.canClose) && closer.origdelims % 3 !== 0 && (opener.origdelims + closer.origdelims) % 3 === 0;\n if (opener.cc === closer.cc && opener.canOpen && !oddMatch) {\n openerFound = true;\n break;\n }\n opener = opener.previous;\n }\n oldCloser = closer;\n if (closerEmph || closercc === C_TILDE || closercc === C_DOLLAR) {\n if (!openerFound) {\n closer = closer.next;\n } else if (opener) {\n var useDelims = closer.numdelims >= 2 && opener.numdelims >= 2 ? 2 : 1;\n var emptyDelims = closerEmph ? 0 : 1;\n openerInl = opener.node;\n closerInl = closer.node;\n var nodeType = closerEmph ? useDelims === 1 ? \"emph\" : \"strong\" : \"strike\";\n if (closercc === C_DOLLAR) {\n nodeType = \"customInline\";\n }\n var newNode = createNode$1(nodeType);\n var openerEndPos = openerInl.sourcepos[1];\n var closerStartPos = closerInl.sourcepos[0];\n newNode.sourcepos = [\n [openerEndPos[0], openerEndPos[1] - useDelims + 1],\n [closerStartPos[0], closerStartPos[1] + useDelims - 1]\n ];\n openerInl.sourcepos[1][1] -= useDelims;\n closerInl.sourcepos[0][1] += useDelims;\n openerInl.literal = openerInl.literal.slice(useDelims);\n closerInl.literal = closerInl.literal.slice(useDelims);\n opener.numdelims -= useDelims;\n closer.numdelims -= useDelims;\n var tmp = openerInl.next;\n var next = void 0;\n while (tmp && tmp !== closerInl) {\n next = tmp.next;\n tmp.unlink();\n newNode.appendChild(tmp);\n tmp = next;\n }\n if (closercc === C_DOLLAR) {\n var textNode = newNode.firstChild;\n var literal = textNode.literal || \"\";\n var info = literal.split(/\\s/)[0];\n newNode.info = info;\n if (literal.length <= info.length) {\n textNode.unlink();\n } else {\n textNode.sourcepos[0][1] += info.length;\n textNode.literal = literal.replace(info + \" \", \"\");\n }\n }\n openerInl.insertAfter(newNode);\n this.removeDelimitersBetween(opener, closer);\n if (opener.numdelims <= emptyDelims) {\n if (opener.numdelims === 0) {\n openerInl.unlink();\n }\n this.removeDelimiter(opener);\n }\n if (closer.numdelims <= emptyDelims) {\n if (closer.numdelims === 0) {\n closerInl.unlink();\n }\n var tempstack = closer.next;\n this.removeDelimiter(closer);\n closer = tempstack;\n }\n }\n } else if (closercc === C_SINGLEQUOTE) {\n closer.node.literal = \"\\u2019\";\n if (openerFound) {\n opener.node.literal = \"\\u2018\";\n }\n closer = closer.next;\n } else if (closercc === C_DOUBLEQUOTE) {\n closer.node.literal = \"\\u201D\";\n if (openerFound) {\n opener.node.literal = \"\\u201C\";\n }\n closer = closer.next;\n }\n if (!openerFound) {\n openersBottom[closercc][closerEmph ? oldCloser.origdelims % 3 : 0] = oldCloser.previous;\n if (!oldCloser.canOpen) {\n this.removeDelimiter(oldCloser);\n }\n }\n }\n }\n while (this.delimiters !== null && this.delimiters !== stackBottom) {\n this.removeDelimiter(this.delimiters);\n }\n };\n InlineParser2.prototype.parseLinkTitle = function() {\n var title = this.match(reLinkTitle);\n if (title === null) {\n return null;\n }\n return unescapeString(title.substr(1, title.length - 2));\n };\n InlineParser2.prototype.parseLinkDestination = function() {\n var res = this.match(reLinkDestinationBraces);\n if (res === null) {\n if (this.peek() === C_LESSTHAN$1) {\n return null;\n }\n var savepos = this.pos;\n var openparens = 0;\n var c = void 0;\n while ((c = this.peek()) !== -1) {\n if (c === C_BACKSLASH && reEscapable.test(this.subject.charAt(this.pos + 1))) {\n this.pos += 1;\n if (this.peek() !== -1) {\n this.pos += 1;\n }\n } else if (c === C_OPEN_PAREN) {\n this.pos += 1;\n openparens += 1;\n } else if (c === C_CLOSE_PAREN) {\n if (openparens < 1) {\n break;\n } else {\n this.pos += 1;\n openparens -= 1;\n }\n } else if (reWhitespaceChar.exec(fromCodePoint$1(c)) !== null) {\n break;\n } else {\n this.pos += 1;\n }\n }\n if (this.pos === savepos && c !== C_CLOSE_PAREN) {\n return null;\n }\n if (openparens !== 0) {\n return null;\n }\n res = this.subject.substr(savepos, this.pos - savepos);\n return normalizeURI(unescapeString(res));\n }\n return normalizeURI(unescapeString(res.substr(1, res.length - 2)));\n };\n InlineParser2.prototype.parseLinkLabel = function() {\n var m = this.match(reLinkLabel);\n if (m === null || m.length > 1001) {\n return 0;\n }\n return m.length;\n };\n InlineParser2.prototype.parseOpenBracket = function(block2) {\n var startpos = this.pos;\n this.pos += 1;\n var node = text$1(\"[\", this.sourcepos(this.pos, this.pos));\n block2.appendChild(node);\n this.addBracket(node, startpos, false);\n return true;\n };\n InlineParser2.prototype.parseBang = function(block2) {\n var startpos = this.pos;\n this.pos += 1;\n if (this.peek() === C_OPEN_BRACKET$1) {\n this.pos += 1;\n var node = text$1(\"![\", this.sourcepos(this.pos - 1, this.pos));\n block2.appendChild(node);\n this.addBracket(node, startpos + 1, true);\n } else {\n var node = text$1(\"!\", this.sourcepos(this.pos, this.pos));\n block2.appendChild(node);\n }\n return true;\n };\n InlineParser2.prototype.parseCloseBracket = function(block2) {\n var dest = null;\n var title = null;\n var matched = false;\n this.pos += 1;\n var startpos = this.pos;\n var opener = this.brackets;\n if (opener === null) {\n block2.appendChild(text$1(\"]\", this.sourcepos(startpos, startpos)));\n return true;\n }\n if (!opener.active) {\n block2.appendChild(text$1(\"]\", this.sourcepos(startpos, startpos)));\n this.removeBracket();\n return true;\n }\n var isImage = opener.image;\n var savepos = this.pos;\n if (this.peek() === C_OPEN_PAREN) {\n this.pos++;\n if (this.spnl() && (dest = this.parseLinkDestination()) !== null && this.spnl() && // make sure there's a space before the title:\n (reWhitespaceChar.test(this.subject.charAt(this.pos - 1)) && (title = this.parseLinkTitle()) || true) && this.spnl() && this.peek() === C_CLOSE_PAREN) {\n this.pos += 1;\n matched = true;\n } else {\n this.pos = savepos;\n }\n }\n var refLabel = \"\";\n if (!matched) {\n var beforelabel = this.pos;\n var n = this.parseLinkLabel();\n if (n > 2) {\n refLabel = this.subject.slice(beforelabel, beforelabel + n);\n } else if (!opener.bracketAfter) {\n refLabel = this.subject.slice(opener.index, startpos);\n }\n if (n === 0) {\n this.pos = savepos;\n }\n if (refLabel) {\n refLabel = normalizeReference(refLabel);\n var link2 = this.refMap[refLabel];\n if (link2) {\n dest = link2.destination;\n title = link2.title;\n matched = true;\n }\n }\n }\n if (matched) {\n var node = createNode$1(isImage ? \"image\" : \"link\");\n node.destination = dest;\n node.title = title || \"\";\n node.sourcepos = [opener.startpos, this.sourcepos(this.pos)];\n var tmp = opener.node.next;\n var next = void 0;\n while (tmp) {\n next = tmp.next;\n tmp.unlink();\n node.appendChild(tmp);\n tmp = next;\n }\n block2.appendChild(node);\n this.processEmphasis(opener.previousDelimiter);\n this.removeBracket();\n opener.node.unlink();\n if (!isImage) {\n opener = this.brackets;\n while (opener !== null) {\n if (!opener.image) {\n opener.active = false;\n }\n opener = opener.previous;\n }\n }\n if (this.options.referenceDefinition) {\n this.refLinkCandidateMap[block2.id] = { node: block2, refLabel };\n }\n return true;\n }\n this.removeBracket();\n this.pos = startpos;\n block2.appendChild(text$1(\"]\", this.sourcepos(startpos, startpos)));\n if (this.options.referenceDefinition) {\n this.refLinkCandidateMap[block2.id] = { node: block2, refLabel };\n }\n return true;\n };\n InlineParser2.prototype.addBracket = function(node, index2, image2) {\n if (this.brackets !== null) {\n this.brackets.bracketAfter = true;\n }\n this.brackets = {\n node,\n startpos: this.sourcepos(index2 + (image2 ? 0 : 1)),\n previous: this.brackets,\n previousDelimiter: this.delimiters,\n index: index2,\n image: image2,\n active: true\n };\n };\n InlineParser2.prototype.removeBracket = function() {\n if (this.brackets) {\n this.brackets = this.brackets.previous;\n }\n };\n InlineParser2.prototype.parseEntity = function(block2) {\n var m;\n var startpos = this.pos + 1;\n if (m = this.match(reEntityHere)) {\n block2.appendChild(text$1(lib.decodeHTML(m), this.sourcepos(startpos, this.pos)));\n return true;\n }\n return false;\n };\n InlineParser2.prototype.parseString = function(block2) {\n var m;\n var startpos = this.pos + 1;\n if (m = this.match(reMain)) {\n if (this.options.smart) {\n var lit = m.replace(reEllipses, \"\\u2026\").replace(reDash, function(chars) {\n var enCount = 0;\n var emCount = 0;\n if (chars.length % 3 === 0) {\n emCount = chars.length / 3;\n } else if (chars.length % 2 === 0) {\n enCount = chars.length / 2;\n } else if (chars.length % 3 === 2) {\n enCount = 1;\n emCount = (chars.length - 2) / 3;\n } else {\n enCount = 2;\n emCount = (chars.length - 4) / 3;\n }\n return repeat(\"\\u2014\", emCount) + repeat(\"\\u2013\", enCount);\n });\n block2.appendChild(text$1(lit, this.sourcepos(startpos, this.pos)));\n } else {\n var node = text$1(m, this.sourcepos(startpos, this.pos));\n block2.appendChild(node);\n }\n return true;\n }\n return false;\n };\n InlineParser2.prototype.parseNewline = function(block2) {\n this.pos += 1;\n var lastc = block2.lastChild;\n if (lastc && lastc.type === \"text\" && lastc.literal[lastc.literal.length - 1] === \" \") {\n var hardbreak = lastc.literal[lastc.literal.length - 2] === \" \";\n var litLen = lastc.literal.length;\n lastc.literal = lastc.literal.replace(reFinalSpace, \"\");\n var finalSpaceLen = litLen - lastc.literal.length;\n lastc.sourcepos[1][1] -= finalSpaceLen;\n block2.appendChild(createNode$1(hardbreak ? \"linebreak\" : \"softbreak\", this.sourcepos(this.pos - finalSpaceLen, this.pos)));\n } else {\n block2.appendChild(createNode$1(\"softbreak\", this.sourcepos(this.pos, this.pos)));\n }\n this.nextLine();\n this.match(reInitialSpace);\n return true;\n };\n InlineParser2.prototype.parseReference = function(block2, refMap) {\n if (!this.options.referenceDefinition) {\n return 0;\n }\n this.subject = block2.stringContent;\n this.pos = 0;\n var title = null;\n var startpos = this.pos;\n var matchChars = this.parseLinkLabel();\n if (matchChars === 0) {\n return 0;\n }\n var rawlabel = this.subject.substr(0, matchChars);\n if (this.peek() === C_COLON) {\n this.pos++;\n } else {\n this.pos = startpos;\n return 0;\n }\n this.spnl();\n var dest = this.parseLinkDestination();\n if (dest === null) {\n this.pos = startpos;\n return 0;\n }\n var beforetitle = this.pos;\n this.spnl();\n if (this.pos !== beforetitle) {\n title = this.parseLinkTitle();\n }\n if (title === null) {\n title = \"\";\n this.pos = beforetitle;\n }\n var atLineEnd = true;\n if (this.match(reSpaceAtEndOfLine) === null) {\n if (title === \"\") {\n atLineEnd = false;\n } else {\n title = \"\";\n this.pos = beforetitle;\n atLineEnd = this.match(reSpaceAtEndOfLine) !== null;\n }\n }\n if (!atLineEnd) {\n this.pos = startpos;\n return 0;\n }\n var normalLabel = normalizeReference(rawlabel);\n if (normalLabel === \"\") {\n this.pos = startpos;\n return 0;\n }\n var sourcepos = this.getReferenceDefSourcepos(block2);\n block2.sourcepos[0][0] = sourcepos[1][0] + 1;\n var node = createNode$1(\"refDef\", sourcepos);\n node.title = title;\n node.dest = dest;\n node.label = normalLabel;\n block2.insertBefore(node);\n if (!refMap[normalLabel]) {\n refMap[normalLabel] = createRefDefState(node);\n } else {\n this.refDefCandidateMap[node.id] = node;\n }\n return this.pos - startpos;\n };\n InlineParser2.prototype.mergeTextNodes = function(walker) {\n var event;\n var textNodes = [];\n while (event = walker.next()) {\n var entering = event.entering, node = event.node;\n if (entering && node.type === \"text\") {\n textNodes.push(node);\n } else if (textNodes.length === 1) {\n textNodes = [];\n } else if (textNodes.length > 1) {\n var firstNode = textNodes[0];\n var lastNode = textNodes[textNodes.length - 1];\n if (firstNode.sourcepos && lastNode.sourcepos) {\n firstNode.sourcepos[1] = lastNode.sourcepos[1];\n }\n firstNode.next = lastNode.next;\n if (firstNode.next) {\n firstNode.next.prev = firstNode;\n }\n for (var i = 1; i < textNodes.length; i += 1) {\n firstNode.literal += textNodes[i].literal;\n textNodes[i].unlink();\n }\n textNodes = [];\n }\n }\n };\n InlineParser2.prototype.getReferenceDefSourcepos = function(block2) {\n var lines = block2.stringContent.split(/\\n|\\r\\n/);\n var passedUrlLine = false;\n var quotationCount = 0;\n var lastLineOffset = { line: 0, ch: 0 };\n for (var i = 0; i < lines.length; i += 1) {\n var line = lines[i];\n if (reWhitespaceChar.test(line)) {\n break;\n }\n if (/\\:/.test(line) && quotationCount === 0) {\n if (passedUrlLine) {\n break;\n }\n var lineOffset = line.indexOf(\":\") === line.length - 1 ? i + 1 : i;\n lastLineOffset = { line: lineOffset, ch: lines[lineOffset].length };\n passedUrlLine = true;\n }\n var matched = line.match(/'|\"/g);\n if (matched) {\n quotationCount += matched.length;\n }\n if (quotationCount === 2) {\n lastLineOffset = { line: i, ch: line.length };\n break;\n }\n }\n return [\n [block2.sourcepos[0][0], block2.sourcepos[0][1]],\n [block2.sourcepos[0][0] + lastLineOffset.line, lastLineOffset.ch]\n ];\n };\n InlineParser2.prototype.parseInline = function(block2) {\n var _a;\n var res = false;\n var c = this.peek();\n if (c === -1) {\n return false;\n }\n switch (c) {\n case C_NEWLINE:\n res = this.parseNewline(block2);\n break;\n case C_BACKSLASH:\n res = this.parseBackslash(block2);\n break;\n case C_BACKTICK:\n res = this.parseBackticks(block2);\n break;\n case C_ASTERISK:\n case C_UNDERSCORE:\n case C_TILDE:\n case C_DOLLAR:\n res = this.handleDelim(c, block2);\n break;\n case C_SINGLEQUOTE:\n case C_DOUBLEQUOTE:\n res = !!((_a = this.options) === null || _a === void 0 ? void 0 : _a.smart) && this.handleDelim(c, block2);\n break;\n case C_OPEN_BRACKET$1:\n res = this.parseOpenBracket(block2);\n break;\n case C_BANG:\n res = this.parseBang(block2);\n break;\n case C_CLOSE_BRACKET:\n res = this.parseCloseBracket(block2);\n break;\n case C_LESSTHAN$1:\n res = this.parseAutolink(block2) || this.parseHtmlTag(block2);\n break;\n case C_AMPERSAND:\n if (!block2.disabledEntityParse) {\n res = this.parseEntity(block2);\n }\n break;\n default:\n res = this.parseString(block2);\n break;\n }\n if (!res) {\n this.pos += 1;\n block2.appendChild(text$1(fromCodePoint$1(c), this.sourcepos(this.pos, this.pos + 1)));\n }\n return true;\n };\n InlineParser2.prototype.parse = function(block2) {\n this.subject = block2.stringContent.trim();\n this.pos = 0;\n this.delimiters = null;\n this.brackets = null;\n this.lineOffsets = block2.lineOffsets || [0];\n this.lineIdx = 0;\n this.linePosOffset = 0;\n this.lineStartNum = block2.sourcepos[0][0];\n if (isHeading(block2)) {\n this.lineOffsets[0] += block2.level + 1;\n }\n while (this.parseInline(block2)) {\n }\n block2.stringContent = null;\n this.processEmphasis(null);\n this.mergeTextNodes(block2.walker());\n var _a = this.options, extendedAutolinks = _a.extendedAutolinks, customParser = _a.customParser;\n if (extendedAutolinks) {\n convertExtAutoLinks(block2.walker(), extendedAutolinks);\n }\n if (customParser && block2.firstChild) {\n var event_1;\n var walker = block2.firstChild.walker();\n while (event_1 = walker.next()) {\n var node = event_1.node, entering = event_1.entering;\n if (customParser[node.type]) {\n customParser[node.type](node, { entering, options: this.options });\n }\n }\n }\n };\n return InlineParser2;\n }()\n);\nvar reTaskListItemMarker = /^\\[([ \\txX])\\][ \\t]+/;\nfunction taskListItemFinalize(_, block2) {\n if (block2.firstChild && block2.firstChild.type === \"paragraph\") {\n var p = block2.firstChild;\n var m = p.stringContent.match(reTaskListItemMarker);\n if (m) {\n var mLen = m[0].length;\n p.stringContent = p.stringContent.substring(mLen - 1);\n p.sourcepos[0][1] += mLen;\n p.lineOffsets[0] += mLen;\n block2.listData.task = true;\n block2.listData.checked = /[xX]/.test(m[1]);\n }\n }\n}\nvar table = {\n continue: function() {\n return 0;\n },\n finalize: function() {\n },\n canContain: function(t) {\n return t === \"tableHead\" || t === \"tableBody\";\n },\n acceptsLines: false\n};\nvar tableBody$1 = {\n continue: function() {\n return 0;\n },\n finalize: function() {\n },\n canContain: function(t) {\n return t === \"tableRow\";\n },\n acceptsLines: false\n};\nvar tableHead$1 = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function(t) {\n return t === \"tableRow\" || t === \"tableDelimRow\";\n },\n acceptsLines: false\n};\nvar tableDelimRow = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function(t) {\n return t === \"tableDelimCell\";\n },\n acceptsLines: false\n};\nvar tableDelimCell = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function() {\n return false;\n },\n acceptsLines: false\n};\nvar tableRow = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function(t) {\n return t === \"tableCell\";\n },\n acceptsLines: false\n};\nvar tableCell = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function() {\n return false;\n },\n acceptsLines: false\n};\nvar CODE_INDENT = 4;\nvar C_TAB = 9;\nvar C_GREATERTHAN = 62;\nvar C_LESSTHAN = 60;\nvar C_SPACE = 32;\nvar C_OPEN_BRACKET = 91;\nvar reNonSpace = /[^ \\t\\f\\v\\r\\n]/;\nvar reClosingCodeFence = /^(?:`{3,}|~{3,})(?= *$)/;\nfunction endsWithBlankLine(block2) {\n var curBlock = block2;\n while (curBlock) {\n if (curBlock.lastLineBlank) {\n return true;\n }\n var t = curBlock.type;\n if (!curBlock.lastLineChecked && (t === \"list\" || t === \"item\")) {\n curBlock.lastLineChecked = true;\n curBlock = curBlock.lastChild;\n } else {\n curBlock.lastLineChecked = true;\n break;\n }\n }\n return false;\n}\nfunction peek(ln, pos) {\n if (pos < ln.length) {\n return ln.charCodeAt(pos);\n }\n return -1;\n}\nfunction isBlank(s) {\n return !reNonSpace.test(s);\n}\nfunction isSpaceOrTab(c) {\n return c === C_SPACE || c === C_TAB;\n}\nvar reClosingCustomBlock = /^\\$\\$$/;\nvar customBlock$1 = {\n continue: function(parser, container) {\n var line = parser.currentLine;\n var match = line.match(reClosingCustomBlock);\n if (match) {\n parser.lastLineLength = match[0].length;\n parser.finalize(container, parser.lineNumber);\n return 2;\n }\n var i = container.offset;\n while (i > 0 && isSpaceOrTab(peek(line, parser.offset))) {\n parser.advanceOffset(1, true);\n i--;\n }\n return 0;\n },\n finalize: function(_, block2) {\n if (block2.stringContent === null) {\n return;\n }\n var content = block2.stringContent;\n var newlinePos = content.indexOf(\"\\n\");\n var firstLine = content.slice(0, newlinePos);\n var rest = content.slice(newlinePos + 1);\n var infoString = firstLine.match(/^(\\s*)(.*)/);\n block2.info = unescapeString(infoString[2].trim());\n block2.literal = rest;\n block2.stringContent = null;\n },\n canContain: function() {\n return false;\n },\n acceptsLines: true\n};\nvar noop = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function() {\n return false;\n },\n acceptsLines: true\n};\nvar document$1 = {\n continue: function() {\n return 0;\n },\n finalize: function() {\n },\n canContain: function(t) {\n return t !== \"item\";\n },\n acceptsLines: false\n};\nvar list = {\n continue: function() {\n return 0;\n },\n finalize: function(_, block2) {\n var item2 = block2.firstChild;\n while (item2) {\n if (endsWithBlankLine(item2) && item2.next) {\n block2.listData.tight = false;\n break;\n }\n var subitem = item2.firstChild;\n while (subitem) {\n if (endsWithBlankLine(subitem) && (item2.next || subitem.next)) {\n block2.listData.tight = false;\n break;\n }\n subitem = subitem.next;\n }\n item2 = item2.next;\n }\n },\n canContain: function(t) {\n return t === \"item\";\n },\n acceptsLines: false\n};\nvar blockQuote$1 = {\n continue: function(parser) {\n var ln = parser.currentLine;\n if (!parser.indented && peek(ln, parser.nextNonspace) === C_GREATERTHAN) {\n parser.advanceNextNonspace();\n parser.advanceOffset(1, false);\n if (isSpaceOrTab(peek(ln, parser.offset))) {\n parser.advanceOffset(1, true);\n }\n } else {\n return 1;\n }\n return 0;\n },\n finalize: function() {\n },\n canContain: function(t) {\n return t !== \"item\";\n },\n acceptsLines: false\n};\nvar item = {\n continue: function(parser, container) {\n if (parser.blank) {\n if (container.firstChild === null) {\n return 1;\n }\n parser.advanceNextNonspace();\n } else if (parser.indent >= container.listData.markerOffset + container.listData.padding) {\n parser.advanceOffset(container.listData.markerOffset + container.listData.padding, true);\n } else {\n return 1;\n }\n return 0;\n },\n finalize: taskListItemFinalize,\n canContain: function(t) {\n return t !== \"item\";\n },\n acceptsLines: false\n};\nvar heading = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function() {\n return false;\n },\n acceptsLines: false\n};\nvar thematicBreak$1 = {\n continue: function() {\n return 1;\n },\n finalize: function() {\n },\n canContain: function() {\n return false;\n },\n acceptsLines: false\n};\nvar codeBlock = {\n continue: function(parser, container) {\n var ln = parser.currentLine;\n var indent2 = parser.indent;\n if (container.isFenced) {\n var match = indent2 <= 3 && ln.charAt(parser.nextNonspace) === container.fenceChar && ln.slice(parser.nextNonspace).match(reClosingCodeFence);\n if (match && match[0].length >= container.fenceLength) {\n parser.lastLineLength = parser.offset + indent2 + match[0].length;\n parser.finalize(container, parser.lineNumber);\n return 2;\n }\n var i = container.fenceOffset;\n while (i > 0 && isSpaceOrTab(peek(ln, parser.offset))) {\n parser.advanceOffset(1, true);\n i--;\n }\n } else {\n if (indent2 >= CODE_INDENT) {\n parser.advanceOffset(CODE_INDENT, true);\n } else if (parser.blank) {\n parser.advanceNextNonspace();\n } else {\n return 1;\n }\n }\n return 0;\n },\n finalize: function(_, block2) {\n var _a;\n if (block2.stringContent === null) {\n return;\n }\n if (block2.isFenced) {\n var content = block2.stringContent;\n var newlinePos = content.indexOf(\"\\n\");\n var firstLine = content.slice(0, newlinePos);\n var rest = content.slice(newlinePos + 1);\n var infoString = firstLine.match(/^(\\s*)(.*)/);\n block2.infoPadding = infoString[1].length;\n block2.info = unescapeString(infoString[2].trim());\n block2.literal = rest;\n } else {\n block2.literal = (_a = block2.stringContent) === null || _a === void 0 ? void 0 : _a.replace(/(\\n *)+$/, \"\\n\");\n }\n block2.stringContent = null;\n },\n canContain: function() {\n return false;\n },\n acceptsLines: true\n};\nvar htmlBlock$1 = {\n continue: function(parser, container) {\n return parser.blank && (container.htmlBlockType === 6 || container.htmlBlockType === 7) ? 1 : 0;\n },\n finalize: function(_, block2) {\n var _a;\n block2.literal = ((_a = block2.stringContent) === null || _a === void 0 ? void 0 : _a.replace(/(\\n *)+$/, \"\")) || null;\n block2.stringContent = null;\n },\n canContain: function() {\n return false;\n },\n acceptsLines: true\n};\nvar paragraph = {\n continue: function(parser) {\n return parser.blank ? 1 : 0;\n },\n finalize: function(parser, block2) {\n if (block2.stringContent === null) {\n return;\n }\n var pos;\n var hasReferenceDefs = false;\n while (peek(block2.stringContent, 0) === C_OPEN_BRACKET && (pos = parser.inlineParser.parseReference(block2, parser.refMap))) {\n block2.stringContent = block2.stringContent.slice(pos);\n hasReferenceDefs = true;\n }\n if (hasReferenceDefs && isBlank(block2.stringContent)) {\n block2.unlink();\n }\n },\n canContain: function() {\n return false;\n },\n acceptsLines: true\n};\nvar refDef = noop;\nvar frontMatter$2 = noop;\nvar blockHandlers = {\n document: document$1,\n list,\n blockQuote: blockQuote$1,\n item,\n heading,\n thematicBreak: thematicBreak$1,\n codeBlock,\n htmlBlock: htmlBlock$1,\n paragraph,\n table,\n tableBody: tableBody$1,\n tableHead: tableHead$1,\n tableRow,\n tableCell,\n tableDelimRow,\n tableDelimCell,\n refDef,\n customBlock: customBlock$1,\n frontMatter: frontMatter$2\n};\nfunction parseRowContent(content) {\n var startIdx = 0;\n var offset = 0;\n var cells = [];\n for (var i = 0; i < content.length; i += 1) {\n if (content[i] === \"|\" && content[i - 1] !== \"\\\\\") {\n var cell = content.substring(startIdx, i);\n if (startIdx === 0 && isEmpty(cell)) {\n offset = i + 1;\n } else {\n cells.push(cell);\n }\n startIdx = i + 1;\n }\n }\n if (startIdx < content.length) {\n var cell = content.substring(startIdx, content.length);\n if (!isEmpty(cell)) {\n cells.push(cell);\n }\n }\n return [offset, cells];\n}\nfunction generateTableCells(cellType, contents, lineNum, chPos) {\n var cells = [];\n for (var _i = 0, contents_1 = contents; _i < contents_1.length; _i++) {\n var content = contents_1[_i];\n var preSpaces = content.match(/^[ \\t]+/);\n var paddingLeft = preSpaces ? preSpaces[0].length : 0;\n var paddingRight = void 0, trimmed = void 0;\n if (paddingLeft === content.length) {\n paddingLeft = 0;\n paddingRight = 0;\n trimmed = \"\";\n } else {\n var postSpaces = content.match(/[ \\t]+$/);\n paddingRight = postSpaces ? postSpaces[0].length : 0;\n trimmed = content.slice(paddingLeft, content.length - paddingRight);\n }\n var chPosStart = chPos + paddingLeft;\n var tableCell2 = createNode$1(cellType, [\n [lineNum, chPos],\n [lineNum, chPos + content.length - 1]\n ]);\n tableCell2.stringContent = trimmed.replace(/\\\\\\|/g, \"|\");\n tableCell2.startIdx = cells.length;\n tableCell2.endIdx = cells.length;\n tableCell2.lineOffsets = [chPosStart - 1];\n tableCell2.paddingLeft = paddingLeft;\n tableCell2.paddingRight = paddingRight;\n cells.push(tableCell2);\n chPos += content.length + 1;\n }\n return cells;\n}\nfunction getColumnFromDelimCell(cellNode) {\n var align = null;\n var content = cellNode.stringContent;\n var firstCh = content[0];\n var lastCh = content[content.length - 1];\n if (lastCh === \":\") {\n align = firstCh === \":\" ? \"center\" : \"right\";\n } else if (firstCh === \":\") {\n align = \"left\";\n }\n return { align };\n}\nvar tableHead = function(parser, container) {\n var stringContent = container.stringContent;\n if (container.type === \"paragraph\" && !parser.indented && !parser.blank) {\n var lastNewLineIdx = stringContent.length - 1;\n var lastLineStartIdx = stringContent.lastIndexOf(\"\\n\", lastNewLineIdx - 1) + 1;\n var headerContent = stringContent.slice(lastLineStartIdx, lastNewLineIdx);\n var delimContent = parser.currentLine.slice(parser.nextNonspace);\n var _a = parseRowContent(headerContent), headerOffset = _a[0], headerCells = _a[1];\n var _b = parseRowContent(delimContent), delimOffset = _b[0], delimCells = _b[1];\n var reValidDelimCell_1 = /^[ \\t]*:?-+:?[ \\t]*$/;\n if (\n // not checking if the number of header cells and delimiter cells are the same\n // to consider the case of merged-column (via plugin)\n !headerCells.length || !delimCells.length || delimCells.some(function(cell) {\n return !reValidDelimCell_1.test(cell);\n }) || // to prevent to regard setTextHeading as tabel delim cell with 'disallowDeepHeading' option\n delimCells.length === 1 && delimContent.indexOf(\"|\") !== 0\n ) {\n return 0;\n }\n var lineOffsets = container.lineOffsets;\n var firstLineNum = parser.lineNumber - 1;\n var firstLineStart = last(lineOffsets) + 1;\n var table2 = createNode$1(\"table\", [\n [firstLineNum, firstLineStart],\n [parser.lineNumber, parser.offset]\n ]);\n table2.columns = delimCells.map(function() {\n return { align: null };\n });\n container.insertAfter(table2);\n if (lineOffsets.length === 1) {\n container.unlink();\n } else {\n container.stringContent = stringContent.slice(0, lastLineStartIdx);\n var paraLastLineStartIdx = stringContent.lastIndexOf(\"\\n\", lastLineStartIdx - 2) + 1;\n var paraLastLineLen = lastLineStartIdx - paraLastLineStartIdx - 1;\n parser.lastLineLength = lineOffsets[lineOffsets.length - 2] + paraLastLineLen;\n parser.finalize(container, firstLineNum - 1);\n }\n parser.advanceOffset(parser.currentLine.length - parser.offset, false);\n var tableHead_1 = createNode$1(\"tableHead\", [\n [firstLineNum, firstLineStart],\n [parser.lineNumber, parser.offset]\n ]);\n table2.appendChild(tableHead_1);\n var tableHeadRow_1 = createNode$1(\"tableRow\", [\n [firstLineNum, firstLineStart],\n [firstLineNum, firstLineStart + headerContent.length - 1]\n ]);\n var tableDelimRow_1 = createNode$1(\"tableDelimRow\", [\n [parser.lineNumber, parser.nextNonspace + 1],\n [parser.lineNumber, parser.offset]\n ]);\n tableHead_1.appendChild(tableHeadRow_1);\n tableHead_1.appendChild(tableDelimRow_1);\n generateTableCells(\"tableCell\", headerCells, firstLineNum, firstLineStart + headerOffset).forEach(function(cellNode) {\n tableHeadRow_1.appendChild(cellNode);\n });\n var delimCellNodes = generateTableCells(\"tableDelimCell\", delimCells, parser.lineNumber, parser.nextNonspace + 1 + delimOffset);\n delimCellNodes.forEach(function(cellNode) {\n tableDelimRow_1.appendChild(cellNode);\n });\n table2.columns = delimCellNodes.map(getColumnFromDelimCell);\n parser.tip = table2;\n return 2;\n }\n return 0;\n};\nvar tableBody = function(parser, container) {\n if (container.type !== \"table\" && container.type !== \"tableBody\" || !parser.blank && parser.currentLine.indexOf(\"|\") === -1) {\n return 0;\n }\n parser.advanceOffset(parser.currentLine.length - parser.offset, false);\n if (parser.blank) {\n var table_1 = container;\n if (container.type === \"tableBody\") {\n table_1 = container.parent;\n parser.finalize(container, parser.lineNumber - 1);\n }\n parser.finalize(table_1, parser.lineNumber - 1);\n return 0;\n }\n var tableBody2 = container;\n if (container.type === \"table\") {\n tableBody2 = parser.addChild(\"tableBody\", parser.nextNonspace);\n tableBody2.stringContent = null;\n }\n var tableRow2 = createNode$1(\"tableRow\", [\n [parser.lineNumber, parser.nextNonspace + 1],\n [parser.lineNumber, parser.currentLine.length]\n ]);\n tableBody2.appendChild(tableRow2);\n var table2 = tableBody2.parent;\n var content = parser.currentLine.slice(parser.nextNonspace);\n var _a = parseRowContent(content), offset = _a[0], cellContents = _a[1];\n generateTableCells(\"tableCell\", cellContents, parser.lineNumber, parser.nextNonspace + 1 + offset).forEach(function(cellNode, idx) {\n if (idx >= table2.columns.length) {\n cellNode.ignored = true;\n }\n tableRow2.appendChild(cellNode);\n });\n return 2;\n};\nvar reCustomBlock = /^(\\$\\$)(\\s*[a-zA-Z])+/;\nvar reCanBeCustomInline = /^(\\$\\$)(\\s*[a-zA-Z])+.*(\\$\\$)/;\nvar customBlock = function(parser) {\n var match;\n if (!parser.indented && !reCanBeCustomInline.test(parser.currentLine) && (match = parser.currentLine.match(reCustomBlock))) {\n var syntaxLength = match[1].length;\n parser.closeUnmatchedBlocks();\n var container = parser.addChild(\"customBlock\", parser.nextNonspace);\n container.syntaxLength = syntaxLength;\n container.offset = parser.indent;\n parser.advanceNextNonspace();\n parser.advanceOffset(syntaxLength, false);\n return 2;\n }\n return 0;\n};\nvar reCodeFence = /^`{3,}(?!.*`)|^~{3,}/;\nvar reHtmlBlockOpen = [\n /./,\n /^<(?:script|pre|style)(?:\\s|>|$)/i,\n /^/,\n /\\?>/,\n />/,\n /\\]\\]>/\n];\nvar reMaybeSpecial = /^[#`~*+_=<>0-9-;$]/;\nvar reLineEnding$1 = /\\r\\n|\\n|\\r/;\nfunction document$2() {\n return createNode$1(\"document\", [\n [1, 1],\n [0, 0]\n ]);\n}\nvar defaultOptions$1 = {\n smart: false,\n tagFilter: false,\n extendedAutolinks: false,\n disallowedHtmlBlockTags: [],\n referenceDefinition: false,\n disallowDeepHeading: false,\n customParser: null,\n frontMatter: false\n};\nvar Parser = (\n /** @class */\n function() {\n function Parser2(options) {\n this.options = __assign(__assign({}, defaultOptions$1), options);\n this.doc = document$2();\n this.tip = this.doc;\n this.oldtip = this.doc;\n this.lineNumber = 0;\n this.offset = 0;\n this.column = 0;\n this.nextNonspace = 0;\n this.nextNonspaceColumn = 0;\n this.indent = 0;\n this.currentLine = \"\";\n this.indented = false;\n this.blank = false;\n this.partiallyConsumedTab = false;\n this.allClosed = true;\n this.lastMatchedContainer = this.doc;\n this.refMap = {};\n this.refLinkCandidateMap = {};\n this.refDefCandidateMap = {};\n this.lastLineLength = 0;\n this.lines = [];\n if (this.options.frontMatter) {\n blockHandlers.frontMatter = frontMatter;\n blockStarts.unshift(frontMatter$1);\n }\n this.inlineParser = new InlineParser(this.options);\n }\n Parser2.prototype.advanceOffset = function(count, columns) {\n if (columns === void 0) {\n columns = false;\n }\n var currentLine = this.currentLine;\n var charsToTab, charsToAdvance;\n var c;\n while (count > 0 && (c = currentLine[this.offset])) {\n if (c === \"\t\") {\n charsToTab = 4 - this.column % 4;\n if (columns) {\n this.partiallyConsumedTab = charsToTab > count;\n charsToAdvance = charsToTab > count ? count : charsToTab;\n this.column += charsToAdvance;\n this.offset += this.partiallyConsumedTab ? 0 : 1;\n count -= charsToAdvance;\n } else {\n this.partiallyConsumedTab = false;\n this.column += charsToTab;\n this.offset += 1;\n count -= 1;\n }\n } else {\n this.partiallyConsumedTab = false;\n this.offset += 1;\n this.column += 1;\n count -= 1;\n }\n }\n };\n Parser2.prototype.advanceNextNonspace = function() {\n this.offset = this.nextNonspace;\n this.column = this.nextNonspaceColumn;\n this.partiallyConsumedTab = false;\n };\n Parser2.prototype.findNextNonspace = function() {\n var currentLine = this.currentLine;\n var i = this.offset;\n var cols = this.column;\n var c;\n while ((c = currentLine.charAt(i)) !== \"\") {\n if (c === \" \") {\n i++;\n cols++;\n } else if (c === \"\t\") {\n i++;\n cols += 4 - cols % 4;\n } else {\n break;\n }\n }\n this.blank = c === \"\\n\" || c === \"\\r\" || c === \"\";\n this.nextNonspace = i;\n this.nextNonspaceColumn = cols;\n this.indent = this.nextNonspaceColumn - this.column;\n this.indented = this.indent >= CODE_INDENT;\n };\n Parser2.prototype.addLine = function() {\n if (this.partiallyConsumedTab) {\n this.offset += 1;\n var charsToTab = 4 - this.column % 4;\n this.tip.stringContent += repeat(\" \", charsToTab);\n }\n if (this.tip.lineOffsets) {\n this.tip.lineOffsets.push(this.offset);\n } else {\n this.tip.lineOffsets = [this.offset];\n }\n this.tip.stringContent += this.currentLine.slice(this.offset) + \"\\n\";\n };\n Parser2.prototype.addChild = function(tag, offset) {\n while (!blockHandlers[this.tip.type].canContain(tag)) {\n this.finalize(this.tip, this.lineNumber - 1);\n }\n var columnNumber = offset + 1;\n var newBlock = createNode$1(tag, [\n [this.lineNumber, columnNumber],\n [0, 0]\n ]);\n newBlock.stringContent = \"\";\n this.tip.appendChild(newBlock);\n this.tip = newBlock;\n return newBlock;\n };\n Parser2.prototype.closeUnmatchedBlocks = function() {\n if (!this.allClosed) {\n while (this.oldtip !== this.lastMatchedContainer) {\n var parent_1 = this.oldtip.parent;\n this.finalize(this.oldtip, this.lineNumber - 1);\n this.oldtip = parent_1;\n }\n this.allClosed = true;\n }\n };\n Parser2.prototype.finalize = function(block2, lineNumber) {\n var above = block2.parent;\n block2.open = false;\n block2.sourcepos[1] = [lineNumber, this.lastLineLength];\n blockHandlers[block2.type].finalize(this, block2);\n this.tip = above;\n };\n Parser2.prototype.processInlines = function(block2) {\n var event;\n var customParser = this.options.customParser;\n var walker = block2.walker();\n this.inlineParser.refMap = this.refMap;\n this.inlineParser.refLinkCandidateMap = this.refLinkCandidateMap;\n this.inlineParser.refDefCandidateMap = this.refDefCandidateMap;\n this.inlineParser.options = this.options;\n while (event = walker.next()) {\n var node = event.node, entering = event.entering;\n var t = node.type;\n if (customParser && customParser[t]) {\n customParser[t](node, { entering, options: this.options });\n }\n if (!entering && (t === \"paragraph\" || t === \"heading\" || t === \"tableCell\" && !node.ignored)) {\n this.inlineParser.parse(node);\n }\n }\n };\n Parser2.prototype.incorporateLine = function(ln) {\n var container = this.doc;\n this.oldtip = this.tip;\n this.offset = 0;\n this.column = 0;\n this.blank = false;\n this.partiallyConsumedTab = false;\n this.lineNumber += 1;\n if (ln.indexOf(\"\\0\") !== -1) {\n ln = ln.replace(/\\0/g, \"\\uFFFD\");\n }\n this.currentLine = ln;\n var allMatched = true;\n var lastChild;\n while ((lastChild = container.lastChild) && lastChild.open) {\n container = lastChild;\n this.findNextNonspace();\n switch (blockHandlers[container.type][\"continue\"](this, container)) {\n case 0:\n break;\n case 1:\n allMatched = false;\n break;\n case 2:\n this.lastLineLength = ln.length;\n return;\n default:\n throw new Error(\"continue returned illegal value, must be 0, 1, or 2\");\n }\n if (!allMatched) {\n container = container.parent;\n break;\n }\n }\n this.allClosed = container === this.oldtip;\n this.lastMatchedContainer = container;\n var matchedLeaf = container.type !== \"paragraph\" && blockHandlers[container.type].acceptsLines;\n var blockStartsLen = blockStarts.length;\n while (!matchedLeaf) {\n this.findNextNonspace();\n if (container.type !== \"table\" && container.type !== \"tableBody\" && container.type !== \"paragraph\" && !this.indented && !reMaybeSpecial.test(ln.slice(this.nextNonspace))) {\n this.advanceNextNonspace();\n break;\n }\n var i = 0;\n while (i < blockStartsLen) {\n var res = blockStarts[i](this, container);\n if (res === 1) {\n container = this.tip;\n break;\n } else if (res === 2) {\n container = this.tip;\n matchedLeaf = true;\n break;\n } else {\n i++;\n }\n }\n if (i === blockStartsLen) {\n this.advanceNextNonspace();\n break;\n }\n }\n if (!this.allClosed && !this.blank && this.tip.type === \"paragraph\") {\n this.addLine();\n } else {\n this.closeUnmatchedBlocks();\n if (this.blank && container.lastChild) {\n container.lastChild.lastLineBlank = true;\n }\n var t = container.type;\n var lastLineBlank = this.blank && !(t === \"blockQuote\" || isCodeBlock(container) && container.isFenced || t === \"item\" && !container.firstChild && container.sourcepos[0][0] === this.lineNumber);\n var cont = container;\n while (cont) {\n cont.lastLineBlank = lastLineBlank;\n cont = cont.parent;\n }\n if (blockHandlers[t].acceptsLines) {\n this.addLine();\n if (isHtmlBlock(container) && container.htmlBlockType >= 1 && container.htmlBlockType <= 5 && reHtmlBlockClose[container.htmlBlockType].test(this.currentLine.slice(this.offset))) {\n this.lastLineLength = ln.length;\n this.finalize(container, this.lineNumber);\n }\n } else if (this.offset < ln.length && !this.blank) {\n container = this.addChild(\"paragraph\", this.offset);\n this.advanceNextNonspace();\n this.addLine();\n }\n }\n this.lastLineLength = ln.length;\n };\n Parser2.prototype.parse = function(input, lineTexts) {\n this.doc = document$2();\n this.tip = this.doc;\n this.lineNumber = 0;\n this.lastLineLength = 0;\n this.offset = 0;\n this.column = 0;\n this.lastMatchedContainer = this.doc;\n this.currentLine = \"\";\n var lines = input.split(reLineEnding$1);\n var len = lines.length;\n this.lines = lineTexts ? lineTexts : lines;\n if (this.options.referenceDefinition) {\n this.clearRefMaps();\n }\n if (input.charCodeAt(input.length - 1) === C_NEWLINE) {\n len -= 1;\n }\n for (var i = 0; i < len; i++) {\n this.incorporateLine(lines[i]);\n }\n while (this.tip) {\n this.finalize(this.tip, len);\n }\n this.processInlines(this.doc);\n return this.doc;\n };\n Parser2.prototype.partialParseStart = function(lineNumber, lines) {\n this.doc = document$2();\n this.tip = this.doc;\n this.lineNumber = lineNumber - 1;\n this.lastLineLength = 0;\n this.offset = 0;\n this.column = 0;\n this.lastMatchedContainer = this.doc;\n this.currentLine = \"\";\n var len = lines.length;\n for (var i = 0; i < len; i++) {\n this.incorporateLine(lines[i]);\n }\n return this.doc;\n };\n Parser2.prototype.partialParseExtends = function(lines) {\n for (var i = 0; i < lines.length; i++) {\n this.incorporateLine(lines[i]);\n }\n };\n Parser2.prototype.partialParseFinish = function() {\n while (this.tip) {\n this.finalize(this.tip, this.lineNumber);\n }\n this.processInlines(this.doc);\n };\n Parser2.prototype.setRefMaps = function(refMap, refLinkCandidateMap, refDefCandidateMap) {\n this.refMap = refMap;\n this.refLinkCandidateMap = refLinkCandidateMap;\n this.refDefCandidateMap = refDefCandidateMap;\n };\n Parser2.prototype.clearRefMaps = function() {\n [this.refMap, this.refLinkCandidateMap, this.refDefCandidateMap].forEach(function(map2) {\n clearObj(map2);\n });\n };\n return Parser2;\n }()\n);\nfunction comparePos(p1, p2) {\n if (p1[0] < p2[0]) {\n return 1;\n }\n if (p1[0] > p2[0]) {\n return -1;\n }\n if (p1[1] < p2[1]) {\n return 1;\n }\n if (p1[1] > p2[1]) {\n return -1;\n }\n return 0;\n}\nfunction compareRangeAndPos(_a, pos) {\n var startPos = _a[0], endPos = _a[1];\n if (comparePos(endPos, pos) === 1) {\n return 1;\n }\n if (comparePos(startPos, pos) === -1) {\n return -1;\n }\n return 0;\n}\nfunction removeNextUntil(node, last2) {\n if (node.parent !== last2.parent || node === last2) {\n return;\n }\n var next = node.next;\n while (next && next !== last2) {\n var temp = next.next;\n for (var _i = 0, _a = [\"parent\", \"prev\", \"next\"]; _i < _a.length; _i++) {\n var type = _a[_i];\n if (next[type]) {\n removeNodeById(next[type].id);\n next[type] = null;\n }\n }\n next = temp;\n }\n node.next = last2.next;\n if (last2.next) {\n last2.next.prev = node;\n } else {\n node.parent.lastChild = node;\n }\n}\nfunction getChildNodes(parent) {\n var nodes = [];\n var curr = parent.firstChild;\n while (curr) {\n nodes.push(curr);\n curr = curr.next;\n }\n return nodes;\n}\nfunction insertNodesBefore(target2, nodes) {\n for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {\n var node = nodes_1[_i];\n target2.insertBefore(node);\n }\n}\nfunction prependChildNodes(parent, nodes) {\n for (var i = nodes.length - 1; i >= 0; i -= 1) {\n parent.prependChild(nodes[i]);\n }\n}\nfunction updateNextLineNumbers(base, diff2) {\n if (!base || !base.parent || diff2 === 0) {\n return;\n }\n var walker = base.parent.walker();\n walker.resumeAt(base, true);\n var event;\n while (event = walker.next()) {\n var node = event.node, entering = event.entering;\n if (entering) {\n node.sourcepos[0][0] += diff2;\n node.sourcepos[1][0] += diff2;\n }\n }\n}\nfunction compareRangeAndLine(_a, line) {\n var startPos = _a[0], endPos = _a[1];\n if (endPos[0] < line) {\n return 1;\n }\n if (startPos[0] > line) {\n return -1;\n }\n return 0;\n}\nfunction findChildNodeAtLine(parent, line) {\n var node = parent.firstChild;\n while (node) {\n var comp2 = compareRangeAndLine(node.sourcepos, line);\n if (comp2 === 0) {\n return node;\n }\n if (comp2 === -1) {\n return node.prev || node;\n }\n node = node.next;\n }\n return parent.lastChild;\n}\nfunction lastLeafNode(node) {\n while (node.lastChild) {\n node = node.lastChild;\n }\n return node;\n}\nfunction sameLineTopAncestor(node) {\n while (node.parent && node.parent.type !== \"document\" && node.parent.sourcepos[0][0] === node.sourcepos[0][0]) {\n node = node.parent;\n }\n return node;\n}\nfunction findFirstNodeAtLine(parent, line) {\n var node = parent.firstChild;\n var prev = null;\n while (node) {\n var comp2 = compareRangeAndLine(node.sourcepos, line);\n if (comp2 === 0) {\n if (node.sourcepos[0][0] === line || !node.firstChild) {\n return node;\n }\n prev = node;\n node = node.firstChild;\n } else if (comp2 === -1) {\n break;\n } else {\n prev = node;\n node = node.next;\n }\n }\n if (prev) {\n return sameLineTopAncestor(lastLeafNode(prev));\n }\n return null;\n}\nfunction findNodeAtPosition(parent, pos) {\n var node = parent;\n var prev = null;\n while (node) {\n var comp2 = compareRangeAndPos(node.sourcepos, pos);\n if (comp2 === 0) {\n if (node.firstChild) {\n prev = node;\n node = node.firstChild;\n } else {\n return node;\n }\n } else if (comp2 === -1) {\n return prev;\n } else if (node.next) {\n node = node.next;\n } else {\n return prev;\n }\n }\n return node;\n}\nfunction findNodeById(id) {\n return getNodeById(id) || null;\n}\nfunction invokeNextUntil(callback, start, end) {\n if (end === void 0) {\n end = null;\n }\n if (start) {\n var walker = start.walker();\n while (start && start !== end) {\n callback(start);\n var next = walker.next();\n if (next) {\n start = next.node;\n } else {\n break;\n }\n }\n }\n}\nfunction isUnlinked(id) {\n var node = findNodeById(id);\n if (!node) {\n return true;\n }\n while (node && node.type !== \"document\") {\n if (!node.parent && !node.prev && !node.next) {\n return true;\n }\n node = node.parent;\n }\n return false;\n}\nvar reLineEnding = /\\r\\n|\\n|\\r/;\nfunction canBeContinuedListItem(lineText) {\n var spaceMatch = lineText.match(/^[ \\t]+/);\n if (spaceMatch && (spaceMatch[0].length >= 2 || /\\t/.test(spaceMatch[0]))) {\n return true;\n }\n var leftTrimmed = spaceMatch ? lineText.slice(spaceMatch.length) : lineText;\n return reBulletListMarker.test(leftTrimmed) || reOrderedListMarker.test(leftTrimmed);\n}\nfunction canBeContinuedTableBody(lineText) {\n return !isBlank(lineText) && lineText.indexOf(\"|\") !== -1;\n}\nfunction createRefDefState(node) {\n var id = node.id, title = node.title, sourcepos = node.sourcepos, dest = node.dest;\n return {\n id,\n title,\n sourcepos,\n unlinked: false,\n destination: dest\n };\n}\nvar ToastMark = (\n /** @class */\n function() {\n function ToastMark2(contents, options) {\n this.refMap = {};\n this.refLinkCandidateMap = {};\n this.refDefCandidateMap = {};\n this.referenceDefinition = !!(options === null || options === void 0 ? void 0 : options.referenceDefinition);\n this.parser = new Parser(options);\n this.parser.setRefMaps(this.refMap, this.refLinkCandidateMap, this.refDefCandidateMap);\n this.eventHandlerMap = { change: [] };\n contents = contents || \"\";\n this.lineTexts = contents.split(reLineEnding);\n this.root = this.parser.parse(contents, this.lineTexts);\n }\n ToastMark2.prototype.updateLineTexts = function(startPos, endPos, newText) {\n var _a;\n var startLine = startPos[0], startCol = startPos[1];\n var endLine = endPos[0], endCol = endPos[1];\n var newLines = newText.split(reLineEnding);\n var newLineLen = newLines.length;\n var startLineText = this.lineTexts[startLine - 1];\n var endLineText = this.lineTexts[endLine - 1];\n newLines[0] = startLineText.slice(0, startCol - 1) + newLines[0];\n newLines[newLineLen - 1] = newLines[newLineLen - 1] + endLineText.slice(endCol - 1);\n var removedLineLen = endLine - startLine + 1;\n (_a = this.lineTexts).splice.apply(_a, __spreadArray([startLine - 1, removedLineLen], newLines));\n return newLineLen - removedLineLen;\n };\n ToastMark2.prototype.updateRootNodeState = function() {\n if (this.lineTexts.length === 1 && this.lineTexts[0] === \"\") {\n this.root.lastLineBlank = true;\n this.root.sourcepos = [\n [1, 1],\n [1, 0]\n ];\n return;\n }\n if (this.root.lastChild) {\n this.root.lastLineBlank = this.root.lastChild.lastLineBlank;\n }\n var lineTexts = this.lineTexts;\n var idx = lineTexts.length - 1;\n while (lineTexts[idx] === \"\") {\n idx -= 1;\n }\n if (lineTexts.length - 2 > idx) {\n idx += 1;\n }\n this.root.sourcepos[1] = [idx + 1, lineTexts[idx].length];\n };\n ToastMark2.prototype.replaceRangeNodes = function(startNode, endNode, newNodes) {\n if (!startNode) {\n if (endNode) {\n insertNodesBefore(endNode, newNodes);\n removeNodeById(endNode.id);\n endNode.unlink();\n } else {\n prependChildNodes(this.root, newNodes);\n }\n } else {\n insertNodesBefore(startNode, newNodes);\n removeNextUntil(startNode, endNode);\n [startNode.id, endNode.id].forEach(function(id) {\n return removeNodeById(id);\n });\n startNode.unlink();\n }\n };\n ToastMark2.prototype.getNodeRange = function(startPos, endPos) {\n var startNode = findChildNodeAtLine(this.root, startPos[0]);\n var endNode = findChildNodeAtLine(this.root, endPos[0]);\n if (endNode && endNode.next && endPos[0] + 1 === endNode.next.sourcepos[0][0]) {\n endNode = endNode.next;\n }\n return [startNode, endNode];\n };\n ToastMark2.prototype.trigger = function(eventName, param) {\n this.eventHandlerMap[eventName].forEach(function(handler) {\n handler(param);\n });\n };\n ToastMark2.prototype.extendEndLine = function(line) {\n while (this.lineTexts[line] === \"\") {\n line += 1;\n }\n return line;\n };\n ToastMark2.prototype.parseRange = function(startNode, endNode, startLine, endLine) {\n if (startNode && startNode.prev && (isList(startNode.prev) && canBeContinuedListItem(this.lineTexts[startLine - 1]) || isTable(startNode.prev) && canBeContinuedTableBody(this.lineTexts[startLine - 1]))) {\n startNode = startNode.prev;\n startLine = startNode.sourcepos[0][0];\n }\n var editedLines = this.lineTexts.slice(startLine - 1, endLine);\n var root = this.parser.partialParseStart(startLine, editedLines);\n var nextNode = endNode ? endNode.next : this.root.firstChild;\n var lastChild = root.lastChild;\n var isOpenedLastChildCodeBlock = lastChild && isCodeBlock(lastChild) && lastChild.open;\n var isOpenedLastChildCustomBlock = lastChild && isCustomBlock(lastChild) && lastChild.open;\n var isLastChildList = lastChild && isList(lastChild);\n while ((isOpenedLastChildCodeBlock || isOpenedLastChildCustomBlock) && nextNode || isLastChildList && nextNode && (nextNode.type === \"list\" || nextNode.sourcepos[0][1] >= 2)) {\n var newEndLine = this.extendEndLine(nextNode.sourcepos[1][0]);\n this.parser.partialParseExtends(this.lineTexts.slice(endLine, newEndLine));\n if (!startNode) {\n startNode = endNode;\n }\n endNode = nextNode;\n endLine = newEndLine;\n nextNode = nextNode.next;\n }\n this.parser.partialParseFinish();\n var newNodes = getChildNodes(root);\n return { newNodes, extStartNode: startNode, extEndNode: endNode };\n };\n ToastMark2.prototype.getRemovedNodeRange = function(extStartNode, extEndNode) {\n if (!extStartNode || extStartNode && isRefDef(extStartNode) || extEndNode && isRefDef(extEndNode)) {\n return null;\n }\n return {\n id: [extStartNode.id, extEndNode.id],\n line: [extStartNode.sourcepos[0][0] - 1, extEndNode.sourcepos[1][0] - 1]\n };\n };\n ToastMark2.prototype.markDeletedRefMap = function(extStartNode, extEndNode) {\n var _this = this;\n if (!isEmptyObj(this.refMap)) {\n var markDeleted = function(node) {\n if (isRefDef(node)) {\n var refDefState = _this.refMap[node.label];\n if (refDefState && node.id === refDefState.id) {\n refDefState.unlinked = true;\n }\n }\n };\n if (extStartNode) {\n invokeNextUntil(markDeleted, extStartNode.parent, extEndNode);\n }\n if (extEndNode) {\n invokeNextUntil(markDeleted, extEndNode);\n }\n }\n };\n ToastMark2.prototype.replaceWithNewRefDefState = function(nodes) {\n var _this = this;\n if (!isEmptyObj(this.refMap)) {\n var replaceWith_1 = function(node) {\n if (isRefDef(node)) {\n var label = node.label;\n var refDefState = _this.refMap[label];\n if (!refDefState || refDefState.unlinked) {\n _this.refMap[label] = createRefDefState(node);\n }\n }\n };\n nodes.forEach(function(node) {\n invokeNextUntil(replaceWith_1, node);\n });\n }\n };\n ToastMark2.prototype.replaceWithRefDefCandidate = function() {\n var _this = this;\n if (!isEmptyObj(this.refDefCandidateMap)) {\n iterateObject(this.refDefCandidateMap, function(_, candidate) {\n var label = candidate.label, sourcepos = candidate.sourcepos;\n var refDefState = _this.refMap[label];\n if (!refDefState || refDefState.unlinked || refDefState.sourcepos[0][0] > sourcepos[0][0]) {\n _this.refMap[label] = createRefDefState(candidate);\n }\n });\n }\n };\n ToastMark2.prototype.getRangeWithRefDef = function(startLine, endLine, startNode, endNode, lineDiff) {\n if (this.referenceDefinition && !isEmptyObj(this.refMap)) {\n var prevNode = findChildNodeAtLine(this.root, startLine - 1);\n var nextNode = findChildNodeAtLine(this.root, endLine + 1);\n if (prevNode && isRefDef(prevNode) && prevNode !== startNode && prevNode !== endNode) {\n startNode = prevNode;\n startLine = startNode.sourcepos[0][0];\n }\n if (nextNode && isRefDef(nextNode) && nextNode !== startNode && nextNode !== endNode) {\n endNode = nextNode;\n endLine = this.extendEndLine(endNode.sourcepos[1][0] + lineDiff);\n }\n }\n return [startNode, endNode, startLine, endLine];\n };\n ToastMark2.prototype.parse = function(startPos, endPos, lineDiff) {\n if (lineDiff === void 0) {\n lineDiff = 0;\n }\n var range2 = this.getNodeRange(startPos, endPos);\n var startNode = range2[0], endNode = range2[1];\n var startLine = startNode ? Math.min(startNode.sourcepos[0][0], startPos[0]) : startPos[0];\n var endLine = this.extendEndLine((endNode ? Math.max(endNode.sourcepos[1][0], endPos[0]) : endPos[0]) + lineDiff);\n var parseResult = this.parseRange.apply(this, this.getRangeWithRefDef(startLine, endLine, startNode, endNode, lineDiff));\n var newNodes = parseResult.newNodes, extStartNode = parseResult.extStartNode, extEndNode = parseResult.extEndNode;\n var removedNodeRange = this.getRemovedNodeRange(extStartNode, extEndNode);\n var nextNode = extEndNode ? extEndNode.next : this.root.firstChild;\n if (this.referenceDefinition) {\n this.markDeletedRefMap(extStartNode, extEndNode);\n this.replaceRangeNodes(extStartNode, extEndNode, newNodes);\n this.replaceWithNewRefDefState(newNodes);\n } else {\n this.replaceRangeNodes(extStartNode, extEndNode, newNodes);\n }\n return { nodes: newNodes, removedNodeRange, nextNode };\n };\n ToastMark2.prototype.parseRefLink = function() {\n var _this = this;\n var result = [];\n if (!isEmptyObj(this.refMap)) {\n iterateObject(this.refMap, function(label, value) {\n if (value.unlinked) {\n delete _this.refMap[label];\n }\n iterateObject(_this.refLinkCandidateMap, function(_, candidate) {\n var node = candidate.node, refLabel = candidate.refLabel;\n if (refLabel === label) {\n result.push(_this.parse(node.sourcepos[0], node.sourcepos[1]));\n }\n });\n });\n }\n return result;\n };\n ToastMark2.prototype.removeUnlinkedCandidate = function() {\n if (!isEmptyObj(this.refDefCandidateMap)) {\n [this.refLinkCandidateMap, this.refDefCandidateMap].forEach(function(candidateMap) {\n iterateObject(candidateMap, function(id) {\n if (isUnlinked(id)) {\n delete candidateMap[id];\n }\n });\n });\n }\n };\n ToastMark2.prototype.editMarkdown = function(startPos, endPos, newText) {\n var lineDiff = this.updateLineTexts(startPos, endPos, newText);\n var parseResult = this.parse(startPos, endPos, lineDiff);\n var editResult = omit(parseResult, \"nextNode\");\n updateNextLineNumbers(parseResult.nextNode, lineDiff);\n this.updateRootNodeState();\n var result = [editResult];\n if (this.referenceDefinition) {\n this.removeUnlinkedCandidate();\n this.replaceWithRefDefCandidate();\n result = result.concat(this.parseRefLink());\n }\n this.trigger(\"change\", result);\n return result;\n };\n ToastMark2.prototype.getLineTexts = function() {\n return this.lineTexts;\n };\n ToastMark2.prototype.getRootNode = function() {\n return this.root;\n };\n ToastMark2.prototype.findNodeAtPosition = function(pos) {\n var node = findNodeAtPosition(this.root, pos);\n if (!node || node === this.root) {\n return null;\n }\n return node;\n };\n ToastMark2.prototype.findFirstNodeAtLine = function(line) {\n return findFirstNodeAtLine(this.root, line);\n };\n ToastMark2.prototype.on = function(eventName, callback) {\n this.eventHandlerMap[eventName].push(callback);\n };\n ToastMark2.prototype.off = function(eventName, callback) {\n var handlers = this.eventHandlerMap[eventName];\n var idx = handlers.indexOf(callback);\n handlers.splice(idx, 1);\n };\n ToastMark2.prototype.findNodeById = function(id) {\n return findNodeById(id);\n };\n ToastMark2.prototype.removeAllNode = function() {\n removeAllNode();\n };\n return ToastMark2;\n }()\n);\nvar disallowedTags = [\n \"title\",\n \"textarea\",\n \"style\",\n \"xmp\",\n \"iframe\",\n \"noembed\",\n \"noframes\",\n \"script\",\n \"plaintext\"\n];\nvar reDisallowedTag = new RegExp(\"<(/?(?:\" + disallowedTags.join(\"|\") + \")[^>]*>)\", \"ig\");\nfunction filterDisallowedTags(str) {\n if (reDisallowedTag.test(str)) {\n return str.replace(reDisallowedTag, function(_, group) {\n return \"<\" + group;\n });\n }\n return str;\n}\nvar baseConvertors$1 = {\n heading: function(node, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"h\" + node.level,\n outerNewLine: true\n };\n },\n text: function(node) {\n return {\n type: \"text\",\n content: node.literal\n };\n },\n softbreak: function(_, _a) {\n var options = _a.options;\n return {\n type: \"html\",\n content: options.softbreak\n };\n },\n linebreak: function() {\n return {\n type: \"html\",\n content: \"
    \\n\"\n };\n },\n emph: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"em\"\n };\n },\n strong: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"strong\"\n };\n },\n paragraph: function(node, _a) {\n var _b;\n var entering = _a.entering;\n var grandparent = (_b = node.parent) === null || _b === void 0 ? void 0 : _b.parent;\n if (grandparent && grandparent.type === \"list\") {\n if (grandparent.listData.tight) {\n return null;\n }\n }\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"p\",\n outerNewLine: true\n };\n },\n thematicBreak: function() {\n return {\n type: \"openTag\",\n tagName: \"hr\",\n outerNewLine: true,\n selfClose: true\n };\n },\n blockQuote: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"blockquote\",\n outerNewLine: true,\n innerNewLine: true\n };\n },\n list: function(node, _a) {\n var entering = _a.entering;\n var _b = node.listData, type = _b.type, start = _b.start;\n var tagName = type === \"bullet\" ? \"ul\" : \"ol\";\n var attributes = {};\n if (tagName === \"ol\" && start !== null && start !== 1) {\n attributes.start = start.toString();\n }\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName,\n attributes,\n outerNewLine: true\n };\n },\n item: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"li\",\n outerNewLine: true\n };\n },\n htmlInline: function(node, _a) {\n var options = _a.options;\n var content = options.tagFilter ? filterDisallowedTags(node.literal) : node.literal;\n return { type: \"html\", content };\n },\n htmlBlock: function(node, _a) {\n var options = _a.options;\n var content = options.tagFilter ? filterDisallowedTags(node.literal) : node.literal;\n if (options.nodeId) {\n return [\n { type: \"openTag\", tagName: \"div\", outerNewLine: true },\n { type: \"html\", content },\n { type: \"closeTag\", tagName: \"div\", outerNewLine: true }\n ];\n }\n return { type: \"html\", content, outerNewLine: true };\n },\n code: function(node) {\n return [\n { type: \"openTag\", tagName: \"code\" },\n { type: \"text\", content: node.literal },\n { type: \"closeTag\", tagName: \"code\" }\n ];\n },\n codeBlock: function(node) {\n var infoStr = node.info;\n var infoWords = infoStr ? infoStr.split(/\\s+/) : [];\n var codeClassNames = [];\n if (infoWords.length > 0 && infoWords[0].length > 0) {\n codeClassNames.push(\"language-\" + escapeXml(infoWords[0]));\n }\n return [\n { type: \"openTag\", tagName: \"pre\", outerNewLine: true },\n { type: \"openTag\", tagName: \"code\", classNames: codeClassNames },\n { type: \"text\", content: node.literal },\n { type: \"closeTag\", tagName: \"code\" },\n { type: \"closeTag\", tagName: \"pre\", outerNewLine: true }\n ];\n },\n link: function(node, _a) {\n var entering = _a.entering;\n if (entering) {\n var _b = node, title = _b.title, destination = _b.destination;\n return {\n type: \"openTag\",\n tagName: \"a\",\n attributes: __assign({ href: escapeXml(destination) }, title && { title: escapeXml(title) })\n };\n }\n return { type: \"closeTag\", tagName: \"a\" };\n },\n image: function(node, _a) {\n var getChildrenText2 = _a.getChildrenText, skipChildren = _a.skipChildren;\n var _b = node, title = _b.title, destination = _b.destination;\n skipChildren();\n return {\n type: \"openTag\",\n tagName: \"img\",\n selfClose: true,\n attributes: __assign({ src: escapeXml(destination), alt: getChildrenText2(node) }, title && { title: escapeXml(title) })\n };\n },\n customBlock: function(node, context, convertors2) {\n var info = node.info.trim().toLowerCase();\n var customConvertor = convertors2[info];\n if (customConvertor) {\n try {\n return customConvertor(node, context);\n } catch (e) {\n console.warn(\"[@toast-ui/editor] - The error occurred when \" + info + \" block node was parsed in markdown renderer: \" + e);\n }\n }\n return [\n { type: \"openTag\", tagName: \"div\", outerNewLine: true },\n { type: \"text\", content: node.literal },\n { type: \"closeTag\", tagName: \"div\", outerNewLine: true }\n ];\n },\n frontMatter: function(node) {\n return [\n {\n type: \"openTag\",\n tagName: \"div\",\n outerNewLine: true,\n // Because front matter is metadata, it should not be render.\n attributes: { style: \"white-space: pre; display: none;\" }\n },\n { type: \"text\", content: node.literal },\n { type: \"closeTag\", tagName: \"div\", outerNewLine: true }\n ];\n },\n customInline: function(node, context, convertors2) {\n var _a = node, info = _a.info, firstChild = _a.firstChild;\n var nomalizedInfo = info.trim().toLowerCase();\n var customConvertor = convertors2[nomalizedInfo];\n var entering = context.entering;\n if (customConvertor) {\n try {\n return customConvertor(node, context);\n } catch (e) {\n console.warn(\"[@toast-ui/editor] - The error occurred when \" + nomalizedInfo + \" inline node was parsed in markdown renderer: \" + e);\n }\n }\n return entering ? [\n { type: \"openTag\", tagName: \"span\" },\n { type: \"text\", content: \"$$\" + info + (firstChild ? \" \" : \"\") }\n ] : [\n { type: \"text\", content: \"$$\" },\n { type: \"closeTag\", tagName: \"span\" }\n ];\n }\n};\nvar gfmConvertors = {\n strike: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"del\"\n };\n },\n item: function(node, _a) {\n var entering = _a.entering;\n var _b = node.listData, checked = _b.checked, task2 = _b.task;\n if (entering) {\n var itemTag = {\n type: \"openTag\",\n tagName: \"li\",\n outerNewLine: true\n };\n if (task2) {\n return [\n itemTag,\n {\n type: \"openTag\",\n tagName: \"input\",\n selfClose: true,\n attributes: __assign(__assign({}, checked && { checked: \"\" }), { disabled: \"\", type: \"checkbox\" })\n },\n {\n type: \"text\",\n content: \" \"\n }\n ];\n }\n return itemTag;\n }\n return {\n type: \"closeTag\",\n tagName: \"li\",\n outerNewLine: true\n };\n },\n table: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"table\",\n outerNewLine: true\n };\n },\n tableHead: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"thead\",\n outerNewLine: true\n };\n },\n tableBody: function(_, _a) {\n var entering = _a.entering;\n return {\n type: entering ? \"openTag\" : \"closeTag\",\n tagName: \"tbody\",\n outerNewLine: true\n };\n },\n tableRow: function(node, _a) {\n var entering = _a.entering;\n if (entering) {\n return {\n type: \"openTag\",\n tagName: \"tr\",\n outerNewLine: true\n };\n }\n var result = [];\n if (node.lastChild) {\n var columnLen = node.parent.parent.columns.length;\n var lastColIdx = node.lastChild.endIdx;\n for (var i = lastColIdx + 1; i < columnLen; i += 1) {\n result.push({\n type: \"openTag\",\n tagName: \"td\",\n outerNewLine: true\n }, {\n type: \"closeTag\",\n tagName: \"td\",\n outerNewLine: true\n });\n }\n }\n result.push({\n type: \"closeTag\",\n tagName: \"tr\",\n outerNewLine: true\n });\n return result;\n },\n tableCell: function(node, _a) {\n var entering = _a.entering;\n if (node.ignored) {\n return {\n type: \"text\",\n content: \"\"\n };\n }\n var tablePart = node.parent.parent;\n var tagName = tablePart.type === \"tableHead\" ? \"th\" : \"td\";\n var table2 = tablePart.parent;\n var columnInfo = table2.columns[node.startIdx];\n var attributes = (columnInfo === null || columnInfo === void 0 ? void 0 : columnInfo.align) ? { align: columnInfo.align } : null;\n if (entering) {\n return __assign({ type: \"openTag\", tagName, outerNewLine: true }, attributes && { attributes });\n }\n return {\n type: \"closeTag\",\n tagName,\n outerNewLine: true\n };\n }\n};\nvar defaultOptions = {\n softbreak: \"\\n\",\n gfm: false,\n tagFilter: false,\n nodeId: false\n};\nfunction getChildrenText(node) {\n var buffer = [];\n var walker = node.walker();\n var event = null;\n while (event = walker.next()) {\n var node_1 = event.node;\n if (node_1.type === \"text\") {\n buffer.push(node_1.literal);\n }\n }\n return buffer.join(\"\");\n}\nvar Renderer = (\n /** @class */\n function() {\n function Renderer2(customOptions) {\n this.buffer = [];\n this.options = __assign(__assign({}, defaultOptions), customOptions);\n this.convertors = this.createConvertors();\n delete this.options.convertors;\n }\n Renderer2.prototype.createConvertors = function() {\n var convertors2 = __assign({}, baseConvertors$1);\n if (this.options.gfm) {\n convertors2 = __assign(__assign({}, convertors2), gfmConvertors);\n }\n if (this.options.convertors) {\n var customConvertors_1 = this.options.convertors;\n var nodeTypes = Object.keys(customConvertors_1);\n var defaultConvertors_1 = __assign(__assign({}, baseConvertors$1), gfmConvertors);\n nodeTypes.forEach(function(nodeType) {\n var orgConvertor = convertors2[nodeType];\n var convertor = customConvertors_1[nodeType];\n var convertorType = Object.keys(defaultConvertors_1).indexOf(nodeType) === -1 ? nodeType.toLowerCase() : nodeType;\n if (orgConvertor) {\n convertors2[convertorType] = function(node, context, convertors3) {\n context.origin = function() {\n return orgConvertor(node, context, convertors3);\n };\n return convertor(node, context);\n };\n } else {\n convertors2[convertorType] = convertor;\n }\n });\n }\n return convertors2;\n };\n Renderer2.prototype.getConvertors = function() {\n return this.convertors;\n };\n Renderer2.prototype.getOptions = function() {\n return this.options;\n };\n Renderer2.prototype.render = function(rootNode) {\n var _this = this;\n this.buffer = [];\n var walker = rootNode.walker();\n var event = null;\n var _loop_1 = function() {\n var node = event.node, entering = event.entering;\n var convertor = this_1.convertors[node.type];\n if (!convertor) {\n return \"continue\";\n }\n var skipped = false;\n var context = {\n entering,\n leaf: !isContainer$1(node),\n options: this_1.options,\n getChildrenText,\n skipChildren: function() {\n skipped = true;\n }\n };\n var converted = isCustomBlock(node) || isCustomInline(node) ? convertor(node, context, this_1.convertors) : convertor(node, context);\n if (converted) {\n var htmlNodes = Array.isArray(converted) ? converted : [converted];\n htmlNodes.forEach(function(htmlNode, index2) {\n if (htmlNode.type === \"openTag\" && _this.options.nodeId && index2 === 0) {\n if (!htmlNode.attributes) {\n htmlNode.attributes = {};\n }\n htmlNode.attributes[\"data-nodeid\"] = String(node.id);\n }\n _this.renderHTMLNode(htmlNode);\n });\n if (skipped) {\n walker.resumeAt(node, false);\n walker.next();\n }\n }\n };\n var this_1 = this;\n while (event = walker.next()) {\n _loop_1();\n }\n this.addNewLine();\n return this.buffer.join(\"\");\n };\n Renderer2.prototype.renderHTMLNode = function(node) {\n switch (node.type) {\n case \"openTag\":\n case \"closeTag\":\n this.renderElementNode(node);\n break;\n case \"text\":\n this.renderTextNode(node);\n break;\n case \"html\":\n this.renderRawHtmlNode(node);\n break;\n }\n };\n Renderer2.prototype.generateOpenTagString = function(node) {\n var _this = this;\n var tagName = node.tagName, classNames = node.classNames, attributes = node.attributes;\n this.buffer.push(\"<\" + tagName);\n if (classNames && classNames.length > 0) {\n this.buffer.push(' class=\"' + classNames.join(\" \") + '\"');\n }\n if (attributes) {\n Object.keys(attributes).forEach(function(attrName) {\n var attrValue = attributes[attrName];\n _this.buffer.push(\" \" + attrName + '=\"' + attrValue + '\"');\n });\n }\n if (node.selfClose) {\n this.buffer.push(\" /\");\n }\n this.buffer.push(\">\");\n };\n Renderer2.prototype.generateCloseTagString = function(_a) {\n var tagName = _a.tagName;\n this.buffer.push(\"\");\n };\n Renderer2.prototype.addNewLine = function() {\n if (this.buffer.length && last(last(this.buffer)) !== \"\\n\") {\n this.buffer.push(\"\\n\");\n }\n };\n Renderer2.prototype.addOuterNewLine = function(node) {\n if (node.outerNewLine) {\n this.addNewLine();\n }\n };\n Renderer2.prototype.addInnerNewLine = function(node) {\n if (node.innerNewLine) {\n this.addNewLine();\n }\n };\n Renderer2.prototype.renderTextNode = function(node) {\n this.buffer.push(escapeXml(node.content));\n };\n Renderer2.prototype.renderRawHtmlNode = function(node) {\n this.addOuterNewLine(node);\n this.buffer.push(node.content);\n this.addOuterNewLine(node);\n };\n Renderer2.prototype.renderElementNode = function(node) {\n if (node.type === \"openTag\") {\n this.addOuterNewLine(node);\n this.generateOpenTagString(node);\n if (node.selfClose) {\n this.addOuterNewLine(node);\n } else {\n this.addInnerNewLine(node);\n }\n } else {\n this.addInnerNewLine(node);\n this.generateCloseTagString(node);\n this.addOuterNewLine(node);\n }\n };\n return Renderer2;\n }()\n);\n/*! @license DOMPurify 2.3.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.3.3/LICENSE */\nfunction _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n } else {\n return Array.from(arr);\n }\n}\nvar hasOwnProperty = Object.hasOwnProperty, setPrototypeOf = Object.setPrototypeOf, isFrozen = Object.isFrozen, getPrototypeOf = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar freeze = Object.freeze, seal = Object.seal, create = Object.create;\nvar _ref = typeof Reflect !== \"undefined\" && Reflect, apply = _ref.apply, construct = _ref.construct;\nif (!apply) {\n apply = function apply2(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n}\nif (!freeze) {\n freeze = function freeze2(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal2(x) {\n return x;\n };\n}\nif (!construct) {\n construct = function construct2(Func, args) {\n return new (Function.prototype.bind.apply(Func, [null].concat(_toConsumableArray(args))))();\n };\n}\nvar arrayForEach = unapply(Array.prototype.forEach);\nvar arrayPop = unapply(Array.prototype.pop);\nvar arrayPush = unapply(Array.prototype.push);\nvar stringToLowerCase = unapply(String.prototype.toLowerCase);\nvar stringMatch = unapply(String.prototype.match);\nvar stringReplace = unapply(String.prototype.replace);\nvar stringIndexOf = unapply(String.prototype.indexOf);\nvar stringTrim = unapply(String.prototype.trim);\nvar regExpTest = unapply(RegExp.prototype.test);\nvar typeErrorCreate = unconstruct(TypeError);\nfunction unapply(func) {\n return function(thisArg) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return apply(func, thisArg, args);\n };\n}\nfunction unconstruct(func) {\n return function() {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return construct(func, args);\n };\n}\nfunction addToSet(set, array) {\n if (setPrototypeOf) {\n setPrototypeOf(set, null);\n }\n var l = array.length;\n while (l--) {\n var element = array[l];\n if (typeof element === \"string\") {\n var lcElement = stringToLowerCase(element);\n if (lcElement !== element) {\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\nfunction clone(object) {\n var newObject = create(null);\n var property = void 0;\n for (property in object) {\n if (apply(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n return newObject;\n}\nfunction lookupGetter(object, prop2) {\n while (object !== null) {\n var desc = getOwnPropertyDescriptor(object, prop2);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === \"function\") {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue(element) {\n console.warn(\"fallback value for\", element);\n return null;\n }\n return fallbackValue;\n}\nvar html$2 = freeze([\"a\", \"abbr\", \"acronym\", \"address\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"bdi\", \"bdo\", \"big\", \"blink\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"center\", \"cite\", \"code\", \"col\", \"colgroup\", \"content\", \"data\", \"datalist\", \"dd\", \"decorator\", \"del\", \"details\", \"dfn\", \"dialog\", \"dir\", \"div\", \"dl\", \"dt\", \"element\", \"em\", \"fieldset\", \"figcaption\", \"figure\", \"font\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"img\", \"input\", \"ins\", \"kbd\", \"label\", \"legend\", \"li\", \"main\", \"map\", \"mark\", \"marquee\", \"menu\", \"menuitem\", \"meter\", \"nav\", \"nobr\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"picture\", \"pre\", \"progress\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"section\", \"select\", \"shadow\", \"small\", \"source\", \"spacer\", \"span\", \"strike\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"tr\", \"track\", \"tt\", \"u\", \"ul\", \"var\", \"video\", \"wbr\"]);\nvar svg = freeze([\"svg\", \"a\", \"altglyph\", \"altglyphdef\", \"altglyphitem\", \"animatecolor\", \"animatemotion\", \"animatetransform\", \"circle\", \"clippath\", \"defs\", \"desc\", \"ellipse\", \"filter\", \"font\", \"g\", \"glyph\", \"glyphref\", \"hkern\", \"image\", \"line\", \"lineargradient\", \"marker\", \"mask\", \"metadata\", \"mpath\", \"path\", \"pattern\", \"polygon\", \"polyline\", \"radialgradient\", \"rect\", \"stop\", \"style\", \"switch\", \"symbol\", \"text\", \"textpath\", \"title\", \"tref\", \"tspan\", \"view\", \"vkern\"]);\nvar svgFilters = freeze([\"feBlend\", \"feColorMatrix\", \"feComponentTransfer\", \"feComposite\", \"feConvolveMatrix\", \"feDiffuseLighting\", \"feDisplacementMap\", \"feDistantLight\", \"feFlood\", \"feFuncA\", \"feFuncB\", \"feFuncG\", \"feFuncR\", \"feGaussianBlur\", \"feMerge\", \"feMergeNode\", \"feMorphology\", \"feOffset\", \"fePointLight\", \"feSpecularLighting\", \"feSpotLight\", \"feTile\", \"feTurbulence\"]);\nvar svgDisallowed = freeze([\"animate\", \"color-profile\", \"cursor\", \"discard\", \"fedropshadow\", \"feimage\", \"font-face\", \"font-face-format\", \"font-face-name\", \"font-face-src\", \"font-face-uri\", \"foreignobject\", \"hatch\", \"hatchpath\", \"mesh\", \"meshgradient\", \"meshpatch\", \"meshrow\", \"missing-glyph\", \"script\", \"set\", \"solidcolor\", \"unknown\", \"use\"]);\nvar mathMl = freeze([\"math\", \"menclose\", \"merror\", \"mfenced\", \"mfrac\", \"mglyph\", \"mi\", \"mlabeledtr\", \"mmultiscripts\", \"mn\", \"mo\", \"mover\", \"mpadded\", \"mphantom\", \"mroot\", \"mrow\", \"ms\", \"mspace\", \"msqrt\", \"mstyle\", \"msub\", \"msup\", \"msubsup\", \"mtable\", \"mtd\", \"mtext\", \"mtr\", \"munder\", \"munderover\"]);\nvar mathMlDisallowed = freeze([\"maction\", \"maligngroup\", \"malignmark\", \"mlongdiv\", \"mscarries\", \"mscarry\", \"msgroup\", \"mstack\", \"msline\", \"msrow\", \"semantics\", \"annotation\", \"annotation-xml\", \"mprescripts\", \"none\"]);\nvar text = freeze([\"#text\"]);\nvar html$1$1 = freeze([\"accept\", \"action\", \"align\", \"alt\", \"autocapitalize\", \"autocomplete\", \"autopictureinpicture\", \"autoplay\", \"background\", \"bgcolor\", \"border\", \"capture\", \"cellpadding\", \"cellspacing\", \"checked\", \"cite\", \"class\", \"clear\", \"color\", \"cols\", \"colspan\", \"controls\", \"controlslist\", \"coords\", \"crossorigin\", \"datetime\", \"decoding\", \"default\", \"dir\", \"disabled\", \"disablepictureinpicture\", \"disableremoteplayback\", \"download\", \"draggable\", \"enctype\", \"enterkeyhint\", \"face\", \"for\", \"headers\", \"height\", \"hidden\", \"high\", \"href\", \"hreflang\", \"id\", \"inputmode\", \"integrity\", \"ismap\", \"kind\", \"label\", \"lang\", \"list\", \"loading\", \"loop\", \"low\", \"max\", \"maxlength\", \"media\", \"method\", \"min\", \"minlength\", \"multiple\", \"muted\", \"name\", \"noshade\", \"novalidate\", \"nowrap\", \"open\", \"optimum\", \"pattern\", \"placeholder\", \"playsinline\", \"poster\", \"preload\", \"pubdate\", \"radiogroup\", \"readonly\", \"rel\", \"required\", \"rev\", \"reversed\", \"role\", \"rows\", \"rowspan\", \"spellcheck\", \"scope\", \"selected\", \"shape\", \"size\", \"sizes\", \"span\", \"srclang\", \"start\", \"src\", \"srcset\", \"step\", \"style\", \"summary\", \"tabindex\", \"title\", \"translate\", \"type\", \"usemap\", \"valign\", \"value\", \"width\", \"xmlns\", \"slot\"]);\nvar svg$1 = freeze([\"accent-height\", \"accumulate\", \"additive\", \"alignment-baseline\", \"ascent\", \"attributename\", \"attributetype\", \"azimuth\", \"basefrequency\", \"baseline-shift\", \"begin\", \"bias\", \"by\", \"class\", \"clip\", \"clippathunits\", \"clip-path\", \"clip-rule\", \"color\", \"color-interpolation\", \"color-interpolation-filters\", \"color-profile\", \"color-rendering\", \"cx\", \"cy\", \"d\", \"dx\", \"dy\", \"diffuseconstant\", \"direction\", \"display\", \"divisor\", \"dur\", \"edgemode\", \"elevation\", \"end\", \"fill\", \"fill-opacity\", \"fill-rule\", \"filter\", \"filterunits\", \"flood-color\", \"flood-opacity\", \"font-family\", \"font-size\", \"font-size-adjust\", \"font-stretch\", \"font-style\", \"font-variant\", \"font-weight\", \"fx\", \"fy\", \"g1\", \"g2\", \"glyph-name\", \"glyphref\", \"gradientunits\", \"gradienttransform\", \"height\", \"href\", \"id\", \"image-rendering\", \"in\", \"in2\", \"k\", \"k1\", \"k2\", \"k3\", \"k4\", \"kerning\", \"keypoints\", \"keysplines\", \"keytimes\", \"lang\", \"lengthadjust\", \"letter-spacing\", \"kernelmatrix\", \"kernelunitlength\", \"lighting-color\", \"local\", \"marker-end\", \"marker-mid\", \"marker-start\", \"markerheight\", \"markerunits\", \"markerwidth\", \"maskcontentunits\", \"maskunits\", \"max\", \"mask\", \"media\", \"method\", \"mode\", \"min\", \"name\", \"numoctaves\", \"offset\", \"operator\", \"opacity\", \"order\", \"orient\", \"orientation\", \"origin\", \"overflow\", \"paint-order\", \"path\", \"pathlength\", \"patterncontentunits\", \"patterntransform\", \"patternunits\", \"points\", \"preservealpha\", \"preserveaspectratio\", \"primitiveunits\", \"r\", \"rx\", \"ry\", \"radius\", \"refx\", \"refy\", \"repeatcount\", \"repeatdur\", \"restart\", \"result\", \"rotate\", \"scale\", \"seed\", \"shape-rendering\", \"specularconstant\", \"specularexponent\", \"spreadmethod\", \"startoffset\", \"stddeviation\", \"stitchtiles\", \"stop-color\", \"stop-opacity\", \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\", \"stroke-miterlimit\", \"stroke-opacity\", \"stroke\", \"stroke-width\", \"style\", \"surfacescale\", \"systemlanguage\", \"tabindex\", \"targetx\", \"targety\", \"transform\", \"text-anchor\", \"text-decoration\", \"text-rendering\", \"textlength\", \"type\", \"u1\", \"u2\", \"unicode\", \"values\", \"viewbox\", \"visibility\", \"version\", \"vert-adv-y\", \"vert-origin-x\", \"vert-origin-y\", \"width\", \"word-spacing\", \"wrap\", \"writing-mode\", \"xchannelselector\", \"ychannelselector\", \"x\", \"x1\", \"x2\", \"xmlns\", \"y\", \"y1\", \"y2\", \"z\", \"zoomandpan\"]);\nvar mathMl$1 = freeze([\"accent\", \"accentunder\", \"align\", \"bevelled\", \"close\", \"columnsalign\", \"columnlines\", \"columnspan\", \"denomalign\", \"depth\", \"dir\", \"display\", \"displaystyle\", \"encoding\", \"fence\", \"frame\", \"height\", \"href\", \"id\", \"largeop\", \"length\", \"linethickness\", \"lspace\", \"lquote\", \"mathbackground\", \"mathcolor\", \"mathsize\", \"mathvariant\", \"maxsize\", \"minsize\", \"movablelimits\", \"notation\", \"numalign\", \"open\", \"rowalign\", \"rowlines\", \"rowspacing\", \"rowspan\", \"rspace\", \"rquote\", \"scriptlevel\", \"scriptminsize\", \"scriptsizemultiplier\", \"selection\", \"separator\", \"separators\", \"stretchy\", \"subscriptshift\", \"supscriptshift\", \"symmetric\", \"voffset\", \"width\", \"xmlns\"]);\nvar xml = freeze([\"xlink:href\", \"xml:id\", \"xlink:title\", \"xml:space\", \"xmlns:xlink\"]);\nvar MUSTACHE_EXPR = seal(/\\{\\{[\\s\\S]*|[\\s\\S]*\\}\\}/gm);\nvar ERB_EXPR = seal(/<%[\\s\\S]*|[\\s\\S]*%>/gm);\nvar DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/);\nvar ARIA_ATTR = seal(/^aria-[\\-\\w]+$/);\nvar IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i\n // eslint-disable-line no-useless-escape\n);\nvar IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nvar ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g\n // eslint-disable-line no-control-regex\n);\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function(obj) {\n return typeof obj;\n} : function(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\nfunction _toConsumableArray$1(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n } else {\n return Array.from(arr);\n }\n}\nvar getGlobal = function getGlobal2() {\n return typeof window === \"undefined\" ? null : window;\n};\nvar _createTrustedTypesPolicy = function _createTrustedTypesPolicy2(trustedTypes, document2) {\n if ((typeof trustedTypes === \"undefined\" ? \"undefined\" : _typeof(trustedTypes)) !== \"object\" || typeof trustedTypes.createPolicy !== \"function\") {\n return null;\n }\n var suffix = null;\n var ATTR_NAME = \"data-tt-policy-suffix\";\n if (document2.currentScript && document2.currentScript.hasAttribute(ATTR_NAME)) {\n suffix = document2.currentScript.getAttribute(ATTR_NAME);\n }\n var policyName = \"dompurify\" + (suffix ? \"#\" + suffix : \"\");\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML: function createHTML(html$$1) {\n return html$$1;\n }\n });\n } catch (_) {\n console.warn(\"TrustedTypes policy \" + policyName + \" could not be created.\");\n return null;\n }\n};\nfunction createDOMPurify() {\n var window2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal();\n var DOMPurify = function DOMPurify2(root) {\n return createDOMPurify(root);\n };\n DOMPurify.version = \"2.3.3\";\n DOMPurify.removed = [];\n if (!window2 || !window2.document || window2.document.nodeType !== 9) {\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n var originalDocument = window2.document;\n var document2 = window2.document;\n var DocumentFragment = window2.DocumentFragment, HTMLTemplateElement = window2.HTMLTemplateElement, Node2 = window2.Node, Element2 = window2.Element, NodeFilter = window2.NodeFilter, _window$NamedNodeMap = window2.NamedNodeMap, NamedNodeMap = _window$NamedNodeMap === void 0 ? window2.NamedNodeMap || window2.MozNamedAttrMap : _window$NamedNodeMap, Text2 = window2.Text, Comment = window2.Comment, DOMParser2 = window2.DOMParser, trustedTypes = window2.trustedTypes;\n var ElementPrototype = Element2.prototype;\n var cloneNode = lookupGetter(ElementPrototype, \"cloneNode\");\n var getNextSibling = lookupGetter(ElementPrototype, \"nextSibling\");\n var getChildNodes2 = lookupGetter(ElementPrototype, \"childNodes\");\n var getParentNode2 = lookupGetter(ElementPrototype, \"parentNode\");\n if (typeof HTMLTemplateElement === \"function\") {\n var template = document2.createElement(\"template\");\n if (template.content && template.content.ownerDocument) {\n document2 = template.content.ownerDocument;\n }\n }\n var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n var emptyHTML = trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(\"\") : \"\";\n var _document = document2, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;\n var importNode = originalDocument.importNode;\n var documentMode = {};\n try {\n documentMode = clone(document2).documentMode ? document2.documentMode : {};\n } catch (_) {\n }\n var hooks = {};\n DOMPurify.isSupported = typeof getParentNode2 === \"function\" && implementation && typeof implementation.createHTMLDocument !== \"undefined\" && documentMode !== 9;\n var MUSTACHE_EXPR$$1 = MUSTACHE_EXPR, ERB_EXPR$$1 = ERB_EXPR, DATA_ATTR$$1 = DATA_ATTR, ARIA_ATTR$$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$$1 = ATTR_WHITESPACE;\n var IS_ALLOWED_URI$$1 = IS_ALLOWED_URI;\n var ALLOWED_TAGS = null;\n var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(html$2), _toConsumableArray$1(svg), _toConsumableArray$1(svgFilters), _toConsumableArray$1(mathMl), _toConsumableArray$1(text)));\n var ALLOWED_ATTR = null;\n var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray$1(html$1$1), _toConsumableArray$1(svg$1), _toConsumableArray$1(mathMl$1), _toConsumableArray$1(xml)));\n var FORBID_TAGS = null;\n var FORBID_ATTR = null;\n var ALLOW_ARIA_ATTR = true;\n var ALLOW_DATA_ATTR = true;\n var ALLOW_UNKNOWN_PROTOCOLS = false;\n var SAFE_FOR_TEMPLATES = false;\n var WHOLE_DOCUMENT = false;\n var SET_CONFIG = false;\n var FORCE_BODY = false;\n var RETURN_DOM = false;\n var RETURN_DOM_FRAGMENT = false;\n var RETURN_DOM_IMPORT = true;\n var RETURN_TRUSTED_TYPE = false;\n var SANITIZE_DOM = true;\n var KEEP_CONTENT = true;\n var IN_PLACE = false;\n var USE_PROFILES = {};\n var FORBID_CONTENTS = null;\n var DEFAULT_FORBID_CONTENTS = addToSet({}, [\"annotation-xml\", \"audio\", \"colgroup\", \"desc\", \"foreignobject\", \"head\", \"iframe\", \"math\", \"mi\", \"mn\", \"mo\", \"ms\", \"mtext\", \"noembed\", \"noframes\", \"noscript\", \"plaintext\", \"script\", \"style\", \"svg\", \"template\", \"thead\", \"title\", \"video\", \"xmp\"]);\n var DATA_URI_TAGS = null;\n var DEFAULT_DATA_URI_TAGS = addToSet({}, [\"audio\", \"video\", \"img\", \"source\", \"image\", \"track\"]);\n var URI_SAFE_ATTRIBUTES = null;\n var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\"alt\", \"class\", \"for\", \"id\", \"label\", \"name\", \"pattern\", \"placeholder\", \"role\", \"summary\", \"title\", \"value\", \"style\", \"xmlns\"]);\n var MATHML_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\n var SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n var HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n var NAMESPACE = HTML_NAMESPACE;\n var IS_EMPTY_INPUT = false;\n var PARSER_MEDIA_TYPE = void 0;\n var SUPPORTED_PARSER_MEDIA_TYPES = [\"application/xhtml+xml\", \"text/html\"];\n var DEFAULT_PARSER_MEDIA_TYPE = \"text/html\";\n var transformCaseFunc = void 0;\n var CONFIG = null;\n var formElement = document2.createElement(\"form\");\n var _parseConfig = function _parseConfig2(cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n if (!cfg || (typeof cfg === \"undefined\" ? \"undefined\" : _typeof(cfg)) !== \"object\") {\n cfg = {};\n }\n cfg = clone(cfg);\n ALLOWED_TAGS = \"ALLOWED_TAGS\" in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = \"ALLOWED_ATTR\" in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES = \"ADD_URI_SAFE_ATTR\" in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = \"ADD_DATA_URI_TAGS\" in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = \"FORBID_CONTENTS\" in cfg ? addToSet({}, cfg.FORBID_CONTENTS) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = \"FORBID_TAGS\" in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};\n FORBID_ATTR = \"FORBID_ATTR\" in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};\n USE_PROFILES = \"USE_PROFILES\" in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;\n RETURN_DOM = cfg.RETURN_DOM || false;\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;\n RETURN_DOM_IMPORT = cfg.RETURN_DOM_IMPORT !== false;\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;\n FORCE_BODY = cfg.FORCE_BODY || false;\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false;\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false;\n IN_PLACE = cfg.IN_PLACE || false;\n IS_ALLOWED_URI$$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$$1;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE;\n transformCaseFunc = PARSER_MEDIA_TYPE === \"application/xhtml+xml\" ? function(x) {\n return x;\n } : stringToLowerCase;\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray$1(text)));\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$2);\n addToSet(ALLOWED_ATTR, html$1$1);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg);\n addToSet(ALLOWED_ATTR, svg$1);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg$1);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl);\n addToSet(ALLOWED_ATTR, mathMl$1);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);\n }\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS);\n }\n if (KEEP_CONTENT) {\n ALLOWED_TAGS[\"#text\"] = true;\n }\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, [\"html\", \"head\", \"body\"]);\n }\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, [\"tbody\"]);\n delete FORBID_TAGS.tbody;\n }\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\"mi\", \"mo\", \"mn\", \"ms\", \"mtext\"]);\n var HTML_INTEGRATION_POINTS = addToSet({}, [\"foreignobject\", \"desc\", \"title\", \"annotation-xml\"]);\n var ALL_SVG_TAGS = addToSet({}, svg);\n addToSet(ALL_SVG_TAGS, svgFilters);\n addToSet(ALL_SVG_TAGS, svgDisallowed);\n var ALL_MATHML_TAGS = addToSet({}, mathMl);\n addToSet(ALL_MATHML_TAGS, mathMlDisallowed);\n var _checkValidNamespace = function _checkValidNamespace2(element) {\n var parent = getParentNode2(element);\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: HTML_NAMESPACE,\n tagName: \"template\"\n };\n }\n var tagName = stringToLowerCase(element.tagName);\n var parentTagName = stringToLowerCase(parent.tagName);\n if (element.namespaceURI === SVG_NAMESPACE) {\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === \"svg\";\n }\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === \"svg\" && (parentTagName === \"annotation-xml\" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === \"math\";\n }\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === \"math\" && HTML_INTEGRATION_POINTS[parentTagName];\n }\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n var commonSvgAndHTMLElements = addToSet({}, [\"title\", \"style\", \"font\", \"a\", \"script\"]);\n return !ALL_MATHML_TAGS[tagName] && (commonSvgAndHTMLElements[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n return false;\n };\n var _forceRemove = function _forceRemove2(node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_2) {\n node.remove();\n }\n }\n };\n var _removeAttribute = function _removeAttribute2(name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node\n });\n }\n node.removeAttribute(name);\n if (name === \"is\" && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {\n }\n } else {\n try {\n node.setAttribute(name, \"\");\n } catch (_) {\n }\n }\n }\n };\n var _initDocument = function _initDocument2(dirty) {\n var doc = void 0;\n var leadingWhitespace = void 0;\n if (FORCE_BODY) {\n dirty = \"\" + dirty;\n } else {\n var matches2 = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches2 && matches2[0];\n }\n if (PARSER_MEDIA_TYPE === \"application/xhtml+xml\") {\n dirty = '' + dirty + \"\";\n }\n var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser2().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {\n }\n }\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, \"template\", null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? \"\" : dirtyPayload;\n } catch (_) {\n }\n }\n var body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document2.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? \"html\" : \"body\")[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n var _createIterator = function _createIterator2(root) {\n return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);\n };\n var _isClobbered = function _isClobbered2(elm) {\n if (elm instanceof Text2 || elm instanceof Comment) {\n return false;\n }\n if (typeof elm.nodeName !== \"string\" || typeof elm.textContent !== \"string\" || typeof elm.removeChild !== \"function\" || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== \"function\" || typeof elm.setAttribute !== \"function\" || typeof elm.namespaceURI !== \"string\" || typeof elm.insertBefore !== \"function\") {\n return true;\n }\n return false;\n };\n var _isNode = function _isNode2(object) {\n return (typeof Node2 === \"undefined\" ? \"undefined\" : _typeof(Node2)) === \"object\" ? object instanceof Node2 : object && (typeof object === \"undefined\" ? \"undefined\" : _typeof(object)) === \"object\" && typeof object.nodeType === \"number\" && typeof object.nodeName === \"string\";\n };\n var _executeHook = function _executeHook2(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n arrayForEach(hooks[entryPoint], function(hook) {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n var _sanitizeElements = function _sanitizeElements2(currentNode) {\n var content = void 0;\n _executeHook(\"beforeSanitizeElements\", currentNode, null);\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n if (stringMatch(currentNode.nodeName, /[\\u0080-\\uFFFF]/)) {\n _forceRemove(currentNode);\n return true;\n }\n var tagName = transformCaseFunc(currentNode.nodeName);\n _executeHook(\"uponSanitizeElement\", currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n if (!_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n if (tagName === \"select\" && regExpTest(/