@qogni/dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
152 lines (148 loc) • 21.8 kB
JavaScript
/**
* @license
* Copyright 2012 Dan Vanderkam (danvdk@gmail.com)
* MIT-licenced: https://opensource.org/licenses/MIT
*/
/*global Dygraph:false */
"use strict";
// TODO(danvk): move chart label options out of dygraphs and into the plugin.
// TODO(danvk): only tear down & rebuild the DIVs when it's necessary.
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var chart_labels = function chart_labels() {
this.title_div_ = null;
this.xlabel_div_ = null;
this.ylabel_div_ = null;
this.y2label_div_ = null;
};
chart_labels.prototype.toString = function () {
return "ChartLabels Plugin";
};
chart_labels.prototype.activate = function (g) {
return {
layout: this.layout,
// clearChart: this.clearChart,
didDrawChart: this.didDrawChart
};
};
// QUESTION: should there be a plugin-utils.js?
var createDivInRect = function createDivInRect(r) {
var div = document.createElement('div');
div.style.position = 'absolute';
div.style.left = r.x + 'px';
div.style.top = r.y + 'px';
div.style.width = r.w + 'px';
div.style.height = r.h + 'px';
return div;
};
// Detach and null out any existing nodes.
chart_labels.prototype.detachLabels_ = function () {
var els = [this.title_div_, this.xlabel_div_, this.ylabel_div_, this.y2label_div_];
for (var i = 0; i < els.length; i++) {
var el = els[i];
if (!el) continue;
if (el.parentNode) el.parentNode.removeChild(el);
}
this.title_div_ = null;
this.xlabel_div_ = null;
this.ylabel_div_ = null;
this.y2label_div_ = null;
};
var createRotatedDiv = function createRotatedDiv(g, box, axis, classes, html) {
// TODO(danvk): is this outer div actually necessary?
var div = document.createElement("div");
div.style.position = 'absolute';
if (axis == 1) {
// NOTE: this is cheating. Should be positioned relative to the box.
div.style.left = '0px';
} else {
div.style.left = box.x + 'px';
}
div.style.top = box.y + 'px';
div.style.width = box.w + 'px';
div.style.height = box.h + 'px';
div.style.fontSize = g.getOption('yLabelWidth') - 2 + 'px';
var inner_div = document.createElement("div");
inner_div.style.position = 'absolute';
inner_div.style.width = box.h + 'px';
inner_div.style.height = box.w + 'px';
inner_div.style.top = box.h / 2 - box.w / 2 + 'px';
inner_div.style.left = box.w / 2 - box.h / 2 + 'px';
// TODO: combine inner_div and class_div.
inner_div.className = 'dygraph-label-rotate-' + (axis == 1 ? 'right' : 'left');
var class_div = document.createElement("div");
class_div.className = classes;
class_div.innerHTML = html;
inner_div.appendChild(class_div);
div.appendChild(inner_div);
return div;
};
chart_labels.prototype.layout = function (e) {
this.detachLabels_();
var g = e.dygraph;
var div = e.chart_div;
if (g.getOption('title')) {
// QUESTION: should this return an absolutely-positioned div instead?
var title_rect = e.reserveSpaceTop(g.getOption('titleHeight'));
this.title_div_ = createDivInRect(title_rect);
this.title_div_.style.fontSize = g.getOption('titleHeight') - 8 + 'px';
var class_div = document.createElement("div");
class_div.className = 'dygraph-label dygraph-title';
class_div.innerHTML = g.getOption('title');
this.title_div_.appendChild(class_div);
div.appendChild(this.title_div_);
}
if (g.getOption('xlabel')) {
var x_rect = e.reserveSpaceBottom(g.getOption('xLabelHeight'));
this.xlabel_div_ = createDivInRect(x_rect);
this.xlabel_div_.style.fontSize = g.getOption('xLabelHeight') - 2 + 'px';
var class_div = document.createElement("div");
class_div.className = 'dygraph-label dygraph-xlabel';
class_div.innerHTML = g.getOption('xlabel');
this.xlabel_div_.appendChild(class_div);
div.appendChild(this.xlabel_div_);
}
if (g.getOption('ylabel')) {
// It would make sense to shift the chart here to make room for the y-axis
// label, but the default yAxisLabelWidth is large enough that this results
// in overly-padded charts. The y-axis label should fit fine. If it
// doesn't, the yAxisLabelWidth option can be increased.
var y_rect = e.reserveSpaceLeft(0);
this.ylabel_div_ = createRotatedDiv(g, y_rect, 1,
// primary (left) y-axis
'dygraph-label dygraph-ylabel', g.getOption('ylabel'));
div.appendChild(this.ylabel_div_);
}
if (g.getOption('y2label') && g.numAxes() == 2) {
// same logic applies here as for ylabel.
var y2_rect = e.reserveSpaceRight(0);
this.y2label_div_ = createRotatedDiv(g, y2_rect, 2,
// secondary (right) y-axis
'dygraph-label dygraph-y2label', g.getOption('y2label'));
div.appendChild(this.y2label_div_);
}
};
chart_labels.prototype.didDrawChart = function (e) {
var g = e.dygraph;
if (this.title_div_) {
this.title_div_.children[0].innerHTML = g.getOption('title');
}
if (this.xlabel_div_) {
this.xlabel_div_.children[0].innerHTML = g.getOption('xlabel');
}
if (this.ylabel_div_) {
this.ylabel_div_.children[0].children[0].innerHTML = g.getOption('ylabel');
}
if (this.y2label_div_) {
this.y2label_div_.children[0].children[0].innerHTML = g.getOption('y2label');
}
};
chart_labels.prototype.clearChart = function () {};
chart_labels.prototype.destroy = function () {
this.detachLabels_();
};
var _default = exports["default"] = chart_labels;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNoYXJ0X2xhYmVscyIsInRpdGxlX2Rpdl8iLCJ4bGFiZWxfZGl2XyIsInlsYWJlbF9kaXZfIiwieTJsYWJlbF9kaXZfIiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJhY3RpdmF0ZSIsImciLCJsYXlvdXQiLCJkaWREcmF3Q2hhcnQiLCJjcmVhdGVEaXZJblJlY3QiLCJyIiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGUiLCJwb3NpdGlvbiIsImxlZnQiLCJ4IiwidG9wIiwieSIsIndpZHRoIiwidyIsImhlaWdodCIsImgiLCJkZXRhY2hMYWJlbHNfIiwiZWxzIiwiaSIsImxlbmd0aCIsImVsIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwiY3JlYXRlUm90YXRlZERpdiIsImJveCIsImF4aXMiLCJjbGFzc2VzIiwiaHRtbCIsImZvbnRTaXplIiwiZ2V0T3B0aW9uIiwiaW5uZXJfZGl2IiwiY2xhc3NOYW1lIiwiY2xhc3NfZGl2IiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJlIiwiZHlncmFwaCIsImNoYXJ0X2RpdiIsInRpdGxlX3JlY3QiLCJyZXNlcnZlU3BhY2VUb3AiLCJ4X3JlY3QiLCJyZXNlcnZlU3BhY2VCb3R0b20iLCJ5X3JlY3QiLCJyZXNlcnZlU3BhY2VMZWZ0IiwibnVtQXhlcyIsInkyX3JlY3QiLCJyZXNlcnZlU3BhY2VSaWdodCIsImNoaWxkcmVuIiwiY2xlYXJDaGFydCIsImRlc3Ryb3kiLCJfZGVmYXVsdCIsIm1vZHVsZSIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGx1Z2lucy9jaGFydC1sYWJlbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTIgRGFuIFZhbmRlcmthbSAoZGFudmRrQGdtYWlsLmNvbSlcbiAqIE1JVC1saWNlbmNlZDogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuLypnbG9iYWwgRHlncmFwaDpmYWxzZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuLy8gVE9ETyhkYW52ayk6IG1vdmUgY2hhcnQgbGFiZWwgb3B0aW9ucyBvdXQgb2YgZHlncmFwaHMgYW5kIGludG8gdGhlIHBsdWdpbi5cbi8vIFRPRE8oZGFudmspOiBvbmx5IHRlYXIgZG93biAmIHJlYnVpbGQgdGhlIERJVnMgd2hlbiBpdCdzIG5lY2Vzc2FyeS5cblxudmFyIGNoYXJ0X2xhYmVscyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnRpdGxlX2Rpdl8gPSBudWxsO1xuICB0aGlzLnhsYWJlbF9kaXZfID0gbnVsbDtcbiAgdGhpcy55bGFiZWxfZGl2XyA9IG51bGw7XG4gIHRoaXMueTJsYWJlbF9kaXZfID0gbnVsbDtcbn07XG5cbmNoYXJ0X2xhYmVscy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFwiQ2hhcnRMYWJlbHMgUGx1Z2luXCI7XG59O1xuXG5jaGFydF9sYWJlbHMucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24oZykge1xuICByZXR1cm4ge1xuICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgLy8gY2xlYXJDaGFydDogdGhpcy5jbGVhckNoYXJ0LFxuICAgIGRpZERyYXdDaGFydDogdGhpcy5kaWREcmF3Q2hhcnRcbiAgfTtcbn07XG5cbi8vIFFVRVNUSU9OOiBzaG91bGQgdGhlcmUgYmUgYSBwbHVnaW4tdXRpbHMuanM/XG52YXIgY3JlYXRlRGl2SW5SZWN0ID0gZnVuY3Rpb24ocikge1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIGRpdi5zdHlsZS5sZWZ0ID0gci54ICsgJ3B4JztcbiAgZGl2LnN0eWxlLnRvcCA9IHIueSArICdweCc7XG4gIGRpdi5zdHlsZS53aWR0aCA9IHIudyArICdweCc7XG4gIGRpdi5zdHlsZS5oZWlnaHQgPSByLmggKyAncHgnO1xuICByZXR1cm4gZGl2O1xufTtcblxuLy8gRGV0YWNoIGFuZCBudWxsIG91dCBhbnkgZXhpc3Rpbmcgbm9kZXMuXG5jaGFydF9sYWJlbHMucHJvdG90eXBlLmRldGFjaExhYmVsc18gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGVscyA9IFsgdGhpcy50aXRsZV9kaXZfLFxuICAgICAgICAgICAgICB0aGlzLnhsYWJlbF9kaXZfLFxuICAgICAgICAgICAgICB0aGlzLnlsYWJlbF9kaXZfLFxuICAgICAgICAgICAgICB0aGlzLnkybGFiZWxfZGl2XyBdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbCA9IGVsc1tpXTtcbiAgICBpZiAoIWVsKSBjb250aW51ZTtcbiAgICBpZiAoZWwucGFyZW50Tm9kZSkgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gIH1cblxuICB0aGlzLnRpdGxlX2Rpdl8gPSBudWxsO1xuICB0aGlzLnhsYWJlbF9kaXZfID0gbnVsbDtcbiAgdGhpcy55bGFiZWxfZGl2XyA9IG51bGw7XG4gIHRoaXMueTJsYWJlbF9kaXZfID0gbnVsbDtcbn07XG5cbnZhciBjcmVhdGVSb3RhdGVkRGl2ID0gZnVuY3Rpb24oZywgYm94LCBheGlzLCBjbGFzc2VzLCBodG1sKSB7XG4gIC8vIFRPRE8oZGFudmspOiBpcyB0aGlzIG91dGVyIGRpdiBhY3R1YWxseSBuZWNlc3Nhcnk/XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBpZiAoYXhpcyA9PSAxKSB7XG4gICAgLy8gTk9URTogdGhpcyBpcyBjaGVhdGluZy4gU2hvdWxkIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8gdGhlIGJveC5cbiAgICBkaXYuc3R5bGUubGVmdCA9ICcwcHgnO1xuICB9IGVsc2Uge1xuICAgIGRpdi5zdHlsZS5sZWZ0ID0gYm94LnggKyAncHgnO1xuICB9XG4gIGRpdi5zdHlsZS50b3AgPSBib3gueSArICdweCc7XG4gIGRpdi5zdHlsZS53aWR0aCA9IGJveC53ICsgJ3B4JztcbiAgZGl2LnN0eWxlLmhlaWdodCA9IGJveC5oICsgJ3B4JztcbiAgZGl2LnN0eWxlLmZvbnRTaXplID0gKGcuZ2V0T3B0aW9uKCd5TGFiZWxXaWR0aCcpIC0gMikgKyAncHgnO1xuXG4gIHZhciBpbm5lcl9kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBpbm5lcl9kaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBpbm5lcl9kaXYuc3R5bGUud2lkdGggPSBib3guaCArICdweCc7XG4gIGlubmVyX2Rpdi5zdHlsZS5oZWlnaHQgPSBib3gudyArICdweCc7XG4gIGlubmVyX2Rpdi5zdHlsZS50b3AgPSAoYm94LmggLyAyIC0gYm94LncgLyAyKSArICdweCc7XG4gIGlubmVyX2Rpdi5zdHlsZS5sZWZ0ID0gKGJveC53IC8gMiAtIGJveC5oIC8gMikgKyAncHgnO1xuICAvLyBUT0RPOiBjb21iaW5lIGlubmVyX2RpdiBhbmQgY2xhc3NfZGl2LlxuICBpbm5lcl9kaXYuY2xhc3NOYW1lID0gJ2R5Z3JhcGgtbGFiZWwtcm90YXRlLScgKyAoYXhpcyA9PSAxID8gJ3JpZ2h0JyA6ICdsZWZ0Jyk7XG5cbiAgdmFyIGNsYXNzX2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNsYXNzX2Rpdi5jbGFzc05hbWUgPSBjbGFzc2VzO1xuICBjbGFzc19kaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICBpbm5lcl9kaXYuYXBwZW5kQ2hpbGQoY2xhc3NfZGl2KTtcbiAgZGl2LmFwcGVuZENoaWxkKGlubmVyX2Rpdik7XG4gIHJldHVybiBkaXY7XG59O1xuXG5jaGFydF9sYWJlbHMucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uKGUpIHtcbiAgdGhpcy5kZXRhY2hMYWJlbHNfKCk7XG5cbiAgdmFyIGcgPSBlLmR5Z3JhcGg7XG4gIHZhciBkaXYgPSBlLmNoYXJ0X2RpdjtcbiAgaWYgKGcuZ2V0T3B0aW9uKCd0aXRsZScpKSB7XG4gICAgLy8gUVVFU1RJT046IHNob3VsZCB0aGlzIHJldHVybiBhbiBhYnNvbHV0ZWx5LXBvc2l0aW9uZWQgZGl2IGluc3RlYWQ/XG4gICAgdmFyIHRpdGxlX3JlY3QgPSBlLnJlc2VydmVTcGFjZVRvcChnLmdldE9wdGlvbigndGl0bGVIZWlnaHQnKSk7XG4gICAgdGhpcy50aXRsZV9kaXZfID0gY3JlYXRlRGl2SW5SZWN0KHRpdGxlX3JlY3QpO1xuICAgIHRoaXMudGl0bGVfZGl2Xy5zdHlsZS5mb250U2l6ZSA9IChnLmdldE9wdGlvbigndGl0bGVIZWlnaHQnKSAtIDgpICsgJ3B4JztcblxuICAgIHZhciBjbGFzc19kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNsYXNzX2Rpdi5jbGFzc05hbWUgPSAnZHlncmFwaC1sYWJlbCBkeWdyYXBoLXRpdGxlJztcbiAgICBjbGFzc19kaXYuaW5uZXJIVE1MID0gZy5nZXRPcHRpb24oJ3RpdGxlJyk7XG4gICAgdGhpcy50aXRsZV9kaXZfLmFwcGVuZENoaWxkKGNsYXNzX2Rpdik7XG4gICAgZGl2LmFwcGVuZENoaWxkKHRoaXMudGl0bGVfZGl2Xyk7XG4gIH1cblxuICBpZiAoZy5nZXRPcHRpb24oJ3hsYWJlbCcpKSB7XG4gICAgdmFyIHhfcmVjdCA9IGUucmVzZXJ2ZVNwYWNlQm90dG9tKGcuZ2V0T3B0aW9uKCd4TGFiZWxIZWlnaHQnKSk7XG4gICAgdGhpcy54bGFiZWxfZGl2XyA9IGNyZWF0ZURpdkluUmVjdCh4X3JlY3QpO1xuICAgIHRoaXMueGxhYmVsX2Rpdl8uc3R5bGUuZm9udFNpemUgPSAoZy5nZXRPcHRpb24oJ3hMYWJlbEhlaWdodCcpIC0gMikgKyAncHgnO1xuXG4gICAgdmFyIGNsYXNzX2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY2xhc3NfZGl2LmNsYXNzTmFtZSA9ICdkeWdyYXBoLWxhYmVsIGR5Z3JhcGgteGxhYmVsJztcbiAgICBjbGFzc19kaXYuaW5uZXJIVE1MID0gZy5nZXRPcHRpb24oJ3hsYWJlbCcpO1xuICAgIHRoaXMueGxhYmVsX2Rpdl8uYXBwZW5kQ2hpbGQoY2xhc3NfZGl2KTtcbiAgICBkaXYuYXBwZW5kQ2hpbGQodGhpcy54bGFiZWxfZGl2Xyk7XG4gIH1cblxuICBpZiAoZy5nZXRPcHRpb24oJ3lsYWJlbCcpKSB7XG4gICAgLy8gSXQgd291bGQgbWFrZSBzZW5zZSB0byBzaGlmdCB0aGUgY2hhcnQgaGVyZSB0byBtYWtlIHJvb20gZm9yIHRoZSB5LWF4aXNcbiAgICAvLyBsYWJlbCwgYnV0IHRoZSBkZWZhdWx0IHlBeGlzTGFiZWxXaWR0aCBpcyBsYXJnZSBlbm91Z2ggdGhhdCB0aGlzIHJlc3VsdHNcbiAgICAvLyBpbiBvdmVybHktcGFkZGVkIGNoYXJ0cy4gVGhlIHktYXhpcyBsYWJlbCBzaG91bGQgZml0IGZpbmUuIElmIGl0XG4gICAgLy8gZG9lc24ndCwgdGhlIHlBeGlzTGFiZWxXaWR0aCBvcHRpb24gY2FuIGJlIGluY3JlYXNlZC5cbiAgICB2YXIgeV9yZWN0ID0gZS5yZXNlcnZlU3BhY2VMZWZ0KDApO1xuXG4gICAgdGhpcy55bGFiZWxfZGl2XyA9IGNyZWF0ZVJvdGF0ZWREaXYoXG4gICAgICAgIGcsIHlfcmVjdCxcbiAgICAgICAgMSwgIC8vIHByaW1hcnkgKGxlZnQpIHktYXhpc1xuICAgICAgICAnZHlncmFwaC1sYWJlbCBkeWdyYXBoLXlsYWJlbCcsXG4gICAgICAgIGcuZ2V0T3B0aW9uKCd5bGFiZWwnKSk7XG4gICAgZGl2LmFwcGVuZENoaWxkKHRoaXMueWxhYmVsX2Rpdl8pO1xuICB9XG5cbiAgaWYgKGcuZ2V0T3B0aW9uKCd5MmxhYmVsJykgJiYgZy5udW1BeGVzKCkgPT0gMikge1xuICAgIC8vIHNhbWUgbG9naWMgYXBwbGllcyBoZXJlIGFzIGZvciB5bGFiZWwuXG4gICAgdmFyIHkyX3JlY3QgPSBlLnJlc2VydmVTcGFjZVJpZ2h0KDApO1xuICAgIHRoaXMueTJsYWJlbF9kaXZfID0gY3JlYXRlUm90YXRlZERpdihcbiAgICAgICAgZywgeTJfcmVjdCxcbiAgICAgICAgMiwgIC8vIHNlY29uZGFyeSAocmlnaHQpIHktYXhpc1xuICAgICAgICAnZHlncmFwaC1sYWJlbCBkeWdyYXBoLXkybGFiZWwnLFxuICAgICAgICBnLmdldE9wdGlvbigneTJsYWJlbCcpKTtcbiAgICBkaXYuYXBwZW5kQ2hpbGQodGhpcy55MmxhYmVsX2Rpdl8pO1xuICB9XG59O1xuXG5jaGFydF9sYWJlbHMucHJvdG90eXBlLmRpZERyYXdDaGFydCA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIGcgPSBlLmR5Z3JhcGg7XG4gIGlmICh0aGlzLnRpdGxlX2Rpdl8pIHtcbiAgICB0aGlzLnRpdGxlX2Rpdl8uY2hpbGRyZW5bMF0uaW5uZXJIVE1MID0gZy5nZXRPcHRpb24oJ3RpdGxlJyk7XG4gIH1cbiAgaWYgKHRoaXMueGxhYmVsX2Rpdl8pIHtcbiAgICB0aGlzLnhsYWJlbF9kaXZfLmNoaWxkcmVuWzBdLmlubmVySFRNTCA9IGcuZ2V0T3B0aW9uKCd4bGFiZWwnKTtcbiAgfVxuICBpZiAodGhpcy55bGFiZWxfZGl2Xykge1xuICAgIHRoaXMueWxhYmVsX2Rpdl8uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uaW5uZXJIVE1MID0gZy5nZXRPcHRpb24oJ3lsYWJlbCcpO1xuICB9XG4gIGlmICh0aGlzLnkybGFiZWxfZGl2Xykge1xuICAgIHRoaXMueTJsYWJlbF9kaXZfLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmlubmVySFRNTCA9IGcuZ2V0T3B0aW9uKCd5MmxhYmVsJyk7XG4gIH1cbn07XG5cbmNoYXJ0X2xhYmVscy5wcm90b3R5cGUuY2xlYXJDaGFydCA9IGZ1bmN0aW9uKCkge1xufTtcblxuY2hhcnRfbGFiZWxzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRo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