varri-js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fornac.js","mappings":"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","sources":["webpack://[name]/webpack/universalModuleDefinition","webpack://[name]/./src/naview/connection.js","webpack://[name]/./src/naview/loop.js","webpack://[name]/./src/naview/region.js","webpack://[name]/./node_modules/base64-js/index.js","webpack://[name]/./node_modules/buffer/index.js","webpack://[name]/./src/d3-context-menu.css?fe1f","webpack://[name]/./src/fornac.css?7f8e","webpack://[name]/./node_modules/ieee754/index.js","webpack://[name]/./node_modules/slugid/index.js","webpack://[name]/./node_modules/slugid/slugid.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/rng.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/regex.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/validate.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v1.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/parse.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v35.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/md5.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v3.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v4.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v5.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/nil.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/version.js","webpack://[name]/external umd \"d3\"","webpack://[name]/webpack/bootstrap","webpack://[name]/webpack/runtime/compat get default export","webpack://[name]/webpack/runtime/define property getters","webpack://[name]/webpack/runtime/global","webpack://[name]/webpack/runtime/hasOwnProperty shorthand","webpack://[name]/webpack/runtime/make namespace object","webpack://[name]/webpack/runtime/publicPath","webpack://[name]/./src/img/play.svg","webpack://[name]/./src/d3-context-menu.js","webpack://[name]/./src/rnautils.js","webpack://[name]/./src/rnagraph.js","webpack://[name]/./src/simplernaplot.js","webpack://[name]/./src/naview/radloop.js","webpack://[name]/./src/naview/base.js","webpack://[name]/./src/naview/naview.js","webpack://[name]/./src/fornac.js","webpack://[name]/./src/rnaplot.js","webpack://[name]/./src/rnatreemap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fornac\"] = factory(require(\"d3\"));\n\telse\n\t\troot[\"fornac\"] = factory(root[\"d3\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE__990__) {\nreturn ","import {Loop} from './loop.js';\nimport {Region} from './region.js';\n\nexport function Connection() {\n\tthis.loop = new Loop();\n\tthis.region = new Region();\n\t// Start and end form the 1st base pair of the region.\n\tthis.start = null;\n this.end = null;\n\tthis.xrad = null;\n this.yrad = null;\n this.angle = null;\n\t// True if segment between this connection and the\n\t// next must be extruded out of the circle\n\tthis.extruded = null;\n\t// True if the extruded segment must be drawn long.\n\tthis.broken = null;\n\n\tthis._isNull = false;\n}\n\nConnection.prototype.isNull = function(){\n\treturn this._isNull;\n}\n\nConnection.prototype.setNull = function(isNull){\n\tthis._isNull = isNull;\n}\n\nConnection.prototype.getLoop = function(){\n\treturn this.loop;\n}\n\nConnection.prototype.setLoop = function(loop) {\n\tthis.loop = loop;\n}\n\nConnection.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nConnection.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n\nConnection.prototype.getStart = function(){\n\treturn this.start;\n}\n\nConnection.prototype.setStart = function(start) {\n\tthis.start = start;\n}\n\nConnection.prototype.getEnd = function(){\n\treturn this.end;\n}\n\nConnection.prototype.setEnd = function(end){\n\tthis.end = end;\n}\n\nConnection.prototype.getXrad = function(){\n\treturn this.xrad;\n}\n\nConnection.prototype.setXrad = function(xrad){\n\tthis.xrad = xrad;\n}\n\nConnection.prototype.getYrad = function(){\n\treturn this.yrad;\n}\n\nConnection.prototype.setYrad = function(yrad) {\n\tthis.yrad = yrad;\n}\n\nConnection.prototype.getAngle = function(){\n\treturn this.angle;\n}\n\nConnection.prototype.setAngle = function(angle){\n\tthis.angle = angle;\n}\n\nConnection.prototype.isExtruded = function(){\n\treturn this.extruded;\n}\n\nConnection.prototype.setExtruded = function(extruded){\n\tthis.extruded = extruded;\n}\n\nConnection.prototype.isBroken = function(){\n\treturn this.broken;\n}\n\nConnection.prototype.setBroken = function(broken){\n\tthis.broken = broken;\n}\n","import {Connection} from './connection.js';\n\nexport function Loop() {\n\tthis.nconnection = null;\n\tthis.connections = [];\n\tthis._connections = [];\n\tthis.number = null;\n\tthis.depth = null;\n\tthis.mark = null;\n\tthis.x = null;\n this.y = null;\n this.radius = null;\n}\n\nLoop.prototype.getNconnection = function() {\n\treturn this.nconnection;\n}\n\nLoop.prototype.setNconnection = function(nconnection) {\n\tthis.nconnection = nconnection;\n}\n\nLoop.prototype.setConnection = function(i, c){\n\tif (c != null){\n\t\tthis._connections[i] = c;\n }\n\telse {\n\t\tif (!this._connections[i]){\n\t\t\tthis._connections[i] = new Connection();\n\t\t}\n\t\tthis._connections[i].setNull(true);\n\t}\n}\n\nLoop.prototype.getConnection = function(i){\n\tvar Connection = require(\"./connection\");\n\tif (!this._connections[i]){\n this._connections[i] = new Connection();\n }\n\tvar c = this._connections[i];\n\tif (c.isNull()){\n\t\treturn null;\n }\n\telse {\n\t\treturn c;\n }\n}\n\nLoop.prototype.addConnection = function(i, c){\n\tthis._connections.push(c);\n}\n\nLoop.prototype.getNumber = function(){\n\treturn this.number;\n}\n\nLoop.prototype.setNumber = function(number){\n\tthis.number = number;\n}\n\nLoop.prototype.getDepth = function(){\n\treturn this.depth;\n}\n\nLoop.prototype.setDepth = function(depth){\n\tthis.depth = depth;\n}\n\nLoop.prototype.isMark = function(){\n\treturn this.mark;\n}\n\nLoop.prototype.setMark = function(mark){\n\tthis.mark = mark;\n}\n\nLoop.prototype.getX = function(){\n\treturn this.x;\n}\n\nLoop.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nLoop.prototype.getY = function(){\n\treturn this.y;\n}\n\nLoop.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nLoop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nLoop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n","export function Region() {\n\tthis._start1 = null;\n this._end1 = null;\n this._start2 = null;\n this._end2 = null;\n}\n\nRegion.prototype.getStart1 = function(){\n\treturn this._start1;\n}\n\nRegion.prototype.setStart1 = function(start1){\n\tthis._start1 = start1;\n}\n\nRegion.prototype.getEnd1 = function(){\n\treturn this._end1;\n}\n\nRegion.prototype.setEnd1 = function(end1){\n\tthis._end1 = end1;\n}\n\nRegion.prototype.getStart2 = function(){\n\treturn this._start2;\n}\n\nRegion.prototype.setStart2 = function(start2){\n\tthis._start2 = start2;\n}\n\nRegion.prototype.getEnd2 = function(){\n\treturn this._end2;\n}\n\nRegion.prototype.setEnd2 = function(end2){\n\tthis._end2 = end2;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {};","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {\"nodeStrokeWidth\":\"0.8\",\"directionArrowSize\":\"6\",\"directionArrowWidth\":\"0.7\",\"node\":\"fornac-node\",\"directionArrow\":\"fornac-directionArrow\",\"plot\":\"fornac-plot\",\"selectedNode\":\"fornac-selectedNode\",\"nodeLabel\":\"fornac-nodeLabel\",\"link\":\"fornac-link\",\"plotLabel\":\"fornac-plotLabel\",\"transparent\":\"fornac-transparent\",\"dragLine\":\"fornac-dragLine\",\"mouseEventHelper\":\"fornac-mouseEventHelper\"};","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nmodule.exports = require('./slugid');\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar uuid = require('uuid');\n\n/**\n * Returns the given uuid as a 22 character slug. This can be a regular v4\n * slug or a \"nice\" slug.\n */\nexports.encode = function(uuid_) {\n var bytes = uuid.parse(uuid_);\n var base64 = Buffer.from(bytes).toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns the uuid represented by the given v4 or \"nice\" slug\n */\nexports.decode = function(slug) {\n var base64 = slug\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n + '==';\n return uuid.stringify(Buffer.from(base64, 'base64'));\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug\n */\nexports.v4 = function() {\n var bytes = uuid.v4(null, Buffer.alloc(16));\n var base64 = bytes.toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug which conforms to a set\n * of \"nice\" properties, at the cost of some entropy. Currently this means one\n * extra fixed bit (the first bit of the uuid is set to 0) which guarantees the\n * slug will begin with [A-Za-f]. For example such slugs don't require special\n * handling when used as command line parameters (whereas non-nice slugs may\n * start with `-` which can confuse command line tools).\n *\n * Potentially other \"nice\" properties may be added in future to further\n * restrict the range of potential uuids that may be generated.\n */\nexports.nice = function() {\n var bytes = uuid.v4(null, Buffer.alloc(16));\n bytes[0] = bytes[0] & 0x7f; // unset first bit to ensure [A-Za-f] first char\n var base64 = bytes.toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","module.exports = __WEBPACK_EXTERNAL_MODULE__990__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","export default __webpack_public_path__ + \"02188894d5236b1517df3210b79c2a7f.svg\";","import './d3-context-menu.css';\nimport ArrowIcon from './img/play.svg';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\n\nexport function contextMenu(menu, opts) {\n let previouslyMouseUp = false;\n let clickAway = () => {};\n let uid = slugid.nice();\n let rootElement = null;\n let orientation = 'right'; // display the menu to the right of the mouse click\n // or parent elemement\n let initialPos = null;\n let parentStart = null;\n\n var openCallback,\n closeCallback;\n\n if (typeof opts === 'function') {\n openCallback = opts;\n } else {\n opts = opts || {};\n openCallback = opts.onOpen;\n closeCallback = opts.onClose;\n }\n\n if ('rootElement' in opts)\n rootElement = opts['rootElement']\n\n if ('pos' in opts) {\n // do we want to place this menu somewhere specific?\n initialPos = opts.pos;\n }\n\n if ('orientation' in opts) {\n orientation = opts.orientation;\n }\n\n if ('parentStart' in opts) {\n parentStart = opts.parentStart;\n }\n\n // create the div element that will hold the context menu\n d3.selectAll('.d3-context-menu-' + uid).data([1])\n .enter()\n .append('div')\n .classed('d3-context-menu', true)\n .classed('d3-context-menu-' + uid, true)\n\n // close menu\n d3.select('body').on('click.d3-context-menu-' + uid, function() {\n if (previouslyMouseUp) {\n previouslyMouseUp = false;\n return;\n }\n console.log('body click close');\n\n d3.select('.d3-context-menu-' + uid).style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n });\n\n // this gets executed when a contextmenu event occurs\n return function(data, index, pMouseUp=false,\n clickAwayFunc = function() { } ) {\n var elm = this;\n var contextMenuPos = null;\n let mousePos = null;\n let currentThis = this;\n\n if (rootElement == null)\n mousePos = d3.mouse(this);\n else\n mousePos = d3.mouse(rootElement); // for recursive menus, we need the mouse\n // position relative to another element\n\n clickAway = clickAwayFunc;\n let openChildMenuUid = null;\n\n previouslyMouseUp = pMouseUp;\n\n d3.selectAll('.d3-context-menu-' + uid).html('');\n var list = d3.selectAll('.d3-context-menu-' + uid)\n .on('contextmenu', function(d) {\n console.log('context-menu close');\n d3.select('.d3-context-menu-' + uid).style('display', 'none'); \n orientation = 'right';\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n })\n .append('ul');\n\n list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter()\n .append('li')\n .attr('class', function(d) {\n console.log('d:', d);\n var ret = '';\n if (d.divider) {\n ret += ' is-divider';\n }\n if (d.disabled) {\n ret += ' is-disabled';\n }\n if (!d.action) {\n ret += ' is-header';\n }\n if ('children' in d) {\n ret += ' d3-context-menu-recursive';\n }\n return ret;\n })\n .html(function(d) {\n if (d.divider) {\n return '<hr>';\n }\n if (!d.title) {\n console.error('No title attribute set. Check the spelling of your options.');\n }\n return (typeof d.title === 'string') ? d.title : d.title(data);\n })\n .on('click', function(d, i) {\n if (d.disabled) return; // do nothing if disabled\n if (!d.action) return; // headers have no \"action\"\n d.action(elm, data, index, mousePos);\n console.log('click close');\n\n // close all context menus\n d3.selectAll('.d3-context-menu').style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n })\n .on('mouseenter', function(d, i) {\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n\n if (openChildMenuUid != null) {\n // there's a child menu open\n\n // unselect all items\n d3.select('.d3-context-menu-' + uid)\n .selectAll('li')\n .classed('d3-context-menu-selected', false);\n\n if (typeof d.children == 'undefined') {\n console.log(\"no children close\");\n // no children, so hide any open child menus\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n return;\n }\n\n if (d.childUid == openChildMenuUid) {\n // the correct child menu is already open\n return;\n\n } else {\n // need to open a different child menu\n console.log('open different child menu close');\n \n // close the already open one\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n\n }\n } \n\n // there should be no menu open right now\n if (typeof d.children != 'undefined') {\n let boundingRect = this.getBoundingClientRect();\n\n let childrenContextMenu = null\n if (orientation == 'left') {\n childrenContextMenu = contextMenu(d.children, {'rootElement': currentThis,\n 'pos': [ boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'orientation': 'left'});\n } else {\n childrenContextMenu = contextMenu(d.children, \n {\n 'pos': [ boundingRect.left + boundingRect.width + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'rootElement': currentThis,\n 'parentStart': [boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset]});\n }\n\n d.childUid = childrenContextMenu.apply(this, [data,i,true,\n function() { }]);\n openChildMenuUid = d.childUid;\n }\n\n\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n \n })\n .on('mouseleave', function(d, i) {\n\n if (openChildMenuUid == null) {\n d3.select(this)\n .classed('d3-context-menu-selected', false);\n }\n });\n\n list.selectAll('.d3-context-menu-recursive')\n .append('img')\n .attr('src', ArrowIcon)\n .attr('width', '14px')\n .attr('height', '14px')\n .style('position', 'absolute')\n .style('right', '5px')\n ;\n\n // the openCallback allows an action to fire before the menu is displayed\n // an example usage would be closing a tooltip\n if (openCallback) {\n if (openCallback(data, index) === false) {\n return uid;\n }\n }\n\n let contextMenuSelection = d3.select('.d3-context-menu-' + uid)\n .style('display', 'block');\n\n if (initialPos == null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', initialPos[0] + 'px')\n .style('top', initialPos[1] + 'px')\n }\n\n // check if the menu disappears off the side of the window\n let boundingRect = contextMenuSelection.node().getBoundingClientRect();\n\n if (boundingRect.left + boundingRect.width > window.innerWidth || orientation == 'left') {\n orientation = 'left';\n\n // menu goes of the end of the window, position it the other way\n if (initialPos == null) {\n // place the menu where the user clicked\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2 - boundingRect.width) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n if (parentStart != null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (parentStart[0] - boundingRect.width) + 'px')\n .style('top', parentStart[1] + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (initialPos[0] - boundingRect.width) + 'px')\n .style('top', initialPos[1] + 'px')\n }\n }\n \n }\n\n // display context menu\n\n if (previouslyMouseUp)\n return uid;\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n //d3.event.stopImmediatePropagation();\n //\n return uid;\n };\n};\n","var numberSort = function(a,b) { return a - b; };\n\nexport function arraysEqual(a, b) {\n // courtesy of \n // http://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.length != b.length) return false;\n\n // If you don't care about the order of the elements inside\n // the array, you should sort both arrays here.\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport function RNAUtilities() {\n var self = this;\n\n // the brackets to use when constructing dotbracket strings\n // with pseudoknots\n self.bracketLeft = \"([{<ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\n self.bracketRight = \")]}>abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\n self.inverseBrackets = function(bracket) {\n var res = {};\n for (var i = 0; i < bracket.length; i++) {\n res[bracket[i]] = i;\n }\n return res;\n };\n\n self.maximumMatching = function maximumMatching(pt){\n // Courtesy of the great Ronny Lorenz\n\n var n = pt[0];\n var TURN = 0; //minimal number of nucleotides in the hairpin\n\n /* array init */\n var mm = new Array(n + 1);\n for(var i = 0; i <= n; i++){\n mm[i] = new Array(n + 1);\n for(var j = i; j <= n; j++)\n mm[i][j] = 0;\n }\n var maximum = 0;\n\n /* actual computation */\n for(var i = n - TURN - 1; i > 0; i--)\n\n for(var j = i + TURN + 1; j <= n; j++){\n maximum = mm[i][j-1];\n\n for(var l = j - TURN - 1; l >= i; l--) {\n if(pt[l] === j) {\n\n // we have a base pair here\n maximum = Math.max(maximum, ((l > i) ? mm[i][l-1] : 0) + 1 + ((j - l - 1 > 0) ? mm[l+1][j-1] : 0));\n }\n }\n\n mm[i][j] = maximum;\n }\n\n maximum = mm[1][n];\n\n return mm;\n };\n\n self.backtrackMaximumMatching = function(mm, oldPt) {\n var pt = Array.apply(null, \n Array(mm.length)).map(function() { return 0 }); \n //create an array containing zeros\n\n self.mmBt(mm, pt, oldPt, 1, mm.length-1);\n return pt;\n }\n\n self.mmBt = function(mm, pt, oldPt, i, j){\n // Create a pairtable from the backtracking\n var maximum = mm[i][j];\n var TURN = 0;\n\n if(j - i - 1 < TURN) return; /* no more pairs */\n\n if(mm[i][j-1] == maximum){ /* j is unpaired */\n self.mmBt(mm, pt, oldPt, i, j-1);\n return;\n }\n\n for(var q = j - TURN - 1; q >= i; q--){ /* j is paired with some q */\n if (oldPt[j] !== q)\n continue;\n\n var leftPart = (q > i) ? mm[i][q-1] : 0;\n var enclosedPart = (j - q - 1 > 0) ? mm[q+1][j-1] : 0;\n\n if(leftPart + enclosedPart + 1 == maximum) {\n // there's a base pair between j and q\n pt[q] = j;\n pt[j] = q;\n\n if(i < q) \n self.mmBt(mm, pt, oldPt, i, q - 1);\n\n self.mmBt(mm, pt, oldPt, q + 1, j - 1);\n return;\n }\n }\n\n //alert(i + \",\" + j + \": backtracking failed!\");\n console.log('FAILED!!!' + i + ',' + j + ': backtracking failed!');\n\n };\n\n self.dotbracketToPairtable = function(dotbracket) {\n // create an array and initialize it to 0\n var pt = Array.apply(null, new Array(dotbracket.length + 1)).map(Number.prototype.valueOf,0);\n \n // the first element is always the length of the RNA molecule\n pt[0] = dotbracket.length;\n\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < self.bracketLeft.length; i++) {\n stack[i] = [];\n }\n\n // lookup the index of each symbol in the bracket array\n var inverseBracketLeft = self.inverseBrackets(self.bracketLeft);\n var inverseBracketRight = self.inverseBrackets(self.bracketRight);\n\n for (var i = 0; i < dotbracket.length; i++) {\n var a = dotbracket[i];\n var ni = i + 1;\n\n if (a == '.' || a == 'o') {\n // unpaired\n pt[ni] = 0;\n } else {\n if (a in inverseBracketLeft) {\n // open pair?\n stack[inverseBracketLeft[a]].push(ni);\n } else if (a in inverseBracketRight){\n // close pair?\n var j = stack[inverseBracketRight[a]].pop();\n\n pt[ni] = j;\n pt[j] = ni;\n } else {\n throw \"Unknown symbol in dotbracket string\";\n }\n }\n }\n\n for (var key in stack) {\n if (stack[key].length > 0) {\n throw \"Unmatched base at position \" + stack[key][0];\n }\n }\n\n return pt;\n };\n\n self.insertIntoStack = function(stack, i, j) {\n var k = 0;\n while (stack[k].length > 0 && stack[k][stack[k].length - 1] < j) {\n k += 1;\n }\n\n stack[k].push(j);\n return k;\n };\n\n self.deleteFromStack = function(stack, j) {\n var k = 0;\n while (stack[k].length === 0 || stack[k][stack[k].length-1] != j) {\n k += 1;\n }\n stack[k].pop();\n return k;\n };\n\n self.pairtableToDotbracket = function(pt) {\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < pt[0]; i++) {\n stack[i] = [];\n }\n\n var seen = {};\n var res = \"\";\n var i;\n for (var i = 1; i < pt[0] + 1; i++) {\n if (pt[i] !== 0 && pt[i] in seen) {\n throw \"Invalid pairtable contains duplicate entries\";\n }\n seen[pt[i]] = true;\n\n if (pt[i] === 0) {\n res += '.';\n } else {\n if (pt[i] > i) {\n res += self.bracketLeft[self.insertIntoStack(stack, i, pt[i])];\n } else {\n res += self.bracketRight[self.deleteFromStack(stack, i)];\n }\n }\n }\n\n return res;\n };\n\n self.findUnmatched = function(pt, from, to) {\n /*\n * Find unmatched nucleotides in this molecule.\n */\n var toRemove = [];\n var unmatched = [];\n\n var origFrom = from;\n var origTo = to;\n var i;\n\n for (var i = from; i <= to; i++)\n if (pt[i] !== 0 && (pt[i] < from || pt[i] > to))\n unmatched.push([i,pt[i]]);\n\n for (var i = origFrom; i <= origTo; i++) {\n while (pt[i] === 0 && i <= origTo) i++;\n\n to = pt[i];\n\n while (pt[i] === to) {\n i++;\n to--;\n }\n \n toRemove = toRemove.concat(self.findUnmatched(pt, i, to));\n }\n\n if (unmatched.length > 0)\n toRemove.push(unmatched);\n\n return toRemove;\n };\n\n self.removePseudoknotsFromPairtable = function(pt) {\n /* Remove the pseudoknots from this structure in such a fashion\n * that the least amount of base-pairs need to be broken\n *\n * The pairtable is manipulated in place and a list of tuples\n * indicating the broken base pairs is returned.\n */\n\n var mm = self.maximumMatching(pt);\n var newPt = self.backtrackMaximumMatching(mm, pt);\n var removed = [];\n\n for (var i = 1; i < pt.length; i++) {\n if (pt[i] < i)\n continue;\n\n if (newPt[i] != pt[i]) {\n removed.push([i, pt[i]]);\n pt[pt[i]] = 0;\n pt[i] = 0;\n }\n }\n\n return removed;\n };\n\n self.ptToElements = function(pt, level, i, j, dotBracketBreaks) {\n /* Convert a pair table to a list of secondary structure \n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (arguments.length < 5)\n dotBracketBreaks = [];\n\n if (i > j)\n return [];\n \n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k], dotBracketBreaks));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n \n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n \n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n } \n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j, dotBracketBreaks));\n };\n\n}\n\nexport var rnaUtilities = new RNAUtilities();\n\nexport function ColorScheme(colorsText) {\n var self = this;\n self.colorsText = colorsText;\n\n self.parseRange = function(rangeText) {\n //parse a number range such as 1-10 or 3,7,9 or just 7\n var parts = rangeText.split(',')\n var nums = [];\n\n for (var i = 0; i < parts.length; i++) {\n //could be 1 or 10-11 or something like that\n var parts1 = parts[i].split('-');\n\n if (parts1.length == 1)\n nums.push(parseInt(parts1[0]));\n else if (parts1.length == 2) {\n var from = parseInt(parts1[0]);\n var to = parseInt(parts1[1]);\n\n // add each number in this range\n for (var j = from; j <= to; j++) \n nums.push(j)\n } else {\n console.log('Malformed range (too many dashes):', rangeText);\n }\n }\n\n return nums;\n }\n\n self.parseColorText = function(colorText) {\n /* Parse the text of an RNA color string. Instructions and description\n * of the format are given below.\n *\n * The return is a json double dictionary indexed first by the \n * molecule name, then by the nucleotide. This is then applied\n * by force.js to the RNAs it is displaying. When no molecule\n * name is specified, the color is applied to all molecules*/\n var lines = colorText.split('\\n');\n var currMolecule = '';\n var counter = 1;\n var colorsJson = {colorValues: {'':{}}, range:['white', 'steelblue']};\n var domainValues = [];\n\n\n for (var i = 0; i < lines.length; i++) {\n\n if (lines[i][0] == '>') {\n // new molecule\n currMolecule = lines[i].trim().slice(1);\n counter = 1;\n\n colorsJson.colorValues[currMolecule] = {};\n continue;\n }\n\n let words = lines[i].trim().split(/[\\s]+/);\n\n for (var j = 0; j < words.length; j++) {\n if (isNaN(words[j])) {\n if (words[j].search('range') === 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.range = [partsRight[0], partsRight[1]];\n continue;\n }\n\n if (words[j].search('domain') == 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.domain = [partsRight[0], partsRight[1]];\n continue;\n }\n\n // it's not a number, should be a combination \n // of a number (nucleotide #) and a color\n let parts = words[j].split(':');\n let nums = self.parseRange(parts[0]);\n let color = parts[1]\n\n for (var k = 0; k < nums.length; k++) {\n if (isNaN(color)) {\n colorsJson.colorValues[currMolecule][nums[k]] = color;\n } else {\n colorsJson.colorValues[currMolecule][nums[k]] = +color;\n domainValues.push(Number(color));\n }\n }\n } else {\n //it's a number, so we add it to the list of values\n //seen for this molecule\n colorsJson.colorValues[currMolecule][counter] = Number(words[j]);\n counter += 1;\n\n domainValues.push(Number(words[j]));\n }\n }\n }\n\n if (!('domain' in colorsJson))\n colorsJson.domain = [Math.min.apply(null, domainValues), Math.max.apply(null, domainValues)];\n\n self.colorsJson = colorsJson;\n\n return self;\n };\n\n self.normalizeColors = function() {\n /* \n * Normalize the passed in values so that they range from\n * 0 to 1\n */\n var value;\n\n for (var moleculeName in self.colorsJson) {\n var minNum = Number.MAX_VALUE;\n var maxNum = Number.MIN_VALUE;\n\n // iterate once to find the min and max values;\n for (var resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n if (value < minNum)\n minNum = value;\n if (value > maxNum)\n maxNum = value;\n }\n }\n\n // iterate again to normalize\n for (resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n self.colorsJson.colorValues[moleculeName][resnum] = (value - minNum ) / (maxNum - minNum);\n }\n }\n }\n\n return self;\n };\n\n self.parseColorText(self.colorsText);\n return self;\n}\n","import {arraysEqual,RNAUtilities,rnaUtilities} from './rnautils.js';\nimport slugid from 'slugid';\n\nvar numberSort = function(a,b) { return a - b; };\n\nif (typeof(String.prototype.trim) === 'undefined') {\n String.prototype.trim = function() {\n return String(this).replace(/^\\s+|\\s+$/g, '');\n };\n}\n\nexport function ProteinGraph(structName, size, uid) {\n var self = this;\n\n self.type = 'protein';\n self.size = size;\n self.nodes = [{'name': 'P',\n 'num': 1,\n 'radius': 3 * Math.sqrt(size),\n 'rna': self,\n 'nodeType': 'protein',\n 'structName': structName,\n 'elemType': 'p',\n 'size': size,\n 'uid': slugid.nice()}];\n\n self.links = [];\n self.uid = slugid.nice();\n\n self.addUids = function(uids) {\n for (let i = 0; i < uids.length; i++)\n self.nodes[i].uid = uids[i];\n\n return self;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n}\n\nexport function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber = 1) {\n var self = this;\n\n self.type = 'rna';\n self.circularizeExternal = false;\n self.seq = seq;\n self.dotbracket = dotbracket; //i.e. ..((..))..\n self.structName = structName;\n self.circular = false;\n\n if (self.dotbracket.slice(-1) == '*') {\n //circular RNA\n self.dotbracket = self.dotbracket.slice(0, -1);\n self.circular = true;\n }\n\n self.uid = slugid.nice();\n\n self.elements = []; //store the elements and the\n //nucleotides they contain\n self.pseudoknotPairs = [];\n self.nucsToNodes = {};\n\n self.addUids = function(uids) {\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n for (let i = 0; i < uids.length && i < nucleotideNodes.length; i++) {\n nucleotideNodes[i].uid = uids[i];\n }\n\n return self;\n };\n\n self.computePairtable = function() {\n self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);\n };\n\n self.removeBreaks = function(targetString) {\n // Remove all chain breaks (denoted with a '&', which indicate\n // that the input represents more than one strand)\n var breaks = [];\n var breakIndex = -1;\n\n while ((breakIndex = targetString.indexOf('&')) >= 0) {\n breaks.push(breakIndex);\n targetString = targetString.substring(0, breakIndex) + targetString.substring(breakIndex+1, targetString.length);\n\n }\n\n return {targetString: targetString, breaks: breaks};\n };\n\n var ret = self.removeBreaks(self.dotbracket);\n self.dotbracket = ret.targetString;\n self.dotBracketBreaks = ret.breaks;\n\n ret = self.removeBreaks(self.seq);\n self.seq = ret.targetString;\n self.seqBreaks = ret.breaks;\n\n self.rnaLength = self.dotbracket.length;\n\n if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {\n console.log('WARNING: Sequence and structure breaks not equal');\n console.log('WARNING: Using the breaks in the structure');\n }\n\n self.computePairtable();\n\n self.addPositions = function(nodeType, positions) {\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < labelNodes.length; i++) {\n labelNodes[i].x = positions[i][0];\n labelNodes[i].y = positions[i][1];\n }\n\n return self;\n };\n\n self.breakNodesToFakeNodes = function() {\n // convert all the nodes following breaks to fake nodes\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n // if a node was an artifical break node, convert it to a middle\n for (let i = 0; i < labelNodes.length; i++) {\n if (self.dotBracketBreaks.indexOf(i) >= 0) {\n labelNodes[i].nodeType = 'middle';\n labelNodes[i+1].nodeType = 'middle';\n }\n }\n\n for (let i = 0; i < self.elements.length; i++) {\n var broken = false;\n\n // change the elemType of the other nodes in the element containing\n // the break\n for (let j = 0; j < self.elements[i][2].length; j++) {\n if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)\n broken = true;\n }\n\n if (broken) {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = 'e';\n });\n } else {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = self.elements[i][0];\n });\n }\n }\n return self;\n };\n\n self.getPositions = function(nodeType) {\n var positions = [];\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < nucleotideNodes.length; i++)\n positions.push([nucleotideNodes[i].x, nucleotideNodes[i].y]);\n\n return positions;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n var uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n self.reinforceStems = function() {\n var pt = self.pairtable;\n let relevantElements = self.elements.filter( function(d) {\n return d[0] == 's' && d[2].length >= 4;\n });\n\n for (let i = 0; i < relevantElements.length; i++) {\n let allNucs = relevantElements[i][2];\n let nucs = allNucs.slice(0, allNucs.length / 2);\n\n for (let j = 0; j < nucs.length-1; j++) {\n self.addFakeNode([nucs[j], nucs[j+1], pt[nucs[j+1]], pt[nucs[j]]]);\n }\n }\n\n return self;\n };\n\n self.reinforceLoops = function() {\n /*\n * Add a set of fake nodes to enforce the structure\n */\n var filterNucs = function(d) {\n return d !== 0 && d <= self.dotbracket.length;\n };\n\n for (let i = 0; i < self.elements.length; i++) {\n if (self.elements[i][0] == 's' || (!self.circularizeExternal && self.elements[i][0] == 'e'))\n continue;\n\n var nucs = self.elements[i][2].filter(filterNucs);\n\n if (self.elements[i][0] == 'e') {\n var newNode1 = {'name': '',\n 'num': -3,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[self.rnaLength-1].x,\n 'y': self.nodes[self.rnaLength-1].y,\n 'px': self.nodes[self.rnaLength-1].px,\n 'py': self.nodes[self.rnaLength-1].py,\n 'uid': slugid.nice() };\n var newNode2 = {'name': '',\n 'num': -2,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[0].x,\n 'y': self.nodes[0].y,\n 'px': self.nodes[0].px,\n 'py': self.nodes[0].py,\n 'uid': slugid.nice() };\n\n nucs.push(self.nodes.length+1);\n nucs.push(self.nodes.length+2);\n self.nodes.push(newNode1);\n self.nodes.push(newNode2);\n }\n\n\n self.addFakeNode(nucs);\n }\n\n return self;\n };\n\n self.updateLinkUids = function() {\n for (let i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n };\n\n self.addFakeNode = function(nucs) {\n var linkLength = 18; //make sure this is consistent with the value in force.js\n var nodeWidth = 6;\n var angle = (3.1415 * 2) / (2 * nucs.length);\n var radius = linkLength / (2 * Math.tan(angle));\n\n var fakeNodeUid = '';\n\n for (let i = 0; i < nucs.length; i++)\n fakeNodeUid += self.nodes[nucs[i]-1].uid;\n\n var newNode = {'name': '',\n 'num': -1,\n //'radius': 18 * radius -6,\n 'radius': radius,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': nucs,\n 'uid': fakeNodeUid };\n self.nodes.push(newNode);\n\n var newX = 0;\n var newY = 0;\n var coordsCounted = 0;\n\n angle = (nucs.length - 2) * 3.14159 / (2 * nucs.length);\n radius = 0.5 / Math.cos(angle);\n\n for (let j = 0; j < nucs.length; j++) {\n if (nucs[j] === 0 || nucs[j] > self.dotbracket.length)\n continue;\n\n //link to the center node\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[self.nodes.length-1],\n 'linkType': 'fake',\n 'value': radius,\n 'uid': slugid.nice() });\n\n if (nucs.length > 4) {\n //link across the loop\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + Math.floor(nucs.length / 2)) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': radius * 2,\n 'uid': slugid.nice() });\n }\n\n var ia = ((nucs.length - 2) * 3.14159) / nucs.length;\n var c = 2 * Math.cos(3.14159 / 2 - ia / 2);\n //link to over-neighbor\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + 2) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': c});\n\n // calculate the mean of the coordinats in this loop\n // and place the fake node there\n var fromNode = self.nodes[nucs[j]-1];\n if ('x' in fromNode) {\n newX += fromNode.x;\n newY += fromNode.y;\n\n coordsCounted += 1;\n }\n }\n\n if (coordsCounted > 0) {\n // the nucleotides had set positions so we can calculate the position\n // of the fake node\n newNode.x = newX / coordsCounted;\n newNode.y = newY / coordsCounted;\n newNode.px = newNode.x;\n newNode.py = newNode.y;\n }\n\n return self;\n };\n\n self.connectFakeNodes = function() {\n var linkLength = 18;\n\n // We want to be able to connect all of the fake nodes\n // and create a structure consisting of just them\n var filterOutNonFakeNodes = function(d) {\n return d.nodeType == 'middle';\n }\n\n var nucsToNodes = {};\n var fakeNodes = self.nodes.filter(filterOutNonFakeNodes);\n var linked = {};\n\n // initialize the nucleotides to nodes\n for (var i = 1; i <= self.nodes.length; i++)\n nucsToNodes[i] = [];\n\n for (var i = 0; i < fakeNodes.length; i++) {\n var thisNode = fakeNodes[i];\n\n // each fake node represents a certain set of nucleotides (thisNode.nucs)\n for (var j = 0; j < thisNode.nucs.length; j++) {\n var thisNuc = thisNode.nucs[j];\n\n // check to see if this nucleotide has been seen in another fake node\n // if it has, then we add a link between the two nodes\n for (var k = 0; k < nucsToNodes[thisNuc].length; k++) {\n if (JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort()) in linked)\n continue; //already linked\n\n var distance = nucsToNodes[thisNuc][k].radius + thisNode.radius;\n\n self.links.push({'source': nucsToNodes[thisNuc][k],\n 'target': thisNode,\n 'value': distance / linkLength,\n 'linkType': 'fake_fake'});\n\n // note that we've already seen this link\n linked[JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort())] = true;\n }\n\n nucsToNodes[thisNuc].push(thisNode);\n }\n }\n\n return self;\n\n };\n\n self.addExtraLinks = function(extraLinks) {\n if (typeof extraLinks == 'undefined')\n return self;\n\n for (var i = 0; i < extraLinks.length; i++) {\n var source = self.getNodeFromNucleotides(extraLinks[i].from);\n var target = self.getNodeFromNucleotides(extraLinks[i].to);\n\n var newLink = {'source': source, 'target': target, 'linkType': 'extra',\n 'extraLinkType': extraLinks[i].linkType, 'uid': slugid.nice() };\n\n self.links.push(newLink);\n }\n\n return self;\n }\n\n\n self.elementsToJson = function() {\n /* Convert a set of secondary structure elements to a json\n * representation of the graph that can be used with d3's\n * force-directed layout to generate a visualization of\n * the structure.\n */\n var pt = self.pairtable;\n var elements = self.elements;\n\n self.nodes = [];\n self.links = [];\n\n //create a reverse lookup so we can find out the type\n //of element that a node is part of\n var elemTypes = {};\n\n //sort so that we count stems last\n self.elements.sort();\n\n for (let i = 0; i < self.elements.length; i++) {\n var nucs = self.elements[i][2];\n for (let j = 0; j < nucs.length; j++) {\n elemTypes[nucs[j]] = self.elements[i][0];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n var nodeName = self.seq[i-1];\n\n if (self.dotBracketBreaks.indexOf(i-1) >= 0 ||\n self.dotBracketBreaks.indexOf(i-2) >= 0) {\n nodeName = '';\n }\n\n //create a node for each nucleotide\n self.nodes.push({'name': nodeName,\n 'num': startNumber + i - 1,\n 'radius': 5,\n 'rna': self,\n 'nodeType': 'nucleotide',\n 'structName': self.structName,\n 'elemType': elemTypes[i],\n 'uid': slugid.nice(),\n 'linked': false});\n }\n\n for (let i = 0; i < self.nodes.length; i++) {\n if (i === 0)\n self.nodes[i].prevNode = null;\n else {\n self.nodes[i].prevNode = self.nodes[i-1];\n }\n\n if (i == self.nodes.length-1)\n self.nodes[i].nextNode = null;\n else {\n self.nodes[i].nextNode = self.nodes[i+1];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n\n if (pt[i] !== 0) {\n // base-pair links\n self.links.push({'source': self.nodes[i-1],\n 'target': self.nodes[pt[i]-1],\n 'linkType': 'basepair',\n 'value': 1,\n 'uid': slugid.nice() });\n }\n\n if (i > 1) {\n // backbone links\n if (self.dotBracketBreaks.indexOf(i-1) === -1 &&\n self.dotBracketBreaks.indexOf(i-2) == -1 &&\n self.dotBracketBreaks.indexOf(i-3) == -1) {\n // there is no break in the strands here\n // we can add a backbone link\n self.links.push({'source': self.nodes[i-2],\n 'target': self.nodes[i-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n self.nodes[i-1].linked = true;\n }\n }\n }\n\n //add the pseudoknot links\n for (let i = 0; i < self.pseudoknotPairs.length; i++) {\n self.links.push({'source': self.nodes[self.pseudoknotPairs[i][0]-1],\n 'target': self.nodes[self.pseudoknotPairs[i][1]-1],\n 'linkType': 'pseudoknot',\n 'value': 1,\n 'uid': slugid.nice()});\n }\n\n if (self.circular) {\n self.links.push({'source': self.nodes[0],\n 'target': self.nodes[self.rnaLength-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n\n }\n\n return self;\n };\n\n self.ptToElements = function(pt, level, i, j) {\n /* Convert a pair table to a list of secondary structure\n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (i > j)\n return [];\n\n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k]));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n\n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n\n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n }\n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j));\n };\n\n self.addLabels = function(startNumber = 1, labelInterval = 10) {\n if (labelInterval === 0)\n return self;\n\n for (let i = 1; i <= self.rnaLength; i++) {\n // add labels\n if (i % labelInterval === 0) {\n //create a node for each label\n let newX, newY;\n\n let thisNode = self.nodes[i-1];\n let prevNode, nextNode;\n let prevVec, nextVec;\n\n if (self.rnaLength == 1) {\n nextVec = [thisNode.x - 15, thisNode.y];\n prevVec = [thisNode.x - 15, thisNode.y];\n } else {\n // if we're labelling the first node, then label it in relation to the last\n if (i == 1)\n prevNode = self.nodes[self.rnaLength - 1];\n else\n prevNode = self.nodes[i - 2];\n\n // if we're labelling the last node, then label it in relation to the first\n if (i == self.rnaLength)\n nextNode = self.nodes[0];\n else\n nextNode = self.nodes[i];\n\n // this nucleotide and its neighbors are paired\n if (self.pairtable[nextNode.num - startNumber+1] !== 0 &&\n self.pairtable[prevNode.num - startNumber+1] !== 0 &&\n self.pairtable[thisNode.num - startNumber+1] !== 0) {\n\n prevNode = nextNode = self.nodes[self.pairtable[thisNode.num - startNumber+1]-1];\n }\n\n // this node is paired but at least one of its neighbors is unpaired\n // place the label in the direction of the two neighbors\n if (self.pairtable[thisNode.num - startNumber+1] !== 0 && (\n self.pairtable[nextNode.num - startNumber+1] === 0 ||\n self.pairtable[prevNode.num - startNumber+1] === 0)) {\n nextVec = [thisNode.x - nextNode.x, thisNode.y - nextNode.y];\n prevVec = [thisNode.x - prevNode.x, thisNode.y - prevNode.y];\n\n } else {\n nextVec = [nextNode.x - thisNode.x, nextNode.y - thisNode.y];\n prevVec = [prevNode.x - thisNode.x, prevNode.y - thisNode.y];\n }\n }\n\n var combinedVec = [nextVec[0] + prevVec[0], nextVec[1] + prevVec[1]];\n var vecLength = Math.sqrt(combinedVec[0] * combinedVec[0] + combinedVec[1] * combinedVec[1]);\n var normedVec = [combinedVec[0] / vecLength, combinedVec[1] / vecLength];\n var offsetVec = [-15 * normedVec[0], -15 * normedVec[1]];\n\n newX = self.nodes[i-1].x + offsetVec[0];\n newY = self.nodes[i-1].y + offsetVec[1];\n\n var newNode = {'name': i + startNumber -1,\n 'num': -1,\n 'radius': 6,\n 'rna': self,\n 'nodeType': 'label',\n 'structName': self.structName,\n 'elemType': 'l',\n 'x': newX,\n 'y': newY,\n 'px': newX,\n 'py': newY,\n 'uid': slugid.nice() };\n var newLink = {'source': self.nodes[i-1],\n 'target': newNode,\n 'value': 1,\n 'linkType': 'label_link',\n 'uid': slugid.nice() };\n\n self.nodes.push(newNode);\n self.links.push(newLink);\n }\n }\n\n return self;\n };\n\n self.recalculateElements = function() {\n self.removePseudoknots();\n self.elements = self.ptToElements(self.pairtable, 0, 1, self.dotbracket.length);\n\n if (self.circular) {\n //check to see if the external loop is a hairpin or a multiloop\n let externalLoop = self.elements.filter(function(d) { if (d[0] == 'e') return true; });\n\n if (externalLoop.length > 0) {\n eloop = externalLoop[0];\n nucs = eloop[2].sort(numberSort);\n\n prev = nucs[0];\n hloop = true;\n numGreater = 0;\n for (let i = 1; i < nucs.length; i++) {\n if (nucs[i] - prev > 1) {\n numGreater += 1;\n }\n prev = nucs[i];\n }\n\n if (numGreater == 1) {\n eloop[0] = 'h';\n } else if (numGreater == 2) {\n eloop[0] = 'i';\n } else {\n eloop[0] = 'm';\n }\n }\n }\n\n return self;\n };\n\n self.reassignLinkUids = function() {\n // reassign uids to the links, corresponding to the uids of the two nodes\n // they connect\n var i;\n\n for (var i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n }\n\n self.removePseudoknots = function() {\n if (self.pairtable.length > 1)\n self.pseudoknotPairs = self.pseudoknotPairs.concat(rnaUtilities.removePseudoknotsFromPairtable(self.pairtable));\n\n return self;\n };\n\n self.addPseudoknots = function() {\n /* Add all of the pseudoknot pairs which are stored outside\n * of the pairtable back to the pairtable\n */\n var pt = self.pairtable;\n var pseudoknotPairs = self.pseudoknotPairs;\n\n for (var i = 0; i < pseudoknotPairs.length; i++) {\n pt[pseudoknotPairs[i][0]] = pseudoknotPairs[i][1];\n pt[pseudoknotPairs[i][1]] = pseudoknotPairs[i][0];\n }\n\n self.pseudoknotPairs = [];\n return self;\n };\n\n self.addName = function(name) {\n if (typeof name == 'undefined') {\n self.name = '';\n return self;\n } else {\n self.name = name;\n return self;\n }\n };\n\n\n if (self.rnaLength > 0)\n self.recalculateElements();\n\n self.getNodeFromNucleotides = function(nucs) {\n /* Get a node given a nucleotide number or an array of nucleotide\n * numbers indicating an element node */\n if (Object.prototype.toString.call(nucs) === '[object Array]') {\n for (let j = 0; j < self.nodes.length; j++) {\n if ('nucs' in self.nodes[j]) {\n if (self.nodes[j].nucs.equals(nucs)) {\n return self.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < self.nodes.length; j++) {\n if (self.nodes[j].num == nucs) {\n return self.nodes[j];\n }\n }\n }\n\n console.log('ERROR: No node found for nucs:', nucs);\n return null;\n }\n}\n\nexport function moleculesToJson(moleculesJson) {\n /* Convert a list of RNA and protein molecules to a list of RNAGraph\n * ProteinGraph and extraLinks structure */\n\n var nodes = {}; //index the nodes by uid\n var graphs = [];\n var extraLinks = [];\n\n\n // Create the graphs for each molecule\n for (var i = 0; i < moleculesJson.molecules.length; i++) {\n var molecule = moleculesJson.molecules[i];\n var rg;\n\n if (molecule.type == 'rna') {\n rg = new RNAGraph(molecule.seq, molecule.ss, molecule.header);\n rg.circularizeExternal = true;\n rg.elementsToJson()\n .addPositions('nucleotide', molecule.positions)\n .addLabels()\n .reinforceStems()\n .reinforceLoops();\n\n\n } else if (molecule.type == 'protein') {\n rg = new ProteinGraph(molecule.header, molecule.size);\n\n }\n\n rg.addUids(molecule.uids);\n\n for (var j = 0; j < rg.nodes.length; j++) {\n nodes[rg.nodes[j].uid] = rg.nodes[j];\n }\n\n graphs.push(rg);\n }\n\n //Add the extra links\n for (var i = 0; i < moleculesJson.extraLinks.length; i++) {\n link = moleculesJson.extraLinks[i];\n\n link.source = nodes[link.source];\n link.target = nodes[link.target];\n link.uid = slugid.nice();\n\n extraLinks.push(link);\n }\n\n return {'graphs': graphs, 'extraLinks': extraLinks};\n};\n","export function simpleXyCoordinates (pair_table) {\n var INIT_ANGLE=0.; /* initial bending angle */\n var INIT_X = 100.; /* coordinate of first digit */\n var INIT_Y = 100.; /* see above */\n var RADIUS = 15.;\n\n var x = [], y = [];\n\n var i, len;\n var alpha;\n\n len = pair_table[0];\n var angle = Array.apply(null, new Array(len+5)).map(Number.prototype.valueOf,0); \n var loop_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n var stack_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n\n var lp = 0;\n var stk = 0;\n var PIHALF = Math.PI / 2;\n\n\n var loop = function(i, j, pair_table)\n /* i, j are the positions AFTER the last pair of a stack; i.e\n i-1 and j+1 are paired. */\n {\n var count = 2; /* counts the VERTICES of a loop polygon; that's\n NOT necessarily the number of unpaired bases!\n Upon entry the loop has already 2 vertices, namely\n the pair i-1/j+1. */\n\n var r = 0, bubble = 0; /* bubble counts the unpaired digits in loops */\n\n var i_old, partner, k, l, start_k, start_l, fill, ladder;\n var begin, v, diff;\n var polygon;\n\n var remember = Array.apply(null, new Array((3+Math.floor((j-i)/5)*2))).map(Number.prototype.valueOf, 0);\n\n i_old = i-1, j++; /* j has now been set to the partner of the\n previous pair for correct while-loop\n termination. */\n while (i != j) {\n partner = pair_table[i];\n if ((!partner) || (i==0))\n i++, count++, bubble++;\n else {\n count += 2;\n k = i, l = partner; /* beginning of stack */\n remember[++r] = k;\n remember[++r] = l;\n i = partner+1; /* next i for the current loop */\n\n start_k = k, start_l = l;\n ladder = 0;\n do {\n k++, l--, ladder++; /* go along the stack region */\n }\n while ((pair_table[k] == l) && (pair_table[k] > k));\n\n fill = ladder-2;\n if (ladder >= 2) {\n angle[start_k+1+fill] += PIHALF; /* Loop entries and */\n angle[start_l-1-fill] += PIHALF; /* exits get an */\n angle[start_k] += PIHALF; /* additional PI/2. */\n angle[start_l] += PIHALF; /* Why ? (exercise) */\n if (ladder > 2) {\n for (; fill >= 1; fill--) {\n angle[start_k+fill] = Math.PI; /* fill in the angles */\n angle[start_l-fill] = Math.PI; /* for the backbone */\n }\n }\n }\n stack_size[++stk] = ladder;\n if (k <= l)\n loop(k, l, pair_table);\n }\n }\n\n polygon = Math.PI*(count-2)/count; /* bending angle in loop polygon */\n remember[++r] = j;\n begin = i_old < 0 ? 0 : i_old;\n for (v = 1; v <= r; v++) {\n diff = remember[v]-begin;\n for (fill = 0; fill <= diff; fill++)\n angle[begin+fill] += polygon;\n if (v > r)\n break;\n begin = remember[++v];\n }\n loop_size[++lp] = bubble;\n }\n\n loop(0, len+1, pair_table);\n loop_size[lp] -= 2; /* correct for cheating with function loop */\n\n alpha = INIT_ANGLE;\n x[0] = INIT_X;\n y[0] = INIT_Y;\n\n var poss = [];\n\n poss.push([x[0], y[0]]);\n for (i = 1; i < len; i++) {\n x[i] = x[i-1]+RADIUS*Math.cos(alpha);\n y[i] = y[i-1]+RADIUS*Math.sin(alpha);\n\n poss.push([x[i], y[i]]);\n alpha += Math.PI-angle[i+1];\n }\n\n return poss;\n}\n","export function Radloop() {\n\tthis.radius = null;\n\tthis.loopnumber = null;\n\tthis.next = null;\n this.prev = null;\n}\n\nRadloop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nRadloop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n\nRadloop.prototype.getLoopnumber = function(){\n\treturn this.loopnumber;\n}\n\nRadloop.prototype.setLoopnumber = function(loopnumber){\n\tthis.loopnumber = loopnumber;\n}\n\nRadloop.prototype.getNext = function(){\n\treturn this.next;\n}\n\nRadloop.prototype.setNext = function(next){\n\tthis.next = next;\n}\n\nRadloop.prototype.getPrev = function(){\n\treturn this.prev;\n}\n\nRadloop.prototype.setPrev = function(prev){\n\tthis.prev = prev;\n}\n","import {Region} from './region.js';\n\nexport function Base() {\n\tthis.mate = null;\n\tthis.x = null;\n this.y = null;\n\tthis.extracted = null;\n\tthis.region = new Region();\n}\n\nBase.prototype.getMate = function(){\n\treturn this.mate;\n}\n\nBase.prototype.setMate = function(mate){\n\tthis.mate = mate;\n}\n\nBase.prototype.getX = function(){\n\treturn this.x;\n}\n\nBase.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nBase.prototype.getY = function(){\n\treturn this.y;\n}\n\nBase.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nBase.prototype.isExtracted = function(){\n\treturn this.extracted;\n}\n\nBase.prototype.setExtracted = function(extracted){\n\tthis.extracted = extracted;\n}\n\nBase.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nBase.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n","import {Radloop} from './radloop.js';\nimport {Connection} from './connection.js';\nimport {Region} from './region.js';\nimport {Base} from './base.js';\nimport {Loop} from './loop.js';\n\nexport function NAView(){\n this.ANUM = 9999.0;\n\tthis.MAXITER = 500;\n\n\tthis.bases = [];\n\tthis.nbase = null;\n this.nregion = null;\n this.loop_count = null;\n\n\tthis.root = new Loop();\n\tthis.loops = [];\n\n\tthis.regions = [];\n\n\tthis.rlphead = new Radloop();\n\n\tthis.lencut = 0.8;\n\tthis.RADIUS_REDUCTION_FACTOR = 1.4;\n\n\t// show algorithm step by step\n\tthis.angleinc = null;\n\n\tthis._h = null;\n\n\t// private boolean noIterationFailureYet = true;\n\n\tthis.HELIX_FACTOR = 0.6;\n\tthis.BACKBONE_DISTANCE = 27;\n}\n\nNAView.prototype.naview_xy_coordinates = function(pair_table){\n var x = [];\n\tvar y = [];\n if (pair_table.length === 0 || pair_table[0] === 0){\n return 0;\n }\n var i;\n this.nbase = pair_table[0];\n this.bases = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.bases.push(new Base());\n }\n this.regions = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.regions.push(new Region());\n }\n this.read_in_bases(pair_table);\n this.rlphead = null;\n this.find_regions();\n this.loop_count = 0;\n this.loops = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.loops.push(new Loop());\n }\n this.construct_loop(0);\n this.find_central_loop();\n this.traverse_loop(this.root, null);\n\n for (i = 0; i < this.nbase; i++){\n x.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getX());\n y.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getY());\n }\n\n return {\n nbase: this.nbase,\n x: x,\n y: y\n }\n}\n\nNAView.prototype.read_in_bases = function read_in_bases(pair_table){\n var i = null;\n var npairs = null;\n\n // Set up an origin.\n this.bases.push(new Base());\n this.bases[0].setMate(0);\n this.bases[0].setExtracted(false);\n this.bases[0].setX(this.ANUM);\n this.bases[0].setY(this.ANUM);\n\n for (npairs = 0, i = 1; i <= this.nbase; i++){\n this.bases.push(new Base());\n this.bases[i].setExtracted(false);\n this.bases[i].setX(this.ANUM);\n this.bases[i].setY(this.ANUM);\n this.bases[i].setMate(pair_table[i]);\n if (pair_table[i] > i)\n npairs++;\n }\n // must have at least 1 pair to avoid segfault\n if (npairs == 0){\n this.bases[1].setMate(this.nbase);\n this.bases[this.nbase].setMate(1);\n }\n}\n\nNAView.prototype.find_regions = function find_regions(){\n var i = null;\n var mate = null;\n var nb1 = null;\n\n nb1 = this.nbase + 1;\n var mark = [];\n for (i = 0; i < nb1; i++){\n mark.push(false);\n }\n this.nregion = 0;\n for (i = 0; i <= this.nbase; i++) {\n if ((mate = this.bases[i].getMate()) != 0 && !mark[i]) {\n this.regions[this.nregion].setStart1(i);\n this.regions[this.nregion].setEnd2(mate);\n mark[i] = true;\n mark[mate] = true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n for (i++, mate--; i < mate && this.bases[i].getMate() == mate; i++, mate--) {\n mark[mate] = true;\n mark[i]= true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n }\n this.regions[this.nregion].setEnd1(--i);\n this.regions[this.nregion].setStart2(mate + 1);\n\n this.nregion++;\n }\n }\n}\n\nNAView.prototype.construct_loop = function construct_loop(ibase){\n var i = null;\n var mate = null;\n var retloop = new Loop();\n var lp = new Loop();\n var cp = new Connection();\n var rp = new Region();\n var rlp = new Radloop();\n retloop = this.loops[this.loop_count++];\n retloop.setNconnection(0);\n retloop.setDepth(0);\n retloop.setNumber(this.loop_count);\n retloop.setRadius(0.0);\n\n for (rlp = this.rlphead; rlp != null; rlp = rlp.getNext())\n if (rlp.getLoopnumber() == this.loop_count)\n retloop.setRadius(rlp.getRadius());\n i = ibase;\n do {\n if ((mate = this.bases[i].getMate()) != 0) {\n rp = this.bases[i].getRegion();\n if (!this.bases[rp.getStart1()].isExtracted()) {\n if (i == rp.getStart1()) {\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd1() < this.nbase ? rp.getEnd1() + 1\n : 0);\n } else if (i == rp.getStart2()) {\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd2() < this.nbase ? rp.getEnd2() + 1\n : 0);\n } else {\n console.log(\"Something went terribly wrong ....\");\n }\n retloop.setNconnection(retloop.getNconnection() + 1);\n cp = new Connection();\n retloop.setConnection(retloop.getNconnection() - 1,\tcp);\n retloop.setConnection(retloop.getNconnection(), null);\n cp.setLoop(lp);\n cp.setRegion(rp);\n if(i == rp.getStart1()) {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n } else {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n lp.setNconnection(lp.getNconnection() + 1);\n cp = new Connection();\n lp.setConnection(lp.getNconnection() - 1, cp);\n lp.setConnection(lp.getNconnection(), null);\n cp.setLoop(retloop);\n cp.setRegion(rp);\n if (i == rp.getStart1()) {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n } else {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n }\n i = mate;\n }\n if (++i > this.nbase)\n i = 0;\n } while (i != ibase);\n return retloop;\n}\n\nNAView.prototype.find_central_loop = function find_central_loop(){\n var lp = new Loop();\n var maxconn = null;\n var maxdepth = null;\n var i = null;\n\n determine_depths.bind(this)();\n maxconn = 0;\n maxdepth = -1;\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n if (lp.getNconnection() > maxconn) {\n maxdepth = lp.getDepth();\n maxconn = lp.getNconnection();\n this.root = lp;\n } else if (lp.getDepth() > maxdepth\n && lp.getNconnection() == maxconn) {\n maxdepth = lp.getDepth();\n this.root = lp;\n }\n }\n}\n\nfunction determine_depths() {\n var lp = new Loop();\n var i = null;\n var j = null;\n\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n for (j = 0; j < this.loop_count; j++){\n this.loops[j].setMark(false);\n }\n lp.setDepth(depth(lp));\n }\n}\n\nfunction depth(lp){\n var count = null;\n var ret = null;\n var d = null;\n\n if (lp.getNconnection() <= 1){\n return 0;\n }\n if (lp.isMark()){\n return -1;\n }\n lp.setMark(true);\n count = 0;\n ret = 0;\n for (var i = 0; lp.getConnection(i) != null; i++) {\n d = depth(lp.getConnection(i).getLoop());\n if (d >= 0) {\n if (++count == 1){\n ret = d;\n }\n else if (ret > d){\n ret = d;\n }\n }\n }\n lp.setMark(false);\n return ret + 1;\n}\n\nNAView.prototype.traverse_loop = function traverse_loop(lp, anchor_connection){\n var xs, ys, xe, ye, xn, yn, angleinc, r;\n var radius, xc, yc, xo, yo, astart, aend, a;\n var cp, cpnext, acp, cpprev;\n var i, j, n, ic;\n var da, maxang;\n var count, icstart, icend, icmiddle, icroot;\n var done, done_all_connections, rooted;\n var sign;\n var midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy;\n var icstart1, icup, icdown, icnext, direction;\n var dan, dx, dy, rr;\n var cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp;\n var imaxloop = 0;\n\n angleinc = 2 * Math.PI / (this.nbase + 1);\n acp = null;\n icroot = -1;\n var indice = 0;\n\n for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) {\n xs = -Math.sin(angleinc * cp.getStart());\n ys = Math.cos(angleinc * cp.getStart());\n xe = -Math.sin(angleinc * cp.getEnd());\n ye = Math.cos(angleinc * cp.getEnd());\n xn = ye - ys;\n yn = xs - xe;\n r = Math.sqrt(xn * xn + yn * yn);\n cp.setXrad(xn / r);\n cp.setYrad(yn / r);\n cp.setAngle(Math.atan2(yn, xn));\n if (cp.getAngle() < 0.0){\n cp.setAngle(cp.getAngle() + 2 * Math.PI);\n }\n if (anchor_connection != null\n && anchor_connection.getRegion() == cp.getRegion()) {\n acp = cp;\n icroot = ic;\n }\n }\n set_radius: while (true) {\n this.determine_radius(lp, this.lencut);\n radius = lp.getRadius()/this.RADIUS_REDUCTION_FACTOR;\n if (anchor_connection == null){\n xc = yc = 0.0;\n }\n else {\n xo = (this.bases[acp.getStart()].getX() + this.bases\n [acp.getEnd()].getX()) / 2.0;\n yo = (this.bases[acp.getStart()].getY() + this.bases\n [acp.getEnd()].getY()) / 2.0;\n xc = xo - radius * acp.getXrad();\n yc = yo - radius * acp.getYrad();\n }\n\n // The construction of the connectors will proceed in blocks of\n // connected connectors, where a connected connector pairs means two\n // connectors that are forced out of the drawn circle because they\n // are too close together in angle.\n\n // First, find the start of a block of connected connectors\n\n if (icroot == -1){\n icstart = 0;\n }\n else {\n icstart = icroot;\n }\n cp = lp.getConnection(icstart);\n count = 0;\n done = false;\n do {\n j = icstart - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cpprev = lp.getConnection(j);\n if (!this.connected_connection(cpprev, cp)) {\n done = true;\n }\n else {\n icstart = j;\n cp = cpprev;\n }\n if (++count > lp.getNconnection()) {\n // Here everything is connected. Break on maximum angular\n // separation between connections.\n maxang = -1.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n ac = cpnext.getAngle() - cp.getAngle();\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n if (ac > maxang) {\n maxang = ac;\n imaxloop = ic;\n }\n }\n icend = imaxloop;\n icstart = imaxloop + 1;\n if (icstart >= lp.getNconnection()){\n icstart = 0;\n }\n cp = lp.getConnection(icend);\n cp.setBroken(true);\n done = true;\n }\n } while (!done);\n done_all_connections = false;\n icstart1 = icstart;\n while (!done_all_connections) {\n count = 0;\n done = false;\n icend = icstart;\n rooted = false;\n while (!done) {\n cp = lp.getConnection(icend);\n if (icend == icroot){\n rooted = true;\n }\n j = icend + 1;\n if (j >= lp.getNconnection()) {\n j = 0;\n }\n cpnext = lp.getConnection(j);\n if (this.connected_connection(cp, cpnext)) {\n if (++count >= lp.getNconnection()){\n break;\n }\n icend = j;\n }\n else {\n done = true;\n }\n }\n icmiddle = this.find_ic_middle(icstart, icend, anchor_connection,\n acp, lp);\n ic = icup = icdown = icmiddle;\n done = false;\n direction = 0;\n while (!done) {\n if (direction < 0) {\n ic = icup;\n }\n else if (direction == 0) {\n ic = icmiddle;\n }\n else {\n ic = icdown;\n }\n if (ic >= 0) {\n cp = lp.getConnection(ic);\n if (anchor_connection == null || acp != cp) {\n if (direction == 0) {\n astart = cp.getAngle()\n - Math.asin(1.0 / 2.0 / radius);\n aend = cp.getAngle()\n + Math.asin(1.0 / 2.0 / radius);\n this.bases[cp.getStart()].setX(\n xc + radius * Math.cos(astart));\n this.bases[cp.getStart()].setY(\n yc + radius * Math.sin(astart));\n this.bases[cp.getEnd()].setX(\n xc + radius * Math.cos(aend));\n this.bases[cp.getEnd()].setY(\n yc + radius * Math.sin(aend));\n }\n else if (direction < 0) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n cpx = cp.getXrad();\n cpy = cp.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = cny;\n lny = -cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cp.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n + rl * lnx);\n this.bases[cp.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + rl * lny);\n this.bases[cp.getStart()].setX(\n this.bases[cp.getEnd()].getX() + cpy);\n this.bases[cp.getStart()].setY(\n this.bases[cp.getEnd()].getY() - cpx);\n } else {\n j = ic - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cp = lp.getConnection(j);\n cpnext = lp.getConnection(ic);\n cpnextx = cpnext.getXrad();\n cpnexty = cpnext.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = -cny;\n lny = cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cpnext.getStart()].setX(\n this.bases[cp.getEnd()].getX() + rl\n * lnx);\n this.bases[cpnext.getStart()].setY(\n this.bases[cp.getEnd()].getY() + rl\n * lny);\n this.bases[cpnext.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n - cpnexty);\n this.bases[cpnext.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + cpnextx);\n }\n }\n }\n if (direction < 0) {\n if (icdown == icend) {\n icdown = -1;\n }\n else if (icdown >= 0) {\n if (++icdown >= lp.getNconnection()) {\n icdown = 0;\n }\n }\n direction = 1;\n }\n else {\n if (icup == icstart){\n icup = -1;\n }\n else if (icup >= 0) {\n if (--icup < 0) {\n icup = lp.getNconnection() - 1;\n }\n }\n direction = -1;\n }\n done = icup == -1 && icdown == -1;\n }\n icnext = icend + 1;\n if (icnext >= lp.getNconnection()){\n icnext = 0;\n }\n if (icend != icstart\n && (!(icstart == icstart1 && icnext == icstart1))) {\n\n // Move the bases just constructed (or the radius) so that\n // the bisector of the end points is radius distance away\n // from the loop center.\n\n cp = lp.getConnection(icstart);\n cpnext = lp.getConnection(icend);\n dx = this.bases[cpnext.getEnd()].getX()\n - this.bases[cp.getStart()].getX();\n dy = this.bases[cpnext.getEnd()].getY()\n - this.bases[cp.getStart()].getY();\n midx = this.bases[cp.getStart()].getX() + dx / 2.0;\n midy = this.bases[cp.getStart()].getY() + dy / 2.0;\n rr = Math.sqrt(dx * dx + dy * dy);\n mx = dx / rr;\n my = dy / rr;\n vx = xc - midx;\n vy = yc - midy;\n rr = Math.sqrt(dx * dx + dy * dy);\n vx /= rr;\n vy /= rr;\n dotmv = vx * mx + vy * my;\n nrx = dotmv * mx - vx;\n nry = dotmv * my - vy;\n rr = Math.sqrt(nrx * nrx + nry * nry);\n nrx /= rr;\n nry /= rr;\n\n // Determine which side of the bisector the center should\n // be.\n\n dx = this.bases[cp.getStart()].getX() - xc;\n dy = this.bases[cp.getStart()].getY() - yc;\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getEnd()].getX() - xc;\n dy = this.bases[cpnext.getEnd()].getY() - yc;\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n if (acn - ac > Math.PI){\n sign = -1;\n }\n else {\n sign = 1;\n }\n nmidx = xc + sign * radius * nrx;\n nmidy = yc + sign * radius * nry;\n if (rooted) {\n xc -= nmidx - midx;\n yc -= nmidy - midy;\n }\n else {\n for (ic = icstart;;) {\n cp = lp.getConnection(ic);\n i = cp.getStart();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n i = cp.getEnd();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n if (ic == icend){\n break;\n }\n if (++ic >= lp.getNconnection()){\n ic = 0;\n }\n }\n }\n }\n icstart = icnext;\n done_all_connections = icstart == icstart1;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n cp = lp.getConnection(ic);\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n dx = this.bases[cp.getEnd()].getX() - xc;\n dy = this.bases[cp.getEnd()].getY() - yc;\n rc = Math.sqrt(dx * dx + dy * dy);\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getStart()].getX() - xc;\n dy = this.bases[cpnext.getStart()].getY() - yc;\n rcn = Math.sqrt(dx * dx + dy * dy);\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n dan = acn - ac;\n dcp = cpnext.getAngle() - cp.getAngle();\n if (dcp <= 0.0){\n dcp += 2 * Math.PI;\n }\n if (Math.abs(dan - dcp) > Math.PI) {\n if (cp.isExtruded()) {\n console.log(\"Warning from traverse_loop. Loop \"\n + lp.getNumber() + \" has crossed regions\\n\");\n }\n else if ((cpnext.getStart() - cp.getEnd()) != 1) {\n cp.setExtruded(true);\n continue set_radius; // remplacement du goto\n }\n }\n if (cp.isExtruded()) {\n this.construct_extruded_segment(cp, cpnext);\n }\n else {\n n = cpnext.getStart() - cp.getEnd();\n if (n < 0){\n n += this.nbase + 1;\n }\n angleinc = dan / n;\n for (j = 1; j < n; j++) {\n i = cp.getEnd() + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n a = ac + j * angleinc;\n rr = rc + (rcn - rc) * (a - ac) / dan;\n this.bases[i].setX(xc + rr * Math.cos(a));\n this.bases[i].setY(yc + rr * Math.sin(a));\n }\n }\n }\n break;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n if (icroot != ic) {\n cp = lp.getConnection(ic);\n //IM HERE\n this.generate_region(cp);\n this.traverse_loop(cp.getLoop(), cp);\n }\n }\n n = 0;\n sx = 0.0;\n sy = 0.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n n += 2;\n sx += this.bases[cp.getStart()].getX()\n + this.bases[cp.getEnd()].getX();\n sy += this.bases[cp.getStart()].getY()\n + this.bases[cp.getEnd()].getY();\n if (!cp.isExtruded()) {\n for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) {\n if (j > this.nbase){\n j -= this.nbase + 1;\n }\n n++;\n sx += this.bases[j].getX();\n sy += this.bases[j].getY();\n }\n }\n }\n lp.setX(sx / n);\n lp.setY(sy / n);\n}\n\nNAView.prototype.determine_radius = function determine_radius(lp, lencut){\n var mindit, ci, dt, sumn, sumd, radius, dit;\n var i, j, end, start, imindit = 0;\n var cp = new Connection(), cpnext = new Connection();\n var rt2_2 = 0.7071068;\n\n do {\n mindit = 1.0e10;\n for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) {\n cp = lp.getConnection(i);\n j = i + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n end = cp.getEnd();\n start = cpnext.getStart();\n if (start < end){\n start += this.nbase + 1;\n }\n dt = cpnext.getAngle() - cp.getAngle();\n if (dt <= 0.0){\n dt += 2 * Math.PI;\n }\n if (!cp.isExtruded()){\n ci = start - end;\n }\n else {\n if (dt <= Math.PI / 2){\n ci = 2.0;\n }\n else {\n ci = 1.5;\n }\n }\n sumn += dt * (1.0 / ci + 1.0);\n sumd += dt * dt / ci;\n dit = dt / ci;\n if (dit < mindit && !cp.isExtruded() && ci > 1.0) {\n mindit = dit;\n imindit = i;\n }\n }\n radius = sumn / sumd;\n if (radius < rt2_2){\n radius = rt2_2;\n }\n if (mindit * radius < lencut) {\n lp.getConnection(imindit).setExtruded(true);\n }\n } while (mindit * radius < lencut);\n if (lp.getRadius() > 0.0){\n radius = lp.getRadius();\n }\n else {\n lp.setRadius(radius);\n }\n}\n\nNAView.prototype.find_ic_middle = function find_ic_middle(icstart, icend, anchor_connection, acp, lp){\n var count, ret, ic, i;\n var done;\n\n count = 0;\n ret = -1;\n ic = icstart;\n done = false;\n while (!done) {\n if (count++ > lp.getNconnection() * 2) {\n console.log(\"Infinite loop in 'find_ic_middle'\");\n }\n if (anchor_connection != null && lp.getConnection(ic) == acp) {\n ret = ic;\n }\n done = ic == icend;\n if (++ic >= lp.getNconnection()) {\n ic = 0;\n }\n }\n if (ret == -1) {\n for (i = 1, ic = icstart; i < (count + 1) / 2; i++) {\n if (++ic >= lp.getNconnection())\n ic = 0;\n }\n ret = ic;\n }\n return ret;\n}\n\nNAView.prototype.construct_extruded_segment = function construct_extruded_segment(cp, cpnext){\n var astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac;\n var start, end, n, nstart, nend;\n var collision;\n\n astart = cp.getAngle();\n aend2 = aend1 = cpnext.getAngle();\n if (aend2 < astart){\n aend2 += 2 * Math.PI;\n }\n aave = (astart + aend2) / 2.0;\n start = cp.getEnd();\n end = cpnext.getStart();\n n = end - start;\n if (n < 0){\n n += this.nbase + 1;\n }\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0) {\n da += 2 * Math.PI;\n }\n if (n == 2) {\n this.construct_circle_segment(start, end);\n }\n else {\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n dx /= rr;\n dy /= rr;\n if (rr >= 1.5 && da <= Math.PI / 2) {\n nstart = start + 1;\n if (nstart > this.nbase){\n nstart -= this.nbase + 1;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n this.bases[nstart].setX(this.bases[start].getX() + 0.5 * dx);\n this.bases[nstart].setY(this.bases[start].getY() + 0.5 * dy);\n this.bases[nend].setX(this.bases[end].getX() - 0.5 * dx);\n this.bases[nend].setY(this.bases[end].getY() - 0.5 * dy);\n start = nstart;\n end = nend;\n }\n do {\n collision = false;\n this.construct_circle_segment(start, end);\n nstart = start + 1;\n if (nstart > this.nbase) {\n nstart -= this.nbase + 1;\n }\n dx = this.bases[nstart].getX() - this.bases[start].getX();\n dy = this.bases[nstart].getY() - this.bases[start].getY();\n a1 = Math.atan2(dy, dx);\n if (a1 < 0.0){\n a1 += 2 * Math.PI;\n }\n dac = a1 - astart;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n dx = this.bases[nend].getX() - this.bases[end].getX();\n dy = this.bases[nend].getY() - this.bases[end].getY();\n a2 = Math.atan2(dy, dx);\n if (a2 < 0.0){\n a2 += 2 * Math.PI;\n }\n dac = aend1 - a2;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n if (collision) {\n ac = this.minf2(aave, astart + 0.5);\n this.bases[nstart].setX(\n this.bases[start].getX() + Math.cos(ac));\n this.bases[nstart].setY(\n this.bases[start].getY() + Math.sin(ac));\n start = nstart;\n ac = this.maxf2(aave, aend2 - 0.5);\n this.bases[nend].setX(this.bases[end].getX() + Math.cos(ac));\n this.bases[nend].setY(this.bases[end].getY() + Math.sin(ac));\n end = nend;\n n -= 2;\n }\n } while (collision && n > 1);\n }\n}\n\nNAView.prototype.construct_circle_segment = function construct_circle_segment(start, end){\n var dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a;\n var l, j, i;\n\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n l = end - start;\n if (l < 0){\n l += this.nbase + 1;\n }\n if (rr >= l) {\n dx /= rr;\n dy /= rr;\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(\n this.bases[start].getX() + dx * j / l);\n this.bases[i].setY(\n this.bases[start].getY() + dy * j / l);\n }\n }\n else {\n this.find_center_for_arc((l - 1), rr);\n dx /= rr;\n dy /= rr;\n midx = this.bases[start].getX() + dx * rr / 2.0;\n midy = this.bases[start].getY() + dy * rr / 2.0;\n xn = dy;\n yn = -dx;\n nrx = midx + this._h * xn;\n nry = midy + this._h * yn;\n mx = this.bases[start].getX() - nrx;\n my = this.bases[start].getY() - nry;\n rr = Math.sqrt(mx * mx + my * my);\n a = Math.atan2(my, mx);\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(nrx + rr * Math.cos(a + j * this.angleinc));\n this.bases[i].setY(nry + rr * Math.sin(a + j * this.angleinc));\n }\n }\n}\n\nNAView.prototype.find_center_for_arc = function find_center_for_arc(n, b){\n var h, hhi, hlow, r, disc, theta, e, phi;\n var iter;\n\n hhi = (n + 1.0) / Math.PI;\n // changed to prevent div by zero if (ih)\n hlow = -hhi - b / (n + 1.000001 - b);\n if (b < 1){\n // otherwise we might fail below (ih)\n hlow = 0;\n }\n iter = 0;\n do {\n h = (hhi + hlow) / 2.0;\n r = Math.sqrt(h * h + b * b / 4.0);\n disc = 1.0 - 0.5 / (r * r);\n if (Math.abs(disc) > 1.0) {\n console.log(\"Unexpected large magnitude discriminant = \" + disc\n + \" \" + r);\n }\n theta = Math.acos(disc);\n phi = Math.acos(h / r);\n e = theta * (n + 1) + 2 * phi - 2 * Math.PI;\n if (e > 0.0) {\n hlow = h;\n }\n else {\n hhi = h;\n }\n } while (Math.abs(e) > 0.0001 && ++iter < this.MAXITER);\n if (iter >= this.MAXITER) {\n if (noIterationFailureYet) {\n console.log(\"Iteration failed in find_center_for_arc\");\n noIterationFailureYet = false;\n }\n h = 0.0;\n theta = 0.0;\n }\n this._h = h;\n this.angleinc = theta;\n}\n\nNAView.prototype.generate_region = function generate_region(cp){\n var l, start, end, i, mate;\n var rp;\n\n rp = cp.getRegion();\n l = 0;\n if (cp.getStart() == rp.getStart1()) {\n start = rp.getStart1();\n end = rp.getEnd1();\n }\n else {\n start = rp.getStart2();\n end = rp.getEnd2();\n }\n if (this.bases[cp.getStart()].getX() > this.ANUM - 100.0\n || this.bases[cp.getEnd()].getX() > this.ANUM - 100.0) {\n console.log(\n \"Bad region passed to generate_region. Coordinates not defined.\");\n }\n for (i = start + 1; i <= end; i++) {\n l++;\n this.bases[i].setX(\n this.bases[cp.getStart()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[i].setY(\n this.bases[cp.getStart()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n mate = this.bases[i].getMate();\n this.bases[mate].setX(\n this.bases[cp.getEnd()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[mate].setY(\n this.bases[cp.getEnd()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n\n }\n}\n\nNAView.prototype.minf2 = function minf2(x1, x2) {\n return ((x1) < (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.maxf2 = function maxf2(x1, x2) {\n return ((x1) > (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.connected_connection = function connected_connection(cp, cpnext) {\n if (cp.isExtruded()) {\n return true;\n }\n else if (cp.getEnd() + 1 == cpnext.getStart()) {\n return true;\n }\n else {\n return false;\n }\n}\n","/* Version: 0.2\n* Date: 2015-03-15\n*/\n\nimport fstyle from './fornac.css';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\nimport {contextMenu} from './d3-context-menu.js';\n\nimport {RNAGraph} from './rnagraph.js';\nimport {ColorScheme, rnaUtilities} from './rnautils.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js';\n\nexport function FornaContainer(element, passedOptions = {}) {\n var self = this;\n\n let options = {\n 'editable': false,\n 'zoomable': true,\n 'animation': true,\n 'displayAllLinks': false,\n 'labelInterval': 10,\n 'chargeDistance': 110,\n 'friction': 0.35,\n 'middleCharge': -30,\n 'otherCharge': -30,\n 'linkDistanceMultiplier': 15,\n 'initialSize': null,\n 'layout': 'standard-polygonal',\n 'transitionDuration': 500,\n 'maxNodeRadius': 80 // the maximum radius of a node when the view is centered\n };\n\n self.options = Object.assign(options, passedOptions);\n\n if (self.options.initialSize !== null) {\n self.options.svgW = self.options.initialSize[0];\n self.options.svgH = self.options.initialSize[1];\n } else {\n self.options.svgW = 300;\n self.options.svgH = 300;\n }\n\n self.linkStrengths = {\n 'pseudoknot': 0.00,\n 'proteinChain': 0.00,\n 'chainChain': 0.00,\n 'intermolecule': 10.00,\n 'external': 0.00,\n 'other': 10.00\n };\n\n self.displayParameters = {\n 'displayNumbering': true,\n 'displayNodeOutline': true,\n 'displayNodeLabel': true,\n 'displayLinks': true,\n 'displayPseudoknotLinks': true,\n 'displayProteinLinks': true,\n 'displayDirectionArrows': true\n };\n\n self.colorScheme = 'structure';\n self.customColors = {};\n self.rnas = {};\n self.extraLinks = []; //store links between different RNAs\n\n // global mouse event vars\n var mousedownLink = null,\n mousedownNode = null,\n mouseupNode = null;\n let linkContextMenuShown = false;\n\n let resetMouseVars = () => {\n mousedownNode = null;\n mouseupNode = null;\n mousedownLink = null;\n }\n\n var graph = self.graph = {\n 'nodes':[],\n 'links':[]\n };\n\n Array.prototype.equals = function (array) {\n // if the other array is a falsy value, return\n if (!array)\n return false;\n\n // compare lengths - can save a lot of time\n if (this.length != array.length)\n return false;\n\n for (var i = 0, l=this.length; i < l; i++) {\n // Check if we have nested arrays\n if (this[i] instanceof Array && array[i] instanceof Array) {\n // recurse into the nested arrays\n if (!this[i].equals(array[i]))\n return false;\n }\n else if (this[i] != array[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /* Register global mouse and key events */\n if (self.options.editable || self.options.animation) {\n var shiftKeydown = false;\n var ctrlKeydown = false;\n\n let keydown = () => {\n switch (d3.event.keyCode) {\n case 68: //'d' key\n console.log('dotbracket:', self.getStructuresDotBracket());\n break;\n case 16:\n shiftKeydown = true;\n break;\n case 17:\n ctrlKeydown = true;\n break;\n case 67: //c\n self.centerView();\n break;\n }\n\n if (ctrlKeydown) {\n // Ctrl key must disable panning and zooming\n if (self.options.zoomable)\n disableZooming()\n // Ctrl Button must enable crosshair and start brusher\n if (self.options.editable || self.options.animation) {\n enableBrushing()\n }\n }\n }\n\n let keyup = () => {\n shiftKeydown = false;\n ctrlKeydown = false;\n\n // enable zoomer\n if (self.options.zoomable)\n enableZooming()\n // disable brushing events\n disableBrushing()\n }\n\n d3.select('body')\n .on('keydown', keydown)\n .on('keyup', keyup)\n .on('contextmenu', function() {\n d3.event.preventDefault();\n });\n }\n\n /* Register global context menu */\n if (self.options.editable) {\n let backgroundMenu = [\n {\n title: 'Add Node',\n action: function(elm, d, i, mousePos) {\n\n },\n children: [{\n 'title': 'A',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'A', 'centerPos': canvasMousePos});\n }\n },\n {\n 'title': 'C',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'C', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'G',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'G', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'U',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'U', 'centerPos': canvasMousePos});\n\n }\n }\n ],\n disabled: false // optional, defaults to false\n }\n ]\n\n let nodeMenu = [\n {\n title: 'Delete Node',\n action: function(elm, d, i) {\n deleteNode(d);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Change Node',\n action: function(elm, d, i) {\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n changeNode('A', d);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n changeNode('C', d);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n changeNode('G', d);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n changeNode('U', d);\n }\n },\n ]\n },\n {\n title: 'Insert Before',\n action: function(elm, d, i) {\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, -1);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, -1);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, -1);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, -1);\n }\n },\n ]\n },\n {\n title: 'Insert After',\n action: function(elm, d, i) {\n console.log('d:', d);\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, 0);\n\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, 0);\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, 0);\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, 0);\n }\n },\n ]\n }\n ]\n\n self.nodeContextMenu = contextMenu(nodeMenu);\n self.backgroundContextMenu = contextMenu(backgroundMenu);\n\n } else {\n //console.log('empty context menu');\n self.nodeContextMenu = function() {};\n }\n\n /* Draw the plot here */\n d3.select(element).select('svg').remove();\n\n var svg = d3.select(element)\n .attr('tabindex', 1)\n .each(function() { this.focus(); })\n .append('svg:svg')\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('viewBox', '0 0 ' + self.options.svgW + ' ' + self.options.svgH)\n\n self.options.svg = svg;\n\n if (self.options.editable || self.options.animation) {\n var mouseEventHelper = svg.append('svg:g')\n .on('mousemove', () => {\n // only if we are dragging\n if (!mousedownNode) return;\n\n // update drag line\n let mpos = d3.mouse(vis.node());\n dragLine\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mpos[0])\n .attr('y2', mpos[1]);\n })\n .on('mousedown', () => {\n })\n .on('mouseup', () => {\n if (mousedownNode && !linkContextMenuShown) {\n dragLine.classed(fstyle.transparent, true);\n }\n // clear mouse event vars\n resetMouseVars();\n //update()\n })\n .classed(fstyle.mouseEventHelper, true)\n .style('pointer-events', 'all')\n\n // draw a background layer for mouse events\n mouseEventHelper.append('svg:rect')\n .classed('background', true)\n .style('visibility', 'hidden')\n .attr('width', self.options.svgW)\n .attr('height', self.options.svgH)\n .on('mousedown', function() {\n //console.log('background click');\n deselectAllNodes()\n })\n } else {\n var mouseEventHelper = svg;\n }\n\n var vis = mouseEventHelper.append('svg:g')\n .classed(fstyle.plot, true)\n var visLinks = vis.append('svg:g')\n .classed('fornac-links', true);\n var visNodes = vis.append('svg:g')\n .classed('fornac-nodes', true);\n\n // line displayed when dragging new nodes\n if (self.options.editable) {\n var dragLine = vis.append('line')\n .attr('class', fstyle.dragLine)\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 0);\n\n svg.on('contextmenu', self.backgroundContextMenu);\n }\n\n /* Zooming related objects and functions */\n var xScale = d3.scale.linear()\n .domain([0,self.options.svgW]).range([0,self.options.svgW]);\n var yScale = d3.scale.linear()\n .domain([0,self.options.svgH]).range([0, self.options.svgH]);\n\n self.zoomer = d3.behavior.zoom()\n .scaleExtent([0.1,10])\n .x(xScale)\n .y(yScale)\n .on('zoom', () => {\n vis.attr('transform',\n 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');\n });\n\n let enableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null);\n }\n\n let disableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null)\n .on('mousedown.zoom', null)\n .on('touchstart.zoom', null)\n .on('touchmove.zoom', null)\n .on('touchend.zoom', null);\n }\n\n if (self.options.zoomable)\n enableZooming()\n\n /* Node selection related objects and functions */\n let toggleSelectNode = (node) => {\n node.selected = !node.selected;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let selectNode = (node) => {\n node.selected = true;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let deselectAllNodes = () => {\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function(p) { return p.selected = false; });\n }\n\n let selectedNodes = () => {\n // return all selected nodes\n return visNodes.selectAll('g.gnode').filter(function(d) { return d.selected; });\n }\n\n self.brusher = d3.svg.brush()\n .x(xScale)\n .y(yScale)\n .on('brushstart', function(d) {})\n .on('brush', function() {\n // during brushing invert styling of selection as preview\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function (d) {\n return d.selected ^ (extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1])\n })\n })\n .on('brushend', function() {\n // after brushing finally toggle the selection\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .filter(function (d) {\n return extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1]\n })\n .each(toggleSelectNode)\n\n d3.event.target.clear();\n d3.select(this).call(d3.event.target);\n });\n\n let enableBrushing = () => {\n // crosshair curson\n mouseEventHelper.select('.background').style('cursor', 'crosshair');\n // bind brusher\n mouseEventHelper.call(self.brusher);\n }\n\n let disableBrushing = () => {\n // normal cursor\n mouseEventHelper.select('.background').style('cursor', 'auto');\n // disable brushing events\n mouseEventHelper.call(self.brusher)\n .on('mousedown.brush', null)\n .on('touchstart.brush', null)\n .on('touchmove.brush', null)\n .on('touchend.brush', null);\n }\n\n /* Force related objects and functions */\n self.force = d3.layout.force()\n .charge(function(d) {\n if (d.nodeType == 'middle')\n return self.options.middleCharge;\n else\n return self.options.otherCharge;\n })\n .friction(self.options.friction)\n .linkDistance(function(d) { return self.options.linkDistanceMultiplier * d.value; })\n .linkStrength(function(d) { if (d.linkType in self.linkStrengths) {\n return self.linkStrengths[d.linkType];\n } else {\n return self.linkStrengths.other; }\n })\n .gravity(0.000)\n .nodes(self.graph.nodes)\n .links(self.graph.links)\n .chargeDistance(self.options.chargeDistance)\n .size([self.options.svgW, self.options.svgH]);\n\n var drag = d3.behavior.drag()\n .on('dragstart', function(d) {\n console.log('dragstart')\n d3.event.sourceEvent.stopPropagation();\n\n selectedNodes().each(function(d1) {\n d1.fixed |= 2;\n });\n })\n .on('drag', (d) => {\n if (shiftKeydown) return\n selectedNodes().each(function(d1) {\n d1.x += d3.event.dx;\n d1.y += d3.event.dy;\n\n d1.px += d3.event.dx;\n d1.py += d3.event.dy;\n });\n\n self.resumeForce();\n d3.event.sourceEvent.preventDefault();\n })\n .on('dragend', (d) => {\n console.log('dragend')\n selectedNodes().each(function(d1) {\n d1.fixed &= ~6;\n });\n });\n\n /* Main plot drawing functions */\n let createInitialLayout = function(structure, passedOptions = {}) {\n // the default options\n let options = {\n 'sequence': '',\n 'name': 'empty',\n 'positions': [],\n 'labelInterval': self.options.labelInterval,\n 'avoidOthers': true,\n 'uids': [],\n 'circularizeExternal': true\n };\n\n options = Object.assign(options, passedOptions);\n\n //console.log('options.uids:', options.uids);\n let rg = new RNAGraph(options.sequence, structure, options.name);\n rg.circularizeExternal = options.circularizeExternal;\n\n let rnaJson = rg.recalculateElements();\n\n if (options.positions.length === 0) {\n // no provided positions means we need to calculate an initial layout\n\n if (self.options.layout == 'naview') {\n let naview = new NAView();\n\n let naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n options.positions = []\n for (let i = 0; i < naViewPositions.nbase; i++)\n options.positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n } else {\n options.positions = simpleXyCoordinates(rnaJson.pairtable);\n }\n }\n\n rnaJson = rnaJson.elementsToJson()\n .addUids(options.uids)\n .addPositions('nucleotide', options.positions)\n .addLabels(1, options.labelInterval)\n .reinforceStems()\n .reinforceLoops()\n .connectFakeNodes()\n .reassignLinkUids()\n .breakNodesToFakeNodes();\n\n return rnaJson;\n };\n\n let createNewNodes = function(gnodesEnter) {\n gnodesEnter = gnodesEnter.append('g')\n .classed('gnode', true)\n .attr('struct_name', function(d) { return d.structName; })\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n })\n .each( function(d) { d.selected = d.previouslySelected = false; });\n\n gnodesEnter\n .attr('num', function(d) { return 'n' + d.num; })\n .attr('rnum', function(d) {\n return 'n' + (d.rna.rnaLength - d.num + 1); })\n .transition()\n .duration(750)\n .ease('elastic');\n\n if (self.options.editable || self.options.animation) {\n gnodesEnter.on('mousedown', nodeMousedown)\n //.on('mousedrag', function(d) {})\n .on('mouseup', nodeMouseup)\n .on('contextmenu', self.nodeContextMenu)\n .call(drag)\n }\n\n let labelAndProteinNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'label' || d.nodeType == 'protein';\n });\n\n let nucleotideNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n labelAndProteinNodes.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('r', function(d) {\n if (d.nodeType == 'middle') return 0;\n else {\n return d.radius;\n }\n })\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; });\n\n // direction arrows\n nucleotideNodes.append('svg:path')\n .attr('class', fstyle.directionArrow)\n .attr('node_num', function(d) { return d.num; })\n\n // nucleotide outlines\n nucleotideNodes.append('svg:circle')\n .attr('class', fstyle.node)\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; })\n .attr('r', function(d) { return d.radius; })\n .append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n // nucleotide labels\n var labelsEnter = gnodesEnter.append('text')\n .text(function(d) { return d.name; })\n .attr('class', fstyle.nodeLabel)\n .attr('label_type', function(d) { return d.nodeType; })\n\n // nucleotide label title\n labelsEnter.append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n return gnodesEnter;\n };\n\n let createNewLinks = function(linksEnter) {\n var linkLines = linksEnter.append('svg:line');\n\n linkLines.append('svg:title')\n .text((d) => { return d.linkType + ':' + d.source.num + '-' + d.target.num });\n\n linkLines\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link_type', function(d) { return d.linkType; } )\n .attr('pointer-events', function(d) { if (d.linkType == 'fake') return 'none'; else return 'all';});\n\n if (self.options.editable)\n linkLines.on('click', linkClick);\n\n /* We don't need to update the positions of the stabilizing links */\n /*\n basepairLinks = visLinks.selectAll('[link_type=basepair]');\n basepairLinks.classed('basepair', true);\n\n fakeLinks = visLinks.selectAll('[link_type=fake]')\n fakeLinks.classed('fake', true);\n\n intermolecule_links = vis_links.selectAll('[link_type=intermolecule]');\n intermolecule_links.classed('intermolecule', true);\n\n plink = vis_links.selectAll('[link_type=protein_chain],[link_type=chain_chain]');\n plink.classed('chain_chain', true);\n */\n\n return linkLines;\n };\n\n function drawDirectionArrow(d) {\n let magnitude = (x) => {\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n }\n\n let endPoint = d;\n let startPoint = d.prevNode;\n // get stroke width and arrow size values from css\n let nodeStroke = parseFloat(fstyle.nodeStrokeWidth) / 2;\n let lengthMult = parseFloat(fstyle.directionArrowSize);\n let arrowWidth = parseFloat(fstyle.directionArrowWidth);\n\n if (startPoint === null)\n return;\n\n // does this node have a link pointing to it?\n if (!d.linked)\n return;\n\n // point back toward the previous node\n let u = [-(endPoint.x - startPoint.x), -(endPoint.y - startPoint.y)];\n\n if (u[0] == 0 && u[1] == 0)\n return; // will lead to a NaN error\n\n // scale u to unit length\n u = [u[0] / magnitude(u), u[1] / magnitude(u)];\n // normal vector of u\n let v = [-u[1], u[0]];\n\n // calculate the tip position\n let arrowTip = [(d.radius + nodeStroke) * u[0], (d.radius + nodeStroke) * u[1]];\n\n let path = 'M' + (arrowTip[0] + lengthMult * (u[0]/2 + v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 + v[1]*arrowWidth/2)) +\n 'L' + (arrowTip[0]) + ',' + (arrowTip[1]) +\n 'L' + (arrowTip[0] + lengthMult * (u[0]/2 - v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 - v[1]*arrowWidth/2));\n\n d3.select(this).attr('d', path);\n }\n\n let realLinkFilter = (d) => {\n return d.linkType == 'basepair' ||\n d.linkType == 'backbone' ||\n d.linkType == 'intermolecule' ||\n d.linkType == 'pseudoknot' ||\n d.linkType == 'label_link' ||\n d.linkType == 'external' ||\n d.linkType == 'chain_chain';\n }\n\n let recalculateGraph = () => {\n // Condense all of the individual RNAs into one\n // collection of nodes and links\n self.graph.nodes = [];\n self.graph.links = [];\n for (let uid in self.rnas) {\n self.graph.nodes = self.graph.nodes.concat(self.rnas[uid].nodes);\n self.graph.links = self.graph.links.concat(self.rnas[uid].links);\n }\n\n // Create a lookup table so that we can access each node\n // based on its uid. This will be used to create the links\n // between different RNAs\n var uidsToNodes = {};\n\n for (let i = 0; i < self.graph.nodes.length; i++)\n uidsToNodes[self.graph.nodes[i].uid] = self.graph.nodes[i];\n\n self.graph.links.forEach(function(link) {\n link.source = uidsToNodes[link.source.uid];\n link.target = uidsToNodes[link.target.uid];\n });\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n // the actual node objects may have changed, so we hae to recreate\n // the extra links based on the uids\n if (!(self.extraLinks[i].target.uid in uidsToNodes)) {\n console.log('not there:', self.extraLinks[i]);\n continue;\n }\n\n self.extraLinks[i].source = uidsToNodes[self.extraLinks[i].source.uid];\n self.extraLinks[i].target = uidsToNodes[self.extraLinks[i].target.uid];\n\n if (self.extraLinks[i].linkType == 'intermolecule') {\n //remove links to middle nodes\n let fakeLinks = self.graph.links.filter(function(d) {\n return ((d.source == self.extraLinks[i].source || d.source == self.extraLinks[i].target ||\n d.target == self.extraLinks[i].source || d.target == self.extraLinks[i].source) &&\n d.linkType == 'fake');\n });\n\n for (let j = 0; j < fakeLinks.length; j++) {\n let linkIndex = self.graph.links.indexOf(fakeLinks[j]);\n self.graph.links.splice(linkIndex, 1);\n }\n }\n\n graph.links.push(self.extraLinks[i]);\n }\n };\n\n self.update = function () {\n self.force.nodes(self.graph.nodes)\n .links(self.graph.links);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n let allLinks = visLinks.selectAll('line.link')\n .data(self.graph.links.filter(realLinkFilter), elementKey);\n\n allLinks.attr('class', '')\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('link_type', function(d) { return d.linkType; } )\n\n let linksEnter = allLinks.enter();\n createNewLinks(linksEnter);\n\n allLinks.exit().remove();\n\n let gnodes = visNodes.selectAll('g.gnode')\n .data(self.graph.nodes, elementKey);\n //.attr('pointer-events', 'all');\n\n let gnodesEnter = gnodes.enter();\n createNewNodes(gnodesEnter);\n gnodes.exit().remove();\n\n\n //fake_nodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'middle'; });\n //fakeNodes = self.graph.nodes.filter(function(d) { return true; });\n let realNodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'nucleotide' || d.nodeType == 'label';});\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n self.force.on('tick', function() {\n let q = d3.geom.quadtree(realNodes);\n let i = 0;\n let n = realNodes.length;\n\n let collide = (node) => {\n let r = node.radius + 16,\n nx1 = node.x - r,\n nx2 = node.x + r,\n ny1 = node.y - r,\n ny2 = node.y + r;\n return function(quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n let x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.radius + quad.point.radius;\n if (l < r) {\n l = (l - r) / l * 0.1;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n\n while (++i < n) q.visit(collide(realNodes[i]));\n\n allLinks.attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n // Translate the groups\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n });\n\n self.force.on('end', () => {\n gnodes.selectAll('[node_type=nucleotide]')\n .filter((d,i) => { if (i == 0) return true; else return false; })\n .each((d,i) => {\n //console.log(\"pos\", d.num, d.x, d.y);\n });\n\n //for (let uid in self.rnas) {\n // for (let i = 1; i < self.rnas[uid].pairtable[0]; i++) {\n // console.log('pt', i, self.rnas[uid].pairtable[i]);\n // }\n //}\n\n });\n\n self.changeColorScheme(self.colorScheme);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n updateStyle();\n };\n\n self.transitionRNA = function(newStructure, nextFunction) {\n if (self.dotbracket == newStructure) {\n return;\n } else {\n self.dotbracket = newStructure;\n }\n //transition from an RNA which is already displayed to a new structure\n var duration = self.options.transitionDuration;\n\n var uids = self.graph.nodes\n .filter(function(d) { return d.nodeType == 'nucleotide'; })\n .map(function(d) { return d.uid; });\n\n let options = {'uids': uids};\n var newRNAJson = createInitialLayout(newStructure, options);\n\n let gnodes = visNodes.selectAll('g.gnode').data(newRNAJson.nodes, elementKey);\n var links = visLinks.selectAll('line.link').data(newRNAJson.links.filter(realLinkFilter), elementKey);\n\n if (duration === 0)\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n else {\n gnodes.transition()\n .attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')'; }).duration(duration);\n }\n\n\n var newNodes = createNewNodes(gnodes.enter())\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n if (duration === 0)\n gnodes.exit().remove();\n else\n gnodes.exit().transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n self.graph.nodes = gnodes.data();\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n self.centerView(duration);\n\n function endall(transition, callback) {\n if (transition.size() === 0) { setTimeout(callback, duration); }\n var n = 0;\n transition\n .each(function() { ++n; })\n .each('end', function() { if (!--n) callback.apply(this, arguments); });\n }\n\n function afterAnimation() {\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n\n if (typeof nextFunction != 'undefined')\n nextFunction();\n\n }\n\n links.exit().remove();\n\n if (duration === 0) {\n links\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n\n updateStyle();\n } else {\n links.transition()\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .duration(duration)\n .call(endall, afterAnimation);\n }\n\n if (duration === 0) {\n newNodes\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n } else {\n newNodes.transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n }\n\n };\n\n /* Plot presentation related functions */\n let getBoundingBoxTransform = () => {\n // Center the view on the molecule(s) and scale it so that everything\n // fits in the window\n\n //no molecules, nothing to do\n if (self.graph.nodes.length === 0)\n return {'translate': [0,0], 'scale': 1};\n\n // Get the bounding box\n var minX = d3.min(self.graph.nodes.map(function(d) {return d.x;}));\n var minY = d3.min(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n var maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxRadius = d3.max(self.graph.nodes.map(function(d) { return d.radius; }));\n\n // The width and the height of the molecule\n var molWidth = maxX - minX;\n var molHeight = maxY - minY;\n\n // how much larger the drawing area is than the width and the height\n var widthRatio = self.options.svgW / (molWidth + 1);\n var heightRatio = self.options.svgH / (molHeight + 1);\n\n // we need to fit it in both directions, so we scale according to\n // the direction in which we need to shrink the most\n var minRatio = Math.min(widthRatio, heightRatio,\n self.options.maxNodeRadius / maxRadius) * 0.8;\n\n // the new dimensions of the molecule\n var newMolWidth = molWidth * minRatio;\n var newMolHeight = molHeight * minRatio;\n\n // translate so that it's in the center of the window\n var xTrans = -(minX) * minRatio + (self.options.svgW - newMolWidth) / 2;\n var yTrans = -(minY) * minRatio + (self.options.svgH - newMolHeight) / 2;\n\n return {'translate': [xTrans, yTrans], 'scale': minRatio};\n };\n\n self.centerView = function(duration = 0) {\n var bbTransform = getBoundingBoxTransform();\n\n if (bbTransform === null)\n return;\n\n // do the actual moving\n vis.transition().attr('transform',\n 'translate(' + bbTransform.translate + ')' + ' scale(' + bbTransform.scale + ')').duration(duration);\n\n // tell the zoomer what we did so that next we zoom, it uses the\n // transformation we entered here\n self.zoomer.translate(bbTransform.translate);\n self.zoomer.scale(bbTransform.scale);\n };\n\n self.setSize = (\n svgW = d3.select(element).node().offsetWidth,\n svgH = d3.select(element).node().offsetHeight\n ) => {\n // save width and height\n self.options.svgW = svgW;\n self.options.svgH = svgH;\n\n // set the viewBox\n svg.attr('viewBox', \"0 0 \" + svgW + \" \" + svgH)\n\n //Set the output range of the scales\n xScale.range([0, svgW]).domain([0, svgW]);\n yScale.range([0, svgH]).domain([0, svgH]);\n\n //re-attach the scales to the zoom behaviour\n self.zoomer.x(xScale)\n .y(yScale);\n self.brusher.x(xScale)\n .y(yScale);\n\n //resize the background\n svg.select('.background')\n .attr('width', svgW)\n .attr('height', svgH);\n\n // center the view\n self.centerView();\n }\n\n /* Style and color related functions */\n self.setOutlineColor = function(color) {\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n nodes.style('fill', color);\n }\n\n self.addCustomColors = function addCustomColors(json) {\n // Add a json file containing the custom colors\n self.customColors = json;\n self.changeColorScheme('custom');\n };\n\n self.addCustomColorsText = function(customColorsText) {\n let cs = new ColorScheme(customColorsText);\n self.customColors = cs.colorsJson;\n self.changeColorScheme('custom');\n };\n\n self.changeColorScheme = function(newColorScheme) {\n var proteinNodes = visNodes.selectAll('[node_type=protein]');\n\n proteinNodes.classed(fstyle.node, true)\n .attr('r', function(d) { return d.radius; });\n\n var gnodes = visNodes.selectAll('g.gnode');\n var circles = visNodes.selectAll('g.gnode').selectAll('circle');\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n self.colorScheme = newColorScheme;\n\n\n if (newColorScheme == 'sequence') {\n var scale = d3.scale.ordinal()\n .range(['#dbdb8d', '#98df8a', '#ff9896', '#aec7e8', '#aec7e8'])\n .domain(['A','C','G','U','T']);\n nodes.style('fill', function(d) {\n return scale(d.name);\n });\n\n } else if (newColorScheme == 'structure') {\n var scale = d3.scale.category10()\n .domain(['s','m','i','e','t','h','x'])\n .range(['lightgreen', '#ff9896', '#dbdb8d', 'lightsalmon',\n 'lightcyan', 'lightblue', 'transparent']);\n\n nodes.style('fill', function(d) {\n return scale(d.elemType);\n });\n\n } else if (newColorScheme == 'positions') {\n nodes.style('fill', function(d) {\n var scale = d3.scale.linear()\n .range(['#98df8a', '#dbdb8d', '#ff9896'])\n .interpolate(d3.interpolateLab)\n .domain([1, 1 + (d.rna.rnaLength - 1) / 2, d.rna.rnaLength]);\n\n return scale(d.num);\n });\n } else if (newColorScheme == 'custom') {\n // scale to be used in case the user passes scalar\n // values rather than color names\n if (typeof self.customColors != 'undefined' &&\n 'domain' in self.customColors &&\n 'range' in self.customColors) {\n var scale = d3.scale.linear()\n .interpolate(d3.interpolateLab)\n .domain(self.customColors.domain)\n .range(self.customColors.range);\n }\n\n let changeColors = (moleculeColors, d, scale) => {\n if (moleculeColors.hasOwnProperty(d.num)) {\n let val = parseFloat(moleculeColors[d.num]);\n\n if (isNaN(val)) {\n // passed in color is not a scalar, so\n // treat it as a color\n return moleculeColors[d.num];\n } else {\n // the user passed in a float, let's use a colormap\n // to convert it to a color\n return scale(val);\n }\n } else {\n return 'white';\n }\n }\n\n nodes.style('fill', function(d) {\n if (typeof self.customColors == 'undefined' ||\n !self.customColors.hasOwnProperty('colorValues')) {\n return 'white';\n }\n\n if (self.customColors.colorValues.hasOwnProperty(d.structName) &&\n self.customColors.colorValues[d.structName].hasOwnProperty(d.num)) {\n // if a molecule name is specified, it supercedes the default colors\n // (for which no molecule name has been specified)\n let moleculeColors = self.customColors.colorValues[d.structName];\n return changeColors(moleculeColors, d, scale);\n } else if (self.customColors.colorValues.hasOwnProperty('')) {\n let moleculeColors = self.customColors.colorValues[''];\n return changeColors(moleculeColors, d, scale);\n }\n\n return 'white';\n });\n }\n };\n\n let updateStyle = () => {\n // Numbering\n visNodes.selectAll('[node_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visNodes.selectAll('[label_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visLinks.selectAll('[link_type=label_link]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n // Node Outline\n svg.selectAll('[node_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeOutline);\n // Node Labels\n visNodes.selectAll('[label_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeLabel);\n // Links\n svg.selectAll('[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]').classed(fstyle.transparent, !self.displayParameters.displayLinks);\n // Pseudoknot Links\n svg.selectAll('[link_type=pseudoknot]').classed(fstyle.transparent, !self.displayParameters.displayPseudoknotLinks);\n // Protein Links\n svg.selectAll('[link_type=protein_chain]').classed(fstyle.transparent, !self.displayParameters.displayProteinLinks);\n // Fake Links\n visLinks.selectAll('[link_type=fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n visLinks.selectAll('[link_type=fake_fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n // direction Arrows\n svg.selectAll('.' + fstyle.directionArrow).classed(fstyle.transparent, !self.displayParameters.displayDirectionArrows);\n };\n\n /* RNA edditing related functions */\n let changeNode = function(nodeName, referenceNode) {\n // change the label of a node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num;\n\n let newDotbracket = dotbracket;\n let newSequence = sequence.slice(0,newNodeNum-1) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n console.log('uids:', uids);\n uids.splice(newNodeNum-1, 1, slugid.nice());\n let newPositions = positions;\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': uids,\n 'centerView': false});\n }\n\n let insertNodeBeforeOrAfter = function(nodeName, referenceNode, positionOffset) {\n //insert a new node before or after another one\n //positionOffset specifies who far from the original to insert the new node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num + positionOffset;\n\n let newDotbracket = dotbracket.slice(0,newNodeNum) + '.' + dotbracket.slice(newNodeNum);\n let newSequence = sequence.slice(0,newNodeNum) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n uids.splice(newNodeNum, 0, slugid.nice());\n positions.splice(newNodeNum, 0, positions[newNodeNum - positionOffset-1]);\n\n let newUids = uids;\n let newPositions = positions;\n\n console.log('positions:', positions);\n console.log('new node positions:', newPositions);\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n }\n\n let deleteNode = function(node) {\n console.log('deleting...', node);\n // get the dotbracket string for this rna\n let rna = node.rna;\n let pair = rna.pairtable[node.num];\n\n // remove basepairs for this node\n if (pair != 0) {\n rna.pairtable[node.num] = 0;\n rna.pairtable[pair] = 0;\n }\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newDotbracket = dotbracket.slice(0, node.num-1) + dotbracket.slice(node.num)\n let newPositions = positions.slice(0, node.num-1)\n .concat(positions.slice(node.num));\n let newSequence = sequence.slice(0, node.num-1) + sequence.slice(node.num)\n let newUids = uids.slice(0, node.num-1)\n .concat(uids.slice(node.num));\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n\n console.log('new dotbracket:', newDotbracket);\n //recalculateGraph();\n\n //remove backbone links associated with this node\n\n //remove this node\n\n }\n\n let elementKey = (d) => {\n return d.uid;\n };\n\n let updateRnaGraph = function(r) {\n let nucleotidePositions = r.getPositions('nucleotide');\n let labelPositions = r.getPositions('label');\n\n let uids = r.getUids();\n\n r.recalculateElements()\n .elementsToJson()\n .addPseudoknots()\n .addPositions('nucleotide', nucleotidePositions)\n .addUids(uids)\n .addLabels(1, self.options.labelInterval)\n .addPositions('label', labelPositions)\n .reinforceStems()\n .reinforceLoops()\n .updateLinkUids();\n };\n\n let removeBackBoneLink = function(d) {\n if (d.target.num - d.source.num != 1) {\n console.log('ERROR: non adjacent nodes. Target:', d.target,\n 'Source:', d.source, 'Link:', d);\n return;\n }\n\n let rna = d.target.rna;\n let toRemove = [];\n\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue;\n\n if (link.source.num <= d.source.num && link.target.num >= d.target.num) {\n console.log('crossing basepair', link);\n toRemove.push(link);\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n\n toRemove[i].from = toRemove[i].source.num;\n toRemove[i].to = toRemove[i].target.num - d.source.num;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n let sequence = rna.seq;\n let sequence1 = rna.seq.slice(0, d.source.num);\n let sequence2 = rna.seq.slice(d.source.num);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotBracket1 = rnaDotBracket.slice(0, d.source.num);\n let dotBracket2 = rnaDotBracket.slice(d.source.num)\n\n // get the nucleotide positions\n // cut them at the positions of the backbone bond\n let positions = rna.getPositions('nucleotide')\n let uids = rna.getUids();\n\n let positions1 = positions.slice(0, d.source.num);\n let positions2 = positions.slice(d.source.num);\n\n let uids1 = uids.slice(0, d.source.num);\n let uids2 = uids.slice(d.source.num);\n\n console.log('positions1:', positions1);\n console.log('positions2:', positions2);\n\n delete self.rnas[rna.uid];\n let rna1 = self.addRNA(dotBracket1, { 'sequence': sequence1,\n 'positions': positions1,\n 'uids': uids1 });\n let rna2 = self.addRNA(dotBracket2, { 'sequence': sequence2,\n 'positions': positions2,\n 'uids': uids2 });\n for (let i = 0; i < toRemove.length; i++) {\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': rna1.nodes[toRemove[i].from-1],\n 'target': rna2.nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n\n }\n console.log('self.extraLinks:', self.extraLinks);\n //self.extraLinks.push({'source': rna1.nodes[\n\n // create two new rnas\n // add their positions\n // add them back to the plot\n }\n\n var removeLink = function(d) {\n // remove a link between two nodes\n let index = self.graph.links.indexOf(d);\n console.log('removing link:', index);\n\n if (index > -1) {\n //remove a link\n //graph.links.splice(index, 1);\n\n // there should be two cases\n // 1. The link is within a single molecule\n\n if (d.source.rna == d.target.rna) {\n if (d.linkType == 'backbone') {\n console.log('trying to remove a backbone link', d.source.num, d.target.num);\n removeBackBoneLink(d);\n return;\n } else {\n let r = d.source.rna;\n r.addPseudoknots();\n r.pairtable[d.source.num] = 0;\n r.pairtable[d.target.num] = 0;\n\n updateRnaGraph(r);\n }\n } else {\n // 2. The link is between two different molecules\n let extraLinkIndex = self.extraLinks.indexOf(d);\n\n self.extraLinks.splice(extraLinkIndex, 1);\n }\n recalculateGraph();\n }\n self.update();\n };\n\n let addBackBoneLink = function(newLink) {\n // opposite of deleting a link\n // get the two dotbracket strings\n let rna1 = newLink.target.rna;\n let rna2 = newLink.source.rna;\n if (newLink.target.num == 1) {\n rna1 = newLink.source.rna;\n rna2 = newLink.target.rna;\n }\n\n let dotbracket1 = rnaUtilities.pairtableToDotbracket(rna1.pairtable);\n let dotbracket2 = rnaUtilities.pairtableToDotbracket(rna2.pairtable);\n\n let seq1 = rna1.seq;\n let seq2 = rna2.seq;\n\n let positions1 = rna1.getPositions('nucleotide');\n let positions2 = rna2.getPositions('nucleotide');\n\n // concatenate them\n let newDotbracket = dotbracket1 + dotbracket2;\n let newSeq = seq1 + seq2;\n let newPositions = positions1.concat(positions2);\n\n let toAddInternal = [];\n let toAddExternal = [];\n let toDelete = {};\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n console.log('self.extraLinks[i]', self.extraLinks[i]);\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n if (self.extraLinks[i].source.rna == rna1) {\n if ( self.extraLinks[i].target.rna == rna2) {\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].source.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].target.num;\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n // source will always be the unchanged molecule, whereas target will be\n // the newly created one\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].source.rna == rna2) {\n if ( self.extraLinks[i].target.rna == rna1) {\n // add internal link\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].target.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].source.num;\n\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num + dotbracket1.length\n });\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n\n if (self.extraLinks[i].target.rna == rna1) {\n if (self.extraLinks[i].source.rna == rna2) {\n // covered in previous if statement\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].target.rna == rna2) {\n if (self.extraLinks[i].source.rna == rna1) {\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num + dotbracket1.length\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n }\n\n\n self.extraLinks = self.extraLinks.filter((e) => { return !(e.uid in toDelete) });\n\n delete self.rnas[rna1.uid];\n delete self.rnas[rna2.uid];\n\n let newRna = null;\n // create a new RNA\n if (self.options.animation)\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'positions': newPositions,\n 'centerView': false});\n else\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'centerView': false });\n\n\n\n // add new external links\n for (let i = 0; i < toAddExternal.length; i++) {\n self.extraLinks.push({\n 'source': toAddExternal[i].source,\n 'target': newRna.nodes[toAddExternal[i].target-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'\n });\n }\n\n recalculateGraph();\n self.update();\n console.log('self.extraLinks:', self.extraLinks);\n };\n\n function nudge(dx, dy) {\n // TODO currently unused\n node.filter(function(d) { return d.selected; })\n .attr('cx', function(d) { return d.x += dx; })\n .attr('cy', function(d) { return d.y += dy; });\n\n link.filter(function(d) { return d.source.selected; })\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; });\n\n link.filter(function(d) { return d.target.selected; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n d3.event.preventDefault();\n }\n\n let nodeMouseup = function(d,i) {\n console.log(\"nodeMouseup\")\n let backbonePossible = true, basepairPossible = true;\n\n if (mousedownNode) {\n mouseupNode = d;\n\n // if the node isn't a nucleotide, we can't create a link\n if (mouseupNode.nodeType == 'middle' || mousedownNode.nodeType == 'middle' || mouseupNode.nodeType == 'label' || mousedownNode.nodeType == 'label')\n return;\n\n if (mouseupNode == mousedownNode) { resetMouseVars(); return; }\n let newLink = {source: mousedownNode, target: mouseupNode, linkType: 'basepair', value: 1, uid: slugid.nice()};\n\n for (let i = 0; i < self.graph.links.length; i++) {\n if ((self.graph.links[i].source == mousedownNode) ||\n (self.graph.links[i].target == mousedownNode) ||\n (self.graph.links[i].source == mouseupNode) ||\n (self.graph.links[i].target == mouseupNode)) {\n // either one of the nodes is already in a link\n\n // if any of the nodes are already involved in a basepair or a pseudoknot\n // then we can't make a basepair link\n if (self.graph.links[i].linkType == 'basepair' ||\n self.graph.links[i].linkType == 'pseudoknot' ||\n self.graph.links[i].linkType == 'intermolecule') {\n // although should be able to make a backbone link\n console.log('no basepair possible');\n basepairPossible = false;\n }\n }\n\n if (((self.graph.links[i].source == mouseupNode) &&\n (self.graph.links[i].target == mousedownNode)) ||\n ((self.graph.links[i].source == mousedownNode) &&\n (self.graph.links[i].target == mouseupNode))) {\n\n // if we're trying to make a link between two nodes which already have\n // a backbone between them, then we can't make a link\n if (self.graph.links[i].linkType == 'backbone') {\n return;\n }\n }\n }\n\n\n if (newLink.source.rna != newLink.target.rna) {\n // could be either a backbone link or an intermolecule link\n\n if ((newLink.source.num == 1 &&\n newLink.target.num == newLink.target.rna.rnaLength) ||\n (newLink.target.num == 1 &&\n newLink.source.num == newLink.source.rna.rnaLength)) {\n //\n let linkMenu = [\n {\n title: 'Backbone Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('Item #1 clicked!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n addBackBoneLink(newLink);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Basepair Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n self.addLink(newLink);\n }\n }\n ]\n linkContextMenuShown = true;\n let linkContextMenu = contextMenu(linkMenu);\n console.log('newLinkMenu');\n linkContextMenu.apply(this, [d,i,true,\n function() { dragLine.attr('class', fstyle.transparent) }]);\n } else {\n // between end points but can't make a backbone\n if (basepairPossible)\n self.addLink(newLink);\n }\n } else {\n if (basepairPossible)\n self.addLink(newLink);\n }\n\n }\n };\n\n let nodeMousedown = function(d) {\n console.log(\"nodeMousedown\")\n if (!d.selected && !ctrlKeydown) {\n // if this node isn't selected, then we have to unselect every other node\n deselectAllNodes()\n }\n\n if (!shiftKeydown) {\n // only without shift, toggle select or select\n if (ctrlKeydown) {\n toggleSelectNode(d)\n } else {\n selectNode(d)\n }\n }\n\n if (shiftKeydown && self.options.editable) {\n // with shift key and editable continue to draw dragline\n mousedownNode = d;\n\n dragLine\n .attr('class', fstyle.dragLine)\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mousedownNode.x)\n .attr('y2', mousedownNode.y);\n\n d3.event.stopPropagation();\n }\n };\n\n let linkClick = (d) => {\n if (!shiftKeydown) {\n return;\n }\n\n var invalidLinks = { //'backbone': true,\n 'fake': true,\n 'fake_fake': true,\n 'label_link': true};\n\n console.log('d.linkType:', d.linkType);\n if (d.linkType in invalidLinks )\n return;\n\n removeLink(d);\n };\n\n /* I/O functions */\n self.toJSON = function toJSON() {\n var data = {'rnas': self.rnas, 'extraLinks': self.extraLinks};\n var dataString = JSON.stringify(data, function(key, value) {\n //remove circular references\n if (key == 'rna') {\n return;\n } else {\n return value;\n }\n }, '\\t');\n return dataString;\n };\n\n self.fromJSON = function(jsonString) {\n var rnas, extraLinks;\n\n try{\n var data = JSON.parse(jsonString);\n rnas = data.rnas;\n extraLinks = data.extraLinks;\n } catch(err) {\n throw err;\n }\n\n for (var uid in rnas) {\n if (rnas[uid].type == 'rna') {\n r = new RNAGraph();\n\n r.seq = rnas[uid].seq;\n r.dotbracket = rnas[uid].dotbracket;\n r.circular = rnas[uid].circular;\n r.pairtable = rnas[uid].pairtable;\n r.uid = rnas[uid].uid;\n r.structName = rnas[uid].structName;\n r.nodes = rnas[uid].nodes;\n r.links = rnas[uid].links;\n r.rnaLength = rnas[uid].rnaLength;\n r.elements = rnas[uid].elements;\n r.nucsToNodes = rnas[uid].nucsToNodes;\n r.pseudoknotPairs = rnas[uid].pseudoknotPairs;\n } else {\n r = new ProteinGraph();\n r.size = rnas[uid].size;\n r.nodes = rnas[uid].nodes;\n r.uid = rnas[uid].uid;\n }\n\n self.addRNAJSON(r, false);\n }\n\n extraLinks.forEach(function(link) {\n self.extraLinks.push(link);\n });\n\n recalculateGraph();\n self.update();\n };\n\n self.addRNA = function(structure, passedOptions = {}) {\n let rnaJson = createInitialLayout(structure, passedOptions);\n let centerView = false;\n\n /*\n * Code to display the JSONs representing the structure\n *\n rnaJson.nodes[0].rna = null;\n rnaJson.nodes[0].nextNode = null;\n\n rnaJson.links[0].source = null;\n rnaJson.links[0].target = null;\n\n console.log(rnaJson.nodes[0]);\n console.log(rnaJson.links[0]);\n console.log(JSON.stringify(rnaJson.nodes[0],null,2));\n console.log(JSON.stringify(rnaJson.links[0],null,2));\n */\n\n if ('extraLinks' in passedOptions) {\n // presumably the passed in links are within the passed molecule\n let newLinks = self.addExternalLinks(rnaJson, passedOptions.extraLinks);\n\n self.extraLinks = self.extraLinks.concat(newLinks);\n }\n\n if ('centerPos' in passedOptions)\n self.addRNAJSON(rnaJson, {centerPos: passedOptions.centerPos,\n centerView: false})\n else if ('avoidOthers' in passedOptions)\n self.addRNAJSON(rnaJson, {avoidOthers: passedOptions.avoidOthers});\n else\n self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});\n\n return rnaJson;\n };\n\n self.addRNAJSON = function(rnaGraph,\n { avoidOthers = false,\n centerPos = null,\n centerView = true}\n ) {\n // Add an RNAGraph, which contains nodes and links as part of the\n // structure\n // Each RNA will have uid to identify it\n // when it is modified, it is replaced in the global list of RNAs\n //\n var maxX, minX;\n //console.log('centerView:', centerView);\n\n if (centerPos != null) {\n // center the newly created RNA at a given position\n let totalX = 0;\n let totalY = 0;\n let nodeCount = 0;\n\n rnaGraph.nodes.forEach(function(node) {\n totalX += node.x;\n totalY += node.y;\n nodeCount += 1;\n });\n\n if (nodeCount > 0) {\n // center the nodes at centerPos\n\n rnaGraph.nodes.forEach(function(node) {\n node.x = node.x + centerPos[0] - totalX / nodeCount;\n node.y = node.y + centerPos[1] - totalY / nodeCount;\n\n node.px = node.x;\n node.py = node.y;\n });\n }\n }\n\n if (avoidOthers) {\n if (self.graph.nodes.length > 0)\n maxX = d3.max(self.graph.nodes.map(function(d) { return d.x; }));\n else\n maxX = 0;\n\n minX = d3.min(rnaGraph.nodes.map(function(d) { return d.x; }));\n\n rnaGraph.nodes.forEach(function(node) {\n node.x += (maxX - minX) + 20;\n node.px += (maxX - minX);\n });\n }\n\n rnaGraph.nodes.forEach(function(node) {\n node.rna = rnaGraph;\n });\n\n self.rnas[rnaGraph.uid] = rnaGraph;\n recalculateGraph();\n\n self.update();\n\n if (centerView)\n self.centerView();\n\n return rnaGraph;\n };\n\n self.addNodes = function addNodes(json) {\n // add a new set of nodes from a json file\n\n // Resolve the sources and targets of the links so that they\n // are not just indeces into an array\n json.links.forEach(function(entry) {\n if (typeof entry.source == 'number') entry.source = json.nodes[entry.source];\n if (typeof entry.target == 'number') entry.target = json.nodes[entry.target];\n });\n\n // Get the maximum x and y values of the current graph\n // so that we don't place a new structure on top of the\n // old one\n if (self.graph.nodes.length > 0) {\n maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n } else {\n maxX = 0;\n maxY = 0;\n }\n\n json.nodes.forEach(function(entry) {\n if (!(entry.rna.uid in self.rnas)) {\n self.rnas[entry.rna.uid] = entry.rna;\n }\n\n entry.x += maxX;\n //entry.y += maxY;\n\n entry.px += maxX;\n //entry.py += maxY;\n });\n\n r = new RNAGraph('','');\n r.nodes = json.nodes;\n r.links = json.links;\n\n //self.addRNA(r);\n recalculateGraph();\n\n self.update();\n self.centerView();\n };\n\n self.clearNodes = () => {\n self.graph.nodes = [];\n self.graph.links = [];\n\n self.rnas = {};\n self.extraLinks = [];\n\n self.update();\n };\n\n self.addLink = function(newLink) {\n // this means we have a new json, which means we have\n // to recalculate the structure and change the colors\n // appropriately\n //\n console.log('adding new link');\n if (newLink.source.rna == newLink.target.rna) {\n // must be a basepair\n let r = newLink.source.rna;\n\n r.pairtable[newLink.source.num] = newLink.target.num;\n r.pairtable[newLink.target.num] = newLink.source.num;\n\n updateRnaGraph(r);\n\n } else {\n //Add an extra link\n console.log('intermolecule');\n newLink.linkType = 'intermolecule';\n self.extraLinks.push(newLink);\n }\n recalculateGraph();\n self.update();\n };\n\n self.addExternalLinks = function(rnaJson, externalLinks) {\n let newLinks = [];\n\n for (let i = 0; i < externalLinks.length; i++) {\n let newLink = {linkType: 'external', value: 1, uid: slugid.nice(),\n source: null, target: null};\n // check if the source node is an array\n if (Object.prototype.toString.call(externalLinks[i][0]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][0])) {\n newLink.source = rnaJson.nodes[j];\n break;\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][0]) {\n newLink.source = rnaJson.nodes[j];\n }\n }\n }\n\n // check if the target node is an array\n if (Object.prototype.toString.call(externalLinks[i][1]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][1])) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][1]) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n\n if (newLink.source == null || newLink.target == null) {\n console.log('ERROR: source or target of new link not found:', newLink, externalLinks[i]);\n continue;\n }\n\n newLinks.push(newLink);\n }\n\n return newLinks;\n };\n\n self.getStructuresDotBracket = function() {\n console.log('self.rnas:', self.rnas);\n let sequence = [];\n let currIdx = 1;\n let nodeIdxs = {};\n let breaks = [];\n let pairtable = [];\n\n // add the nodes\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.nodes.length; j++) {\n let node = rna.nodes[j];\n\n if (node.nodeType != 'nucleotide')\n continue;\n\n console.log('node:', node);\n nodeIdxs[node.uid] = currIdx;\n currIdx += 1;\n\n sequence.push(node.name);\n }\n\n breaks.push(currIdx);\n }\n\n pairtable = [currIdx-1]\n for (let i = 0; i < currIdx; i++)\n pairtable.push(0)\n\n // add the links\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.links.length; j++) {\n let link = rna.links[j];\n\n if (link.linkType != 'basepair')\n continue;\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n }\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n let link = self.extraLinks[i];\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n\n let structure = rnaUtilities.pairtableToDotbracket(pairtable).split('');\n\n for (let i = 0; i < breaks.length - 1; i++) {\n console.log('breaks[i]:', breaks[i]);\n sequence.splice(breaks[i] + i - 1, 0, '&');\n structure.splice(breaks[i] + i - 1, 0, '&');\n }\n\n console.log('sequence:', sequence, sequence.join(''));\n console.log('structure:', structure, structure.join(''));\n return [sequence.join(''), structure.join('')];\n };\n\n /* APIs */\n self.startAnimation = function() {\n self.options.animation = true;\n vis.selectAll('g.gnode')\n .call(drag);\n self.force.start();\n };\n\n self.stopAnimation = function() {\n self.options.animation = false;\n vis.selectAll('g.gnode')\n .on('mousedown.drag', null);\n self.force.stop();\n };\n\n self.resumeForce = function() {\n if (self.options.animation)\n self.force.resume();\n };\n\n self.setFriction = function(value) {\n self.force.friction(value);\n self.resumeForce();\n };\n\n self.setCharge = function(value) {\n self.force.charge(value);\n self.resumeForce();\n };\n\n self.setGravity = function(value) {\n self.force.gravity(value);\n self.resumeForce();\n };\n\n self.setPseudoknotStrength = function(value) {\n self.linkStrengths.pseudoknot = value;\n self.update();\n };\n\n self.displayNumbering = function(value) {\n self.displayParameters.displayNumbering = value;\n updateStyle();\n };\n\n self.displayNodeOutline = function(value) {\n self.displayParameters.displayNodeOutline = value;\n updateStyle();\n };\n\n self.displayNodeLabel = function(value) {\n self.displayParameters.displayNodeLabel = value;\n updateStyle();\n };\n\n self.displayLinks = function(value) {\n self.displayParameters.displayLinks = value;\n updateStyle();\n };\n\n self.displayPseudoknotLinks = function(value) {\n self.displayParameters.displayPseudoknotLinks = value;\n updateStyle();\n };\n\n self.displayProteinLinks = function(value) {\n self.displayParameters.displayProteinLinks = value;\n updateStyle();\n };\n\n self.displayDirectionArrows = function(value) {\n self.displayParameters.displayDirectionArrows = value;\n updateStyle();\n };\n}\n","import {RNAGraph} from './rnagraph.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js'\n\nimport fstyle from './fornac.css';\n\nexport function rnaPlot(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0' // for x and y either 0, 0.5 or 1\n };\n var options = Object.assign(options, passedOptions);\n\n var xScale, yScale;\n\n function createTransformToFillViewport(xValues, yValues) {\n // create transform that will scale the x and y values so that\n // they fill the available viewport\n let xExtent = d3.extent(xValues);\n let yExtent = d3.extent(yValues);\n\n // add the radius of the nucleotides\n xExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n\n xExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n\n // find out how wide and height the molecule\n var xRange = xExtent[1] - xExtent[0];\n var yRange = yExtent[1] - yExtent[0];\n\n // how much wider / taller is it than the available viewport\n var xExtra = xRange - options.width;\n var yExtra = yRange - options.height;\n\n // once we have a scale for one dimension, we can create the scale for the other\n // keeping the same expansion / shrinking ratio\n function createOtherScale(firstScale, newDomain, newRange) {\n var scaleFactor = (firstScale.range()[1] - firstScale.range()[0]) /\n (firstScale.domain()[1] - firstScale.domain()[0]);\n var newWidth = (newDomain[1] - newDomain[0]) * scaleFactor\n var newMargin = ((newRange[1] - newRange[0]) - newWidth) / 2;\n\n return {'scaleFactor': scaleFactor,\n 'scale': d3.scale.linear()\n .domain(newDomain)\n .range([newRange[0] + newMargin, newRange[1] - newMargin])};\n }\n\n var ret;\n\n if (xExtra > yExtra) {\n // we have to shrink more in the x-dimension than the y\n xScale = d3.scale.linear()\n .domain(xExtent)\n .range([0, options.width])\n\n ret = createOtherScale(xScale, yExtent, [0, options.height]);\n yScale = ret.scale;\n } else {\n // we have to shrink more in the x-dimension than the y\n yScale = d3.scale.linear()\n .domain(yExtent)\n .range([0, options.height])\n\n ret = createOtherScale(yScale, xExtent, [0, options.width]);\n xScale = ret.scale;\n }\n\n var xOffset = xScale.range()[0] - xScale.domain()[0];\n var yOffset = yScale.range()[0] - yScale.domain()[0];\n\n return 'translate(' + -(xScale.domain()[0] * ret.scaleFactor - xScale.range()[0]) +\n ',' + -(yScale.domain()[0] * ret.scaleFactor - yScale.range()[0]) + ')' +\n 'scale(' + ret.scaleFactor + ')';\n }\n\n function createNucleotides(selection, nucleotideNodes) {\n // create groupings for each nucleotide and label\n var gs = selection\n .selectAll('.gnode')\n .data(nucleotideNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'nucleotide')\n .attr('base_type', (d) => { if (d.name) { return d.name.toLowerCase(); }})\n .attr('r', options.nucleotideRadius)\n\n\n if (options.showNucleotideLabels) {\n var nucleotideLabels = gs.append('svg:text')\n .text(function(d) { return d.name; })\n .classed(fstyle.nodeLabel, true)\n .append('svg:title')\n .text(function(d) { return d.struct_name + ':' + d.num; });\n }\n }\n\n function createLabels(selection, labelNodes) {\n // create groupings for each nucleotide and label\n\n var gs = selection\n .selectAll()\n .data(labelNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'label')\n .attr('r', options.nucleotideRadius)\n\n var numberLabels = gs.append('svg:text')\n .classed(fstyle.nodeLabel, true)\n .text(function(d) { return d.name; })\n }\n\n function createName(selection, name) {\n let nameLabel = selection.append('svg:text')\n //.attr('dy', -10)\n .classed(fstyle.plotLabel, true)\n .text(name);\n\n let xyPos = options.namePosition.split(\" \", 2) // 0 0.5 1\n let xy = []\n let textBBox = nameLabel.node().getBBox()\n let textSize = [textBBox.width, textBBox.height]\n let plotSize = [options.width, options.height]\n\n for (let p in [0, 1]) {\n switch (xyPos[p]) {\n case '0':\n xy[p] = textSize[p] / 2\n break;\n case '1':\n xy[p] = plotSize[p] - textSize[p] / 2\n break;\n case '0.5':\n xy[p] = plotSize[p] / 2\n break;\n }\n }\n nameLabel.attr('x', xy[0]).attr('y', xy[1])\n }\n\n function makeExternalLinksBundle(selection, links) {\n var nodesDict = {};\n var linksList = [];\n links = links.filter(function(d) { return d.linkType == 'correct' || d.linkType == 'incorrect' || d.linkType == 'extra'; });\n\n selection.selectAll('[link-type=extra]')\n .remove();\n\n\n for (var i = 0; i < links.length; i++) {\n if (links[i].source === null || links[i].target === null)\n continue;\n\n nodesDict[links[i].source.uid] = links[i].source;\n nodesDict[links[i].target.uid] = links[i].target;\n\n linksList.push({'source': links[i].source.uid, 'target': links[i].target.uid, 'linkType': links[i].linkType, 'extraLinkType': links[i].extraLinkType}) ;\n }\n\n var fbundling = d3.ForceEdgeBundling().nodes(nodesDict).edges(linksList)\n .compatibility_threshold(0.8).step_size(0.2);\n var results = fbundling();\n\n var d3line = d3.svg.line()\n .x(function(d){return d.x;})\n .y(function(d){return d.y;})\n .interpolate('linear');\n\n for (var i = 0; i < results.length; i++) {\n var edge_subpoint_data = results[i];\n // for each of the arrays in the results\n // draw a line between the subdivions points for that edge\n\n selection.append('path').attr('d', d3line(edge_subpoint_data))\n .style('fill', 'none')\n .attr('link-type', function(d) { return linksList[i].linkType; })\n .attr('extra-link-type', function(d) { return linksList[i].extraLinkType; })\n .style('stroke-opacity',0.4); //use opacity as blending\n }\n\n }\n\n function createLinks(selection, links) {\n links = links.filter(function(d) { return d.source !== null && d.target !== null; });\n var gs = selection.selectAll('.link')\n .data(links)\n .enter()\n .append('svg:line')\n .attr('x1', function(d) { return d.source.x; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link-type', function(d) { return d.linkType; })\n .attr('extra-link-type', function(d) { return d.extraLinkType; })\n .classed('link', true)\n .classed(fstyle.link, true)\n }\n\n function chart(selection) {\n selection.each(function(data) {\n let plot = d3.select(this).append('g')\n .classed(fstyle.plot, true)\n\n // data should be a dictionary containing at least a structure\n // and possibly a sequence\n let rg = new RNAGraph(data.sequence, data.structure, data.name, options.startNucleotideNumber)\n .recalculateElements()\n .elementsToJson()\n .addName(data.name);\n\n data.rnaGraph = rg;\n // calculate the position of each nucleotide\n // the positions of the labels will be calculated in\n // the addLabels function\n let positions = [];\n\n if (options.rnaLayout === 'naview') {\n var naview = new NAView();\n var naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n\n for (var i = 0; i < naViewPositions.nbase; i++) {\n positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n }\n } else {\n positions = simpleXyCoordinates(rg.pairtable);\n }\n\n rg.addPositions('nucleotide', positions)\n //.reinforceStems()\n //.reinforceLoops()\n //.addExtraLinks(data.extraLinks)\n .addLabels(options.startNucleotideNumber, options.labelInterval);\n\n // create a transform that will fit the molecule to the\n // size of the viewport (canvas, svg, whatever)\n let fillViewportTransform = createTransformToFillViewport(\n rg.nodes.map(function(d) { return d.x; }),\n rg.nodes.map(function(d) { return d.y; })\n );\n plot.attr('transform', fillViewportTransform);\n\n let nucleotideNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n let labelNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'label';\n });\n\n let links = rg.links;\n\n createLinks(plot, links);\n createNucleotides(plot, nucleotideNodes);\n createLabels(plot, labelNodes);\n createName(d3.select(this), data.name);\n\n if (options.bundleExternalLinks) {\n makeExternalLinksBundle(plot, links);\n }\n\n });\n }\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n return chart;\n}\n","import {rnaPlot} from './rnaplot.js';\n\nexport function rnaTreemap(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0', // for x and y either 0, 0.5 or 1\n };\n\n var options = Object.assign(options, passedOptions);\n\n function rnaTreemapNode(selection) {\n // create a background rectangle for each RNA structure\n selection.each(function(d) {\n d3.select(this)\n .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')' })\n .append('rect')\n .attr('fill', 'transparent')\n .attr('width', function(d) { return Math.max(0, d.dx); })\n .attr('height', function(d) { return Math.max(0, d.dy); })\n\n // draw the actual RNA structure\n var chart = rnaPlot(options)\n .width( Math.max(0, d.dx))\n .height( Math.max(0, d.dy))\n\n if ('structure' in d) d3.select(this).call(chart)\n });\n }\n\n var chart = function(selection) {\n selection.each(function(data) {\n console.log('data:', data)\n // initialize the treemap structure\n // sample input\n // { 'name': 'blah',\n // 'children: [{'structure': '..((..))',\n // 'sequence': 'ACCGGCC',\n // 'size': 50}]\n // }\n var treemap = d3.layout.treemap()\n .size([options.width, options.height])\n .sticky(false)\n .value(function(d) { return d.size; });\n\n // create a new <g> for each node in the treemap\n // this may be a little redundant, since we expect the calling\n // selection to contain their own g elements\n var gEnter = d3.select(this)\n .append('g')\n .classed('rnatreemap', true)\n var treemapGnodes = gEnter.datum(data).selectAll('.treemapnode')\n .data(treemap.nodes)\n .enter()\n .append('g')\n .classed('treemapnode', true)\n .call(rnaTreemapNode);\n });\n };\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n chart.zoom = function(_) {\n if (!arguments.length) return options.zoom;\n options.zoom = _;\n return chart;\n };\n\n return chart;\n}\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__990__","Connection","this","loop","Loop","region","Region","start","end","xrad","yrad","angle","extruded","broken","_isNull","prototype","isNull","setNull","getLoop","setLoop","getRegion","setRegion","getStart","setStart","getEnd","setEnd","getXrad","setXrad","getYrad","setYrad","getAngle","setAngle","isExtruded","setExtruded","isBroken","setBroken","nconnection","connections","_connections","number","depth","mark","x","y","radius","getNconnection","setNconnection","setConnection","i","c","getConnection","addConnection","push","getNumber","setNumber","getDepth","setDepth","isMark","setMark","getX","setX","getY","setY","getRadius","setRadius","_start1","_end1","_start2","_end2","getStart1","setStart1","start1","getEnd1","setEnd1","end1","getStart2","setStart2","start2","getEnd2","setEnd2","end2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","kMaxLength","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","uuid","encode","uuid_","parse","substring","decode","slug","stringify","v4","nice","getRandomValues","rnds8","rng","crypto","bind","msCrypto","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","options","node","clockseq","seedBytes","random","msecs","Date","now","nsecs","dt","tl","tmh","v","version","hashfunc","generateUUID","namespace","unescape","encodeURIComponent","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","key","o","g","globalThis","Function","window","prop","hasOwnProperty","r","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","p","contextMenu","menu","opts","openCallback","closeCallback","previouslyMouseUp","uid","slugid","rootElement","orientation","initialPos","parentStart","onOpen","onClose","d3","enter","append","classed","on","style","index","pMouseUp","elm","mousePos","currentThis","openChildMenuUid","html","selectAll","attr","divider","disabled","action","title","children","childUid","boundingRect","getBoundingClientRect","childrenContextMenu","left","pageXOffset","top","pageYOffset","width","ArrowIcon","contextMenuSelection","innerWidth","numberSort","arraysEqual","RNAUtilities","bracketLeft","bracketRight","inverseBrackets","bracket","maximumMatching","pt","mm","maximum","backtrackMaximumMatching","oldPt","map","mmBt","dotbracketToPairtable","dotbracket","inverseBracketLeft","inverseBracketRight","ni","pop","insertIntoStack","k","deleteFromStack","pairtableToDotbracket","seen","findUnmatched","to","toRemove","unmatched","origFrom","origTo","removePseudoknotsFromPairtable","newPt","removed","ptToElements","level","dotBracketBreaks","elements","u5","u3","sort","external","right","combined","rnaUtilities","ColorScheme","colorsText","parseRange","rangeText","nums","parts1","parseColorText","colorText","lines","currMolecule","counter","colorsJson","colorValues","domainValues","words","search","partsRight","domain","color","normalizeColors","moleculeName","minNum","MAX_VALUE","maxNum","MIN_VALUE","resnum","RNAGraph","seq","structName","startNumber","circularizeExternal","circular","pseudoknotPairs","nucsToNodes","addUids","uids","nucleotideNodes","nodes","filter","nodeType","computePairtable","pairtable","removeBreaks","targetString","breaks","breakIndex","seqBreaks","rnaLength","addPositions","positions","labelNodes","breakNodesToFakeNodes","elemType","getPositions","getUids","reinforceStems","relevantElements","allNucs","nucs","addFakeNode","reinforceLoops","filterNucs","newNode1","px","py","newNode2","updateLinkUids","links","source","tan","fakeNodeUid","newNode","newX","newY","coordsCounted","cos","ia","fromNode","connectFakeNodes","fakeNodes","linked","thisNode","thisNuc","JSON","distance","addExtraLinks","extraLinks","newLink","getNodeFromNucleotides","linkType","elementsToJson","elemTypes","nodeName","prevNode","nextNode","addLabels","labelInterval","prevVec","nextVec","combinedVec","vecLength","sqrt","normedVec","offsetVec","recalculateElements","removePseudoknots","externalLoop","eloop","prev","hloop","numGreater","reassignLinkUids","addPseudoknots","addName","simpleXyCoordinates","pair_table","alpha","loop_size","stack_size","lp","stk","PIHALF","PI","i_old","partner","start_k","start_l","ladder","begin","diff","polygon","count","bubble","remember","poss","sin","Radloop","loopnumber","next","getLoopnumber","setLoopnumber","getNext","setNext","getPrev","setPrev","mate","extracted","getMate","setMate","isExtracted","setExtracted","NAView","ANUM","MAXITER","bases","nbase","nregion","loop_count","loops","regions","rlphead","lencut","RADIUS_REDUCTION_FACTOR","angleinc","_h","HELIX_FACTOR","BACKBONE_DISTANCE","determine_depths","FornaContainer","element","passedOptions","assign","initialSize","svgW","svgH","linkStrengths","displayParameters","colorScheme","customColors","rnas","mousedownNode","mouseupNode","linkContextMenuShown","resetMouseVars","graph","editable","animation","shiftKeydown","ctrlKeydown","keydown","getStructuresDotBracket","centerView","zoomable","disableZooming","enableBrushing","keyup","enableZooming","disableBrushing","backgroundMenu","canvasMousePos","xScale","invert","yScale","addRNA","nodeMenu","deleteNode","changeNode","insertNodeBeforeOrAfter","nodeContextMenu","backgroundContextMenu","select","remove","svg","each","focus","mouseEventHelper","mpos","vis","dragLine","fstyle","deselectAllNodes","visLinks","visNodes","zoomer","scaleExtent","toggleSelectNode","selected","selectNode","selectedNodes","brusher","extent","force","charge","middleCharge","otherCharge","friction","linkDistance","linkDistanceMultiplier","linkStrength","other","gravity","chargeDistance","drag","d1","fixed","resumeForce","createInitialLayout","structure","rg","sequence","rnaJson","layout","naview","naViewPositions","naview_xy_coordinates","createNewNodes","gnodesEnter","previouslySelected","rna","transition","duration","ease","nodeMousedown","nodeMouseup","labelAndProteinNodes","text","createNewLinks","linksEnter","linkLines","linkClick","drawDirectionArrow","magnitude","endPoint","startPoint","nodeStroke","parseFloat","lengthMult","arrowWidth","u","arrowTip","path","realLinkFilter","recalculateGraph","uidsToNodes","forEach","link","fakeLinks","linkIndex","splice","update","allLinks","elementKey","exit","gnodes","realNodes","collide","nx1","nx2","ny1","ny2","quad","x1","y1","x2","y2","point","visit","changeColorScheme","updateStyle","transitionRNA","newStructure","nextFunction","transitionDuration","newRNAJson","newNodes","callback","setTimeout","getBoundingBoxTransform","minX","minY","maxX","maxY","maxRadius","molWidth","molHeight","widthRatio","heightRatio","minRatio","maxNodeRadius","newMolWidth","newMolHeight","bbTransform","translate","scale","setSize","offsetWidth","offsetHeight","setOutlineColor","addCustomColors","json","addCustomColorsText","customColorsText","cs","newColorScheme","interpolate","changeColors","moleculeColors","displayNumbering","displayNodeOutline","displayNodeLabel","displayLinks","displayPseudoknotLinks","displayProteinLinks","displayAllLinks","displayDirectionArrows","referenceNode","newNodeNum","newDotbracket","newSequence","newPositions","positionOffset","newUids","pair","updateRnaGraph","nucleotidePositions","labelPositions","removeBackBoneLink","sequence1","sequence2","rnaDotBracket","dotBracket1","dotBracket2","positions1","positions2","uids1","uids2","rna1","rna2","removeLink","extraLinkIndex","addBackBoneLink","dotbracket1","dotbracket2","seq1","seq2","newSeq","toAddExternal","toDelete","newRna","basepairPossible","linkMenu","addLink","linkContextMenu","fromJSON","jsonString","ProteinGraph","addRNAJSON","newLinks","addExternalLinks","centerPos","avoidOthers","rnaGraph","totalX","totalY","nodeCount","addNodes","entry","clearNodes","externalLinks","currIdx","nodeIdxs","idx1","idx2","startAnimation","stopAnimation","stop","resume","setFriction","setCharge","setGravity","setPseudoknotStrength","pseudoknot","rnaPlot","createTransformToFillViewport","xValues","yValues","xExtent","yExtent","nucleotideRadius","rnaEdgePadding","xRange","yRange","createOtherScale","firstScale","newDomain","newRange","scaleFactor","newWidth","newMargin","linear","height","createNucleotides","selection","gs","showNucleotideLabels","struct_name","createLabels","createName","nameLabel","xyPos","namePosition","xy","textBBox","getBBox","textSize","plotSize","makeExternalLinksBundle","nodesDict","linksList","extraLinkType","results","ForceEdgeBundling","edges","compatibility_threshold","step_size","fbundling","d3line","line","edge_subpoint_data","createLinks","chart","plot","startNucleotideNumber","rnaLayout","fillViewportTransform","bundleExternalLinks","_","rnaTreemap","rnaTreemapNode","dx","dy","treemap","sticky","datum","zoom","read_in_bases","find_regions","construct_loop","find_central_loop","traverse_loop","npairs","nb1","ibase","retloop","cp","rp","rlp","maxconn","maxdepth","anchor_connection","xs","ys","xe","xn","yn","xc","yc","xo","yo","astart","aend","cpnext","acp","cpprev","ic","da","maxang","icstart","icend","icmiddle","icroot","done","done_all_connections","rooted","sign","midx","midy","nrx","nry","mx","my","vx","vy","dotmv","nmidx","nmidy","icstart1","icup","icdown","icnext","direction","dan","rr","cpx","cpy","cpnextx","cpnexty","cnx","rcn","rc","lnx","lny","rl","ac","acn","sx","sy","dcp","imaxloop","indice","atan2","set_radius","determine_radius","connected_connection","find_ic_middle","asin","construct_extruded_segment","generate_region","mindit","ci","sumn","sumd","dit","imindit","rt2_2","aend1","aend2","aave","a1","a2","dac","nstart","nend","collision","construct_circle_segment","minf2","maxf2","find_center_for_arc","h","hhi","hlow","disc","theta","iter","acos","noIterationFailureYet"],"sourceRoot":""}