UNPKG

drawdown-svg-render

Version:
369 lines (321 loc) 41.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); exports.tailGenerator = tailGenerator; exports.simpleRightHead = simpleRightHead; exports.simpleLeftHead = simpleLeftHead; exports.leftHead = leftHead; exports.rightHead = rightHead; function tailGenerator(style, opts) { switch (style) { case '-': case 'STRAIGHT': return straightTail; case '~': case 'CURVED': return curvedTail; case 'MESSAGE': return function (d) { return messageTail(d, opts); }; case 'LINE': return lineTail; default: throw 'Unknown link style "' + style + '"'; } } var _180OVER_PI = 180 / Math.PI; function lineTail(d) { var sl = d.source.layout; var tl = d.target.layout; d.pathMeta = { start: { x: sl.pos.x, y: sl.pos.y }, end: { x: tl.pos.x, y: tl.pos.y }, dir: 'E' }; var start = d.pathMeta.start; var end = d.pathMeta.end; var angle = Math.atan2(end.y - start.y, end.x - start.x) * _180OVER_PI; var length = Math.sqrt((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y)); d.pathMeta.length = length; d.pathMeta.transform = 'translate(' + start.x + ' ' + start.y + ') rotate(' + angle + ')'; d.textMeta = { pos: { x: start.x + length / 2, y: start.y }, baseLine: 'text-after-edge', textAnchor: 'start' }; return 'M' + 0 + ' ' + 0 + 'L' + length + ' ' + 0; } function messageTail(d, opts) { var yOffset = opts.yStart + opts.ySeparation * d.index; var sl = d.source.layout; var tl = d.target.layout; if (d.source == d.target) { d.pathMeta = { start: { x: sl.pos.x, y: yOffset - opts.ySeparation }, end: { x: sl.pos.x, y: yOffset }, dir: 'W' }; var start = d.pathMeta.start; d.textMeta = { pos: { x: start.x + opts.ySeparation * 0.8, y: start.y + opts.ySeparation / 2 }, baseLine: 'text-after-edge', textAnchor: 'start' }; return 'M' + start.x + ' ' + start.y + '\n C ' + (start.x + opts.ySeparation) + ' ' + start.y + '\n ' + (start.x + opts.ySeparation) + ' ' + (start.y + opts.ySeparation) + '\n ' + start.x + ' ' + (start.y + opts.ySeparation); } else { d.pathMeta = { start: { x: sl.pos.x, y: yOffset }, end: { x: tl.pos.x, y: yOffset }, dir: tl.pos.x > sl.pos.x ? 'E' : 'W' }; d.textMeta = { pos: { x: d.pathMeta.start.x + (d.pathMeta.end.x - d.pathMeta.start.x) / 2, y: yOffset - 5 }, baseLine: 'text-after-edge', textAnchor: 'middle' }; return 'M' + d.source.layout.pos.x + ' ' + yOffset + ' H ' + d.target.layout.pos.x; } } function straightTail(d) { var _tail = tail(d, true), _tail2 = _slicedToArray(_tail, 2), pathMeta = _tail2[0], script = _tail2[1]; d.pathMeta = pathMeta; return script; } function curvedTail(d) { var _tail3 = tail(d, false), _tail4 = _slicedToArray(_tail3, 2), pathMeta = _tail4[0], script = _tail4[1]; d.pathMeta = pathMeta; return script; } function tail(d, isStraight) { var sl = d.source.layout; var tl = d.target.layout; var dir = d.source.id == d.target.id ? 'SELF' : getApparentDir(sl, tl); var start = { x: 0, y: 0 }; var end = { x: 0, y: 0 }; var middle = 0; var script = ''; switch (true) { case ['NNE', 'SSE', 'SSW', 'NNW'].indexOf(dir) >= 0: start.x = sl.pos.x + sl.bbw / 2; start.y = sl.pos.y; end.x = tl.pos.x; end.y = tl.pos.y + tl.bbh / 2; if (['NNW', 'SSW'].indexOf(dir) >= 0) { start.x = sl.pos.x - sl.bbw / 2; } if (['SSE', 'SSW'].indexOf(dir) >= 0) { end.y = tl.pos.y - tl.bbh / 2; } if (isStraight) { script = 'M' + start.x + ' ' + start.y + ' H' + end.x + ' V' + end.y; } else { script = 'M' + start.x + ' ' + start.y + ' Q' + end.x + ' ' + start.y + ' ' + end.x + ' ' + end.y; } break; case ['ENE', 'ESE', 'WNW', 'WSW'].indexOf(dir) >= 0: start.x = sl.pos.x; start.y = sl.pos.y - sl.bbh / 2; end.x = tl.pos.x - tl.bbw / 2; end.y = tl.pos.y; if (['ESE', 'WSW'].indexOf(dir) >= 0) { start.y = sl.pos.y + sl.bbh / 2; } if (['WNW', 'WSW'].indexOf(dir) >= 0) { end.x = tl.pos.x + tl.bbw / 2; } if (isStraight) { script = 'M' + start.x + ' ' + start.y + 'V' + end.y + 'H' + end.x; } else { script = 'M' + start.x + ' ' + start.y + 'Q' + start.x + ' ' + end.y + ' ' + end.x + ' ' + end.y; } break; case ['E', 'W'].indexOf(dir) >= 0: start.x = sl.pos.x + sl.bbw / 2; start.y = sl.pos.y; end.x = tl.pos.x - tl.bbw / 2; end.y = tl.pos.y; if (dir == 'W') { start.x = sl.pos.x - sl.bbw / 2; end.x = tl.pos.x + tl.bbw / 2; } middle = start.x + (end.x - start.x) / 2; if (isStraight) { script = 'M' + start.x + ' ' + start.y + 'H' + middle + 'V' + end.y + 'H' + end.x; } else { script = 'M' + start.x + ' ' + start.y + 'C' + middle + ' ' + start.y + ' ' + middle + ' ' + end.y + ' ' + end.x + ' ' + end.y; } break; case ['N', 'S'].indexOf(dir) >= 0: start.x = sl.pos.x; start.y = sl.pos.y - sl.bbh / 2; end.x = tl.pos.x; end.y = tl.pos.y + tl.bbh / 2; if (dir == 'S') { start.y = sl.pos.y + sl.bbh / 2; end.y = tl.pos.y - tl.bbh / 2; } middle = start.y + (end.y - start.y) / 2; if (isStraight) { script = 'M' + start.x + ' ' + start.y + 'V' + middle + 'H' + end.x + 'V' + end.y; } else { script = 'M' + start.x + ' ' + start.y + 'C' + start.x + ' ' + middle + ' ' + end.x + ' ' + middle + ' ' + end.x + ' ' + end.y; } break; case 'SELF' == dir: start.x = sl.pos.x; start.y = sl.pos.y - sl.bbh / 2; end.x = sl.pos.x + sl.bbw / 2; end.y = sl.pos.y; var r = Math.sqrt(sl.bbw * sl.bbw + sl.bbh * sl.bbh) / 4; if (isStraight) { script = 'M' + start.x + ' ' + start.y + 'V' + (start.y - r) + 'H' + (end.x + r) + 'V' + end.y + 'H' + end.x; } else { script = 'M' + start.x + ' ' + start.y + 'C ' + (start.x + r) + ' ' + (start.y - 3 * r) + ' ' + (end.x + 3 * r) + ' ' + end.y + ' ' + end.x + ' ' + end.y; } break; } return [{ start: start, end: end, dir: dir }, script]; return script; } function simpleRightHead(d) { return simpleHead(d, true); } function simpleLeftHead(d) { return simpleHead(d, true); } function simpleHead(d, isRight) { if (!d.pathMeta) { return; } var w = 14; var h = 8; var bbw = d.source.layout.bbw; var length = d.pathMeta.length; if (isRight) { return 'M' + (length - bbw / 2) + ' 0l' + -w + ' ' + -h / 2 + 'v' + h + 'Z'; } else { return 'M' + bbw / 2 + ' 0l' + w + ' ' + -h / 2 + 'v' + h + 'Z'; } } function leftHead(d) { return head(d, false); } function rightHead(d) { return head(d, true); } function head(d, isRight) { if (!d.pathMeta) { return; } var end = void 0; if (isRight) { end = d.pathMeta.end; } else { end = d.pathMeta.start; } var dir = d.pathMeta.dir; var w = 14; var h = 8; var directions = void 0; if (isRight) { directions = { easts: ['ENE', 'E', 'ESE'], wests: ['WNW', 'W', 'WSW', "SELF"], norts: ['NNW', 'N', 'NNE'], souths: ['SSW', 'S', 'SSE'] }; } else { directions = { easts: ['NNW', 'W', 'SSW'], wests: ['NNE', 'E', 'SSE'], norts: ['WSW', 'S', 'ESE'], souths: ['WNW', 'N', 'ENE', "SELF"] }; } switch (true) { case directions.easts.indexOf(dir) >= 0: return 'M' + end.x + ' ' + end.y + 'L' + (end.x - w) + ' ' + (end.y - h / 2) + 'V' + (end.y + h / 2) + 'Z'; case directions.wests.indexOf(dir) >= 0: return 'M' + end.x + ' ' + end.y + 'L' + (end.x + w) + ' ' + (end.y - h / 2) + 'V' + (end.y + h / 2) + 'Z'; case directions.norts.indexOf(dir) >= 0: return 'M' + end.x + ' ' + end.y + 'L' + (end.x - h / 2) + ' ' + (end.y + w) + 'H' + (end.x + h / 2) + 'Z'; case directions.souths.indexOf(dir) >= 0: return 'M' + end.x + ' ' + end.y + 'L' + (end.x - h / 2) + ' ' + (end.y - w) + 'H' + (end.x + h / 2) + 'Z'; } } function getApparentDir(sl, tl) { var vDir = 'SAME'; var hDir = 'SAME'; var dir = '?'; if (tl.pos.y + tl.bbh / 2 < sl.pos.y - sl.bbh / 2) { vDir = 'TOP'; } else if (tl.pos.y - tl.bbh / 2 > sl.pos.y + sl.bbh / 2) { vDir = 'BOTTOM'; } if (tl.pos.x + tl.bbw / 2 < sl.pos.x - sl.bbw / 2) { hDir = 'LEFT'; } else if (sl.pos.x + sl.bbw / 2 < tl.pos.x - tl.bbw / 2) { hDir = 'RIGHT'; } switch (true) { case hDir == 'SAME' && vDir == 'TOP': dir = 'N'; break; case hDir == 'SAME' && vDir == 'BOTTOM': dir = 'S'; break; case hDir == 'RIGHT' && vDir == 'SAME': dir = 'E'; break; case hDir == 'LEFT' && vDir == 'SAME': dir = 'W'; break; case hDir == 'RIGHT' && vDir == 'TOP': dir = 'NE'; if (tl.pos.x - tl.bbw / 2 - sl.pos.x - sl.bbw / 2 > sl.pos.y - sl.bbh / 2 - tl.pos.y - tl.bbh / 2) { dir = 'ENE'; } else { dir = 'NNE'; } break; case hDir == 'RIGHT' && vDir == 'BOTTOM': dir = 'SE'; if (tl.pos.x - tl.bbw / 2 - sl.pos.x - sl.bbw / 2 > tl.pos.y - tl.bbh / 2 - sl.pos.y - sl.bbh / 2) { dir = 'ESE'; } else { dir = 'SSE'; } break; case hDir == 'LEFT' && vDir == 'TOP': dir = 'NW'; if (sl.pos.x - sl.bbw / 2 - tl.pos.x - tl.bbw / 2 > sl.pos.y - sl.bbh / 2 - tl.pos.y - tl.bbh / 2) { dir = 'WNW'; } else { dir = 'NNW'; } break; case hDir == 'LEFT' && vDir == 'BOTTOM': dir = 'SW'; if (sl.pos.x - sl.bbw / 2 - tl.pos.x - tl.bbw / 2 > tl.pos.y - tl.bbh / 2 - sl.pos.y - sl.bbh / 2) { dir = 'WSW'; } else { dir = 'SSW'; } break; } return dir; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oZWxwZXJzL2xpbmsuanMiXSwibmFtZXMiOlsidGFpbEdlbmVyYXRvciIsInNpbXBsZVJpZ2h0SGVhZCIsInNpbXBsZUxlZnRIZWFkIiwibGVmdEhlYWQiLCJyaWdodEhlYWQiLCJzdHlsZSIsIm9wdHMiLCJzdHJhaWdodFRhaWwiLCJjdXJ2ZWRUYWlsIiwiZCIsIm1lc3NhZ2VUYWlsIiwibGluZVRhaWwiLCJfMTgwT1ZFUl9QSSIsIk1hdGgiLCJQSSIsInNsIiwic291cmNlIiwibGF5b3V0IiwidGwiLCJ0YXJnZXQiLCJwYXRoTWV0YSIsInN0YXJ0IiwieCIsInBvcyIsInkiLCJlbmQiLCJkaXIiLCJhbmdsZSIsImF0YW4yIiwibGVuZ3RoIiwic3FydCIsInRyYW5zZm9ybSIsInRleHRNZXRhIiwiYmFzZUxpbmUiLCJ0ZXh0QW5jaG9yIiwieU9mZnNldCIsInlTdGFydCIsInlTZXBhcmF0aW9uIiwiaW5kZXgiLCJ0YWlsIiwic2NyaXB0IiwiaXNTdHJhaWdodCIsImlkIiwiZ2V0QXBwYXJlbnREaXIiLCJtaWRkbGUiLCJpbmRleE9mIiwiYmJ3IiwiYmJoIiwiciIsInNpbXBsZUhlYWQiLCJpc1JpZ2h0IiwidyIsImgiLCJoZWFkIiwiZGlyZWN0aW9ucyIsImVhc3RzIiwid2VzdHMiLCJub3J0cyIsInNvdXRocyIsInZEaXIiLCJoRGlyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztRQUVnQkEsYSxHQUFBQSxhO1FBa05DQyxlLEdBQUFBLGU7UUFHQUMsYyxHQUFBQSxjO1FBcUJEQyxRLEdBQUFBLFE7UUFHQUMsUyxHQUFBQSxTO0FBN09ULFNBQVNKLGFBQVQsQ0FBdUJLLEtBQXZCLEVBQThCQyxJQUE5QixFQUFvQztBQUN6QyxVQUFTRCxLQUFUOztBQUVFLFNBQUssR0FBTDtBQUNBLFNBQUssVUFBTDtBQUFpQixhQUFPRSxZQUFQOztBQUVqQixTQUFLLEdBQUw7QUFDQSxTQUFLLFFBQUw7QUFBZSxhQUFPQyxVQUFQOztBQUVmLFNBQUssU0FB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QUdLLEdBQUgsQ0FBT0QsQ0FBN0IsR0FBaUNKLEdBQUc0QixHQUFILEdBQU8sQ0FBeEMsR0FBNEM1QixHQUFHSyxHQUFILENBQU9DLENBQVAsR0FBV04sR0FBRzZCLEdBQUgsR0FBTyxDQUFsQixHQUFzQmhDLEdBQUdRLEdBQUgsQ0FBT0MsQ0FBN0IsR0FBaUNULEdBQUdnQyxHQUFILEdBQU8sQ0FBeEYsRUFBMkY7QUFDekZyQixjQUFNLEtBQU47QUFDRCxPQUZELE1BRU87QUFDTEEsY0FBTSxLQUFOO0FBQ0Q7QUFDRDtBQTVDSjtBQThDQSxTQUFPQSxHQUFQO0FBRUQiLCJmaWxlIjoibGluay5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuXG5leHBvcnQgZnVuY3Rpb24gdGFpbEdlbmVyYXRvcihzdHlsZSwgb3B0cykge1xuICBzd2l0Y2ggKCBzdHlsZSApIHtcblxuICAgIGNhc2UgJy0nOlxuICAgIGNhc2UgJ1NUUkFJR0hUJzogcmV0dXJuIHN0cmFpZ2h0VGFpbDtcblxuICAgIGNhc2UgJ34nOlxuICAgIGNhc2UgJ0NVUlZFRCc6IHJldHVybiBjdXJ2ZWRUYWlsO1xuXG4gICAgY2FzZSAnTUVTU0FHRSc6IHJldHVybiAoZCkgPT4gbWVzc2FnZVRhaWwoZCwgb3B0cyk7XG5cbiAgICBjYXNlICdMSU5FJzogcmV0dXJuIGxpbmVUYWlsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGBVbmtub3duIGxpbmsgc3R5bGUgXCIke3N0eWxlfVwiYDtcbiAgfVxufVxuXG5jb25zdCBfMTgwT1ZFUl9QSSA9IDE4MCAvIE1hdGguUEk7XG5cbmZ1bmN0aW9uIGxpbmVUYWlsKGQpIHtcbiAgY29uc3Qgc2wgPSBkLnNvdXJjZS5sYXlvdXQ7XG4gIGNvbnN0IHRsID0gZC50YXJnZXQubGF5b3V0XG5cbiAgZC5wYXRoTWV0YSA9IHtcbiAgICBzdGFydDoge3g6IHNsLnBvcy54LCB5OiBzbC5wb3MueX0sXG4gICAgZW5kOiB7eDogdGwucG9zLngsIHk6IHRsLnBvcy55fSxcbiAgICBkaXI6ICdFJyxcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gZC5wYXRoTWV0YS5zdGFydDtcbiAgY29uc3QgZW5kID0gZC5wYXRoTWV0YS5lbmQ7XG4gIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihlbmQueSAtIHN0YXJ0LnksIGVuZC54IC0gc3RhcnQueCkqXzE4ME9WRVJfUEk7XG4gIGNvbnN0IGxlbmd0aCA9IE1hdGguc3FydCgoZW5kLnggLSBzdGFydC54KSooZW5kLnggLSBzdGFydC54KSArIChlbmQueSAtIHN0YXJ0LnkpKihlbmQueSAtIHN0YXJ0LnkpKTtcblxuICBkLnBhdGhNZXRhLmxlbmd0aCA9IGxlbmd0aDtcblxuICBkLnBhdGhNZXRhLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtzdGFydC54fSAke3N0YXJ0Lnl9KSByb3RhdGUoJHthbmdsZX0pYDtcblxuICBkLnRleHRNZXRhID0ge1xuICAgIHBvczoge3g6IHN0YXJ0LnggKyBsZW5ndGgvMiAsIHk6IHN0YXJ0Lnl9LFxuICAgIGJhc2VMaW5lOiAndGV4dC1hZnRlci1lZGdlJyxcbiAgICB0ZXh0QW5jaG9yOiAnc3RhcnQnXG5cbiAgfVxuICByZXR1cm4gYE0kezB9ICR7MH1MJHtsZW5ndGh9ICR7MH1gO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlVGFpbChkLCBvcHRzKSB7XG4gIGxldCB5T2Zmc2V0ID0gb3B0cy55U3RhcnQrIG9wdHMueVNlcGFyYXRpb24gKiBkLmluZGV4XG4gIGxldCBzbCA9IGQuc291cmNlLmxheW91dDtcbiAgbGV0IHRsID0gZC50YXJnZXQubGF5b3V0XG5cblxuICBpZiAoZC5zb3VyY2UgPT0gZC50YXJnZXQpIHtcblxuICAgIGQucGF0aE1ldGEgPSB7XG4gICAgICBzdGFydDoge3g6IHNsLnBvcy54LCB5OiB5T2Zmc2V0IC0gb3B0cy55U2VwYXJhdGlvbn0sXG4gICAgICBlbmQ6IHt4OiBzbC5wb3MueCwgeTogeU9mZnNldH0sXG4gICAgICBkaXI6ICdXJ1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBkLnBhdGhNZXRhLnN0YXJ0O1xuXG4gICAgZC50ZXh0TWV0YSA9IHtcbiAgICAgIHBvczoge3g6IHN0YXJ0LnggKyBvcHRzLnlTZXBhcmF0aW9uKjAuOCwgeTogc3RhcnQueSArIG9wdHMueVNlcGFyYXRpb24vMn0sXG4gICAgICBiYXNlTGluZTogJ3RleHQtYWZ0ZXItZWRnZScsXG4gICAgICB0ZXh0QW5jaG9yOiAnc3RhcnQnXG5cbiAgICB9XG4gICAgcmV0dXJuIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9XG4gICAgICAgICAgQyAke3N0YXJ0LnggKyBvcHRzLnlTZXBhcmF0aW9ufSAke3N0YXJ0Lnl9XG4gICAgICAgICAgICAke3N0YXJ0LnggKyBvcHRzLnlTZXBhcmF0aW9ufSAke3N0YXJ0LnkgKyBvcHRzLnlTZXBhcmF0aW9ufVxuICAgICAgICAgICAgJHtzdGFydC54fSAke3N0YXJ0LnkgKyBvcHRzLnlTZXBhcmF0aW9ufWBcblxuICB9IGVsc2Uge1xuXG4gICAgZC5wYXRoTWV0YSA9IHtcbiAgICAgIHN0YXJ0OiB7eDogc2wucG9zLngsIHk6IHlPZmZzZXR9LFxuICAgICAgZW5kOiB7eDogdGwucG9zLngsIHk6IHlPZmZzZXR9LFxuICAgICAgZGlyOiB0bC5wb3MueCA+IHNsLnBvcy54ID8gJ0UnOiAnVydcbiAgICB9XG5cbiAgICBkLnRleHRNZXRhID0ge1xuICAgICAgcG9zOiB7eDogZC5wYXRoTWV0YS5zdGFydC54ICsgKGQucGF0aE1ldGEuZW5kLnggLSBkLnBhdGhNZXRhLnN0YXJ0LngpIC8gMiwgeTogeU9mZnNldCAtIDUgfSxcbiAgICAgIGJhc2VMaW5lOiAndGV4dC1hZnRlci1lZGdlJyxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnXG4gICAgfVxuICAgIHJldHVybiBgTSR7ZC5zb3VyY2UubGF5b3V0LnBvcy54fSAke3lPZmZzZXR9IEggJHtkLnRhcmdldC5sYXlvdXQucG9zLnh9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJhaWdodFRhaWwoZCkge1xuICBjb25zdCBbcGF0aE1ldGEsIHNjcmlwdF0gPSAgdGFpbChkLCB0cnVlKTtcbiAgZC5wYXRoTWV0YSA9IHBhdGhNZXRhO1xuICByZXR1cm4gc2NyaXB0O1xufVxuXG5mdW5jdGlvbiBjdXJ2ZWRUYWlsKGQpIHtcbiAgY29uc3QgW3BhdGhNZXRhLCBzY3JpcHRdID0gIHRhaWwoZCwgZmFsc2UpO1xuICBkLnBhdGhNZXRhID0gcGF0aE1ldGE7XG4gIHJldHVybiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIHRhaWwoZCwgaXNTdHJhaWdodCkge1xuXG4gIGxldCBzbCA9IGQuc291cmNlLmxheW91dDtcbiAgbGV0IHRsID0gZC50YXJnZXQubGF5b3V0O1xuXG5cbiAgbGV0IGRpciA9IGQuc291cmNlLmlkID09IGQudGFyZ2V0LmlkID8gJ1NFTEYnIDogZ2V0QXBwYXJlbnREaXIoc2wsIHRsKTtcblxuICBsZXQgc3RhcnQgPSAge3g6IDAsIHk6MH07XG4gIGxldCBlbmQgPSAge3g6IDAsIHk6MH07XG4gIGxldCBtaWRkbGUgPSAwO1xuICBsZXQgc2NyaXB0ID0gJyc7XG5cbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSBbJ05ORScsICdTU0UnLCAnU1NXJywgJ05OVyddLmluZGV4T2YoZGlyKSA+PSAwOlxuICAgICAgc3RhcnQueCA9IHNsLnBvcy54ICsgc2wuYmJ3LzI7XG4gICAgICBzdGFydC55ID0gc2wucG9zLnk7XG4gICAgICBlbmQueCA9IHRsLnBvcy54O1xuICAgICAgZW5kLnkgPSB0bC5wb3MueSArIHRsLmJiaC8yO1xuICAgICAgaWYgKFsnTk5XJywgJ1NTVyddLmluZGV4T2YoZGlyKSA+PSAwKSB7XG4gICAgICAgIHN0YXJ0LnggPSBzbC5wb3MueCAtIHNsLmJidy8yO1xuICAgICAgfVxuICAgICAgaWYgKFsnU1NFJywgJ1NTVyddLmluZGV4T2YoZGlyKSA+PSAwKSB7XG4gICAgICAgIGVuZC55ID0gdGwucG9zLnkgLSB0bC5iYmgvMjtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0cmFpZ2h0KSB7XG4gICAgICAgIHNjcmlwdCA9ICBgTSR7c3RhcnQueH0gJHtzdGFydC55fSBIJHtlbmQueH0gViR7ZW5kLnl9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjcmlwdCA9ICBgTSR7c3RhcnQueH0gJHtzdGFydC55fSBRJHtlbmQueH0gJHtzdGFydC55fSAke2VuZC54fSAke2VuZC55fWA7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIChbJ0VORScsICdFU0UnLCAnV05XJywgJ1dTVyddLmluZGV4T2YoZGlyKSA+PSAwKTpcbiAgICAgIHN0YXJ0LnggPSBzbC5wb3MueDtcbiAgICAgIHN0YXJ0LnkgPSBzbC5wb3MueSAtIHNsLmJiaC8yO1xuICAgICAgZW5kLnggPSB0bC5wb3MueCAtIHRsLmJidy8yO1xuICAgICAgZW5kLnkgPSB0bC5wb3MueTtcbiAgICAgIGlmIChbJ0VTRScsICdXU1cnXS5pbmRleE9mKGRpcikgPj0gMCkge1xuICAgICAgICBzdGFydC55ID0gc2wucG9zLnkgKyBzbC5iYmgvMjtcbiAgICAgIH1cbiAgICAgIGlmIChbJ1dOVycsICdXU1cnXS5pbmRleE9mKGRpcikgPj0gMCkge1xuICAgICAgICBlbmQueCA9IHRsLnBvcy54ICsgdGwuYmJ3LzI7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJhaWdodCkge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1WJHtlbmQueX1IJHtlbmQueH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NyaXB0ID0gIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9USR7c3RhcnQueH0gJHtlbmQueX0gJHtlbmQueH0gJHtlbmQueX1gO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFsnRScsICdXJ10uaW5kZXhPZihkaXIpID49IDA6XG4gICAgICBzdGFydC54ID0gc2wucG9zLnggKyBzbC5iYncvMjtcbiAgICAgIHN0YXJ0LnkgPSBzbC5wb3MueTtcbiAgICAgIGVuZC54ID0gdGwucG9zLnggLSB0bC5iYncvMjtcbiAgICAgIGVuZC55ID0gdGwucG9zLnk7XG4gICAgICBpZiAoZGlyID09ICdXJykge1xuICAgICAgICBzdGFydC54ID0gc2wucG9zLnggLSBzbC5iYncvMjtcbiAgICAgICAgZW5kLnggPSB0bC5wb3MueCArIHRsLmJidy8yO1xuICAgICAgfVxuICAgICAgbWlkZGxlID0gc3RhcnQueCArIChlbmQueCAtIHN0YXJ0LngpLzI7XG4gICAgICBpZiAoaXNTdHJhaWdodCkge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1IJHttaWRkbGV9ViR7ZW5kLnl9SCR7ZW5kLnh9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjcmlwdCA9ICBgTSR7c3RhcnQueH0gJHtzdGFydC55fUMke21pZGRsZX0gJHtzdGFydC55fSAke21pZGRsZX0gJHtlbmQueX0gJHtlbmQueH0gJHtlbmQueX1gO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBbJ04nLCAnUyddLmluZGV4T2YoZGlyKSA+PSAwOlxuICAgICAgc3RhcnQueCA9IHNsLnBvcy54O1xuICAgICAgc3RhcnQueSA9IHNsLnBvcy55IC0gc2wuYmJoLzI7XG4gICAgICBlbmQueCA9IHRsLnBvcy54O1xuICAgICAgZW5kLnkgPSB0bC5wb3MueSArIHRsLmJiaC8yO1xuICAgICAgaWYgKGRpciA9PSAnUycpIHtcbiAgICAgICAgc3RhcnQueSA9IHNsLnBvcy55ICsgc2wuYmJoLzI7XG4gICAgICAgIGVuZC55ID0gdGwucG9zLnkgLSB0bC5iYmgvMjtcbiAgICAgIH1cbiAgICAgIG1pZGRsZSA9IHN0YXJ0LnkgKyAoZW5kLnkgLSBzdGFydC55KS8yO1xuICAgICAgaWYgKGlzU3RyYWlnaHQpIHtcbiAgICAgICAgc2NyaXB0ID0gIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9ViR7bWlkZGxlfUgke2VuZC54fVYke2VuZC55fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1DJHtzdGFydC54fSAke21pZGRsZX0gJHtlbmQueH0gJHttaWRkbGV9ICR7ZW5kLnh9ICR7ZW5kLnl9YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NFTEYnID09IGRpcjpcbiAgICAgIHN0YXJ0LnggPSBzbC5wb3MueDtcbiAgICAgIHN0YXJ0LnkgPSBzbC5wb3MueSAtIHNsLmJiaC8yO1xuICAgICAgZW5kLnggPSBzbC5wb3MueCArIHNsLmJidy8yO1xuICAgICAgZW5kLnkgPSBzbC5wb3MueTtcbiAgICAgIGxldCByID0gTWF0aC5zcXJ0KHNsLmJidypzbC5iYncgKyBzbC5iYmgqc2wuYmJoKS80O1xuICAgICAgaWYgKGlzU3RyYWlnaHQpIHtcbiAgICAgICAgc2NyaXB0ID0gIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9ViR7c3RhcnQueSAtIHJ9SCR7ZW5kLnggKyByfVYke2VuZC55fUgke2VuZC54fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1DICR7c3RhcnQueCtyfSAke3N0YXJ0LnktMypyfSAke2VuZC54ICsgMypyfSAke2VuZC55fSAke2VuZC54fSAke2VuZC55fWA7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBzdGFydDogc3RhcnQsXG4gICAgICBlbmQ6IGVuZCxcbiAgICAgIGRpcjogZGlyXG4gICAgfSxcbiAgICBzY3JpcHRcbiAgXVxuICByZXR1cm4gc2NyaXB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gIHNpbXBsZVJpZ2h0SGVhZChkKSB7XG4gIHJldHVybiBzaW1wbGVIZWFkKGQsIHRydWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uICBzaW1wbGVMZWZ0SGVhZChkKSB7XG4gIHJldHVybiBzaW1wbGVIZWFkKGQsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVIZWFkKGQsIGlzUmlnaHQpIHtcblxuICBpZiAoIWQucGF0aE1ldGEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdyA9IDE0O1xuICBjb25zdCBoID0gODtcbiAgY29uc3QgYmJ3ID0gZC5zb3VyY2UubGF5b3V0LmJidztcbiAgY29uc3QgbGVuZ3RoID0gZC5wYXRoTWV0YS5sZW5ndGg7XG4gIGlmIChpc1JpZ2h0KSB7XG4gICAgcmV0dXJuIGBNJHtsZW5ndGgtYmJ3LzJ9IDBsJHstd30gJHstaC8yfXYke2h9WmA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBNJHtiYncvMn0gMGwke3d9ICR7LWgvMn12JHtofVpgO1xuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGxlZnRIZWFkKGQpIHtcbiAgcmV0dXJuIGhlYWQoZCwgZmFsc2UpXG59XG5leHBvcnQgZnVuY3Rpb24gcmlnaHRIZWFkKGQpIHtcbiAgcmV0dXJuIGhlYWQoZCwgdHJ1ZSlcbn1cbmZ1bmN0aW9uIGhlYWQoZCwgaXNSaWdodCkge1xuICBpZiAoIWQucGF0aE1ldGEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGVuZDtcbiAgaWYgKGlzUmlnaHQpIHtcbiAgICBlbmQgPSBkLnBhdGhNZXRhLmVuZDtcbiAgfSBlbHNlIHtcbiAgICBlbmQgPSBkLnBhdGhNZXRhLnN0YXJ0O1xuICB9XG5cbiAgY29uc3QgZGlyID0gZC5wYXRoTWV0YS5kaXI7XG4gIGNvbnN0IHcgPSAxNDtcbiAgY29uc3QgaCA9IDg7XG5cbiAgbGV0IGRpcmVjdGlvbnM7XG4gIGlmIChpc1JpZ2h0KSB7XG4gICAgZGlyZWN0aW9ucyA9IHtcbiAgICAgIGVhc3RzOiBbJ0VORScsICdFJywgJ0VTRSddLFxuICAgICAgd2VzdHM6IFsnV05XJywgJ1cnLCAnV1NXJywgXCJTRUxGXCJdLFxuICAgICAgbm9ydHM6IFsnTk5XJywgJ04nLCAnTk5FJ10sXG4gICAgICBzb3V0aHM6IFsnU1NXJywgJ1MnLCAnU1NFJ11cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9ucyA9IHtcbiAgICAgIGVhc3RzOiBbJ05OVycsICdXJywgJ1NTVyddLFxuICAgICAgd2VzdHM6IFsnTk5FJywgJ0UnLCAnU1NFJ10sXG4gICAgICBub3J0czogWydXU1cnLCAnUycsICdFU0UnXSxcbiAgICAgIHNvdXRoczogWydXTlcnLCAnTicsICdFTkUnLCBcIlNFTEZcIl1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIGRpcmVjdGlvbnMuZWFzdHMuaW5kZXhPZihkaXIpID49IDA6XG4gICAgICByZXR1cm4gYE0ke2VuZC54fSAke2VuZC55fUwke2VuZC54IC0gd30gJHtlbmQueSAtIGgvMn1WJHtlbmQueSArIGgvMn1aYDtcbiAgICBjYXNlIGRpcmVjdGlvbnMud2VzdHMuaW5kZXhPZihkaXIpID49IDA6XG4gICAgICByZXR1cm4gYE0ke2VuZC54fSAke2VuZC55fUwke2VuZC54ICsgd30gJHtlbmQueSAtIGgvMn1WJHtlbmQueSArIGgvMn1aYDtcbiAgICBjYXNlIGRpcmVjdGlvbnMubm9ydHMuaW5kZXhPZihkaXIpID49IDA6XG4gICAgICByZXR1cm4gYE0ke2VuZC54fSAke2VuZC55fUwke2VuZC54IC0gaC8yfSAke2VuZC55ICsgd31IJHtlbmQueCArIGgvMn1aYDtcbiAgICBjYXNlIGRpcmVjdGlvbnMuc291dGhzLmluZGV4T2YoZGlyKSA+PSAwOlxuICAgICAgcmV0dXJuIGBNJHtlbmQueH0gJHtlbmQueX1MJHtlbmQueCAtIGgvMn0gJHtlbmQueSAtIHd9SCR7ZW5kLnggKyBoLzJ9WmA7XG5cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBcHBhcmVudERpcihzbCwgdGwpIHtcblxuXG4gIGxldCB2RGlyID0gJ1NBTUUnO1xuICBsZXQgaERpciA9ICdTQU1FJztcbiAgbGV0IGRpciA9ICc/JztcblxuICBpZiAodGwucG9zLnkgKyB0bC5iYmgvMiA8IHNsLnBvcy55IC0gc2wuYmJoLzIgKSB7XG4gICAgdkRpciA9ICdUT1AnO1xuICB9IGVsc2UgaWYgKHRsLnBvcy55IC0gdGwuYmJoLzIgPiBzbC5wb3MueSArIHNsLmJiaC8yKSB7XG4gICAgdkRpciA9ICdCT1RUT00nO1xuICB9XG5cbiAgaWYgKHRsLnBvcy54ICsgdGwuYmJ3IC8yICA8IHNsLnBvcy54IC0gc2wuYmJ3LzIpIHtcbiAgICBoRGlyID0gJ0xFRlQnXG4gIH0gZWxzZSBpZiAoc2wucG9zLnggKyBzbC5iYncvMiA8IHRsLnBvcy54IC0gdGwuYmJ3LzIpIHtcbiAgICBoRGlyID0gJ1JJR0hUJ1xuICB9XG5cbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSBoRGlyID09ICdTQU1FJyAmJiB2RGlyID09ICdUT1AnOlxuICAgICAgZGlyID0gJ04nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBoRGlyID09ICdTQU1FJyAmJiB2RGlyID09ICdCT1RUT00nOlxuICAgICAgZGlyID0gJ1MnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBoRGlyID09ICdSSUdIVCcgJiYgdkRpciA9PSAnU0FNRSc6XG4gICAgICBkaXIgPSAnRSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGhEaXIgPT0gJ0xFRlQnICYmIHZEaXIgPT0gJ1NBTUUnOlxuICAgICAgZGlyID0gJ1cnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBoRGlyID09ICdSSUdIVCcgJiYgdkRpciA9PSAnVE9QJzpcbiAgICAgIGRpciA9ICdORSc7XG4gICAgICBpZiAodGwucG9zLnggLSB0bC5iYncvMiAtIHNsLnBvcy54IC0gc2wuYmJ3LzIgPiBzbC5wb3MueSAtIHNsLmJiaC8yIC0gdGwucG9zLnkgLSB0bC5iYmgvMikge1xuICAgICAgICBkaXIgPSAnRU5FJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gJ05ORSdcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgaERpciA9PSAnUklHSFQnICYmIHZEaXIgPT0gJ0JPVFRPTSc6XG4gICAgICBkaXIgPSAnU0UnO1xuICAgICAgaWYgKHRsLnBvcy54IC0gdGwuYmJ3LzItIHNsLnBvcy54IC0gc2wuYmJ3LzIgPiB0bC5wb3MueSAtIHRsLmJiaCAvMiAtIHNsLnBvcy55IC0gc2wuYmJoLzIpIHtcbiAgICAgICAgZGlyID0gJ0VTRSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpciA9ICdTU0UnXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIGhEaXIgPT0gJ0xFRlQnICYmIHZEaXIgPT0gJ1RPUCc6XG4gICAgICBkaXIgPSAnTlcnO1xuICAgICAgaWYgKHNsLnBvcy54IC0gc2wuYmJ3LzIgLSB0bC5wb3MueCAtIHRsLmJidy8yID4gc2wucG9zLnkgLSBzbC5iYmgvMi0gdGwucG9zLnkgLSB0bC5iYmgvMikge1xuICAgICAgICBkaXIgPSAnV05XJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gJ05OVydcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgaERpciA9PSAnTEVGVCcgJiYgdkRpciA9PSAnQk9UVE9NJzpcbiAgICAgIGRpciA9ICdTVyc7XG4gICAgICBpZiAoc2wucG9zLnggLSBzbC5iYncvMiAtIHRsLnBvcy54IC0gdGwuYmJ3LzIgPiB0bC5wb3MueSAtIHRsLmJiaC8yIC0gc2wucG9zLnkgLSBzbC5iYmgvMikge1xuICAgICAgICBkaXIgPSAnV1NXJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gJ1NTVydcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBkaXI7XG5cbn1cbiJdfQ==