ng-color-scale
Version:
[](https://www.npmjs.com/package/ng-color-scale) [](https://npmjs.org/ng-color-scale)  {
function NgColorScaleComponent(host) {
this.host = host;
this.minVal = -1;
this.maxVal = 1;
this.hideAxis = false;
this.colorList = ["#9E0142", "#D53E4F",
"#F46D43", "#FDAE61",
"#FEE08B", "#FFFFBF",
"#E6F598", "#ABDDA4",
"#66C2A5", "#6AA84F",
"#38761D"];
this._margin = { top: 50, right: 50, bottom: 30, left: 50 };
this._textHeight = 35;
this._axisHeight = 45;
this._axisOffset = 130;
}
NgColorScaleComponent.prototype.ngOnChanges = function () {
if (this._chart) {
this._createChart();
}
};
NgColorScaleComponent.prototype.ngOnInit = function () {
this._id = 'id' + (new Date()).getTime();
if (this.data) {
this._createChart();
}
};
NgColorScaleComponent.prototype._createChart = function () {
d3.select("#" + this._id).remove();
this._width = this.host.nativeElement.clientWidth;
this._height = this.host.nativeElement.clientHeight;
this._barWidth = this._width - (this._margin.left + this._margin.right);
this._svg = d3.select(this.host.nativeElement)
.append('div')
.attr('id', "" + this._id)
.attr('transform', "translate(" + this._margin.left + ", " + this._margin.top + ")")
.style('position', 'relative')
.append("svg:svg")
.attr("width", this._width)
.attr("height", this._height);
this._chart = this._svg.append('g')
.attr('transform', "translate(" + this._margin.left + ", " + this._margin.top + ")");
this._xScale = d3.scaleLinear()
.domain([this.minVal, this.maxVal])
.range([0, this._barWidth]);
this._colors = d3.scaleLinear().domain([this.minVal, this.maxVal]).range(this.colorList);
if (!this.hideAxis) {
this._drawAxis();
}
this._drawLabels();
this._drawcolorBar();
};
NgColorScaleComponent.prototype._drawAxis = function () {
var xAxis = d3.axisBottom(this._xScale)
.tickPadding(5)
.ticks(5);
this._chart.append('g')
.attr("class", "axis")
.style("font-size", 12)
.attr('transform', "translate(0, " + (this._axisHeight + 5) + ")")
.call(xAxis);
};
NgColorScaleComponent.prototype._drawcolorBar = function () {
var tempColorList = this.colorList;
var tempId = this._id + "-grad";
var grad = this._chart.append('defs')
.append('linearGradient')
.attr('id', tempId)
.attr('x1', '0%')
.attr('x2', '100%')
.attr('y1', '0%')
.attr('y2', '0%');
grad.selectAll('stop')
.data(tempColorList)
.enter()
.append('stop')
.style('stop-color', function (d) { return d; })
.attr('offset', function (d, i) {
return 100 * (i / (tempColorList.length - 1)) + '%';
});
var gradValue = "url(#" + tempId + ")";
var tipId = this._id;
var color_bar = this._chart.append('rect')
.attr('class', 'bg-rect')
.attr('rx', 5)
.attr('ry', 5)
.style('opacity', 1)
.style('fill', gradValue)
.attr('height', 15)
.attr('width', this._barWidth)
.attr('x', 0)
.on("mouseover", function (d) {
d3.select("#" + tipId + " > div.tip").transition()
.duration(300)
.style("opacity", .9);
pickerTip.transition()
.duration(300)
.style("opacity", .9);
d3.select(this).transition()
.duration(150)
.style("opacity", .8);
})
.on("mouseout", function (d) {
d3.select("#" + tipId + " > div.tip").transition()
.duration(500)
.style("opacity", 0);
pickerTip.transition()
.duration(500)
.style("opacity", 0.7);
d3.select(this).transition()
.duration(500)
.style("opacity", 1);
});
var pickerTip = this._chart.append('rect')
.attr('class', 'picker-tip')
.attr('rx', 4)
.attr('ry', 4)
.style('fill', '#333')
.style('opacity', 0.7)
.attr('height', 25)
.attr('width', 10)
.attr('y', -5)
.attr('x', this._xScale(this.data) - 5);
d3.select("#" + this._id)
.append('div')
.attr('class', 'tip')
.style('position', 'absolute')
.style('border-radius', '10px')
.style('background-color', '#e8f2fa')
.style('padding', '10px')
.style('top', -5 + "px")
.style('opacity', 0)
.style('left', this._xScale(this.data) + 50 + "px")
.html(this.data.toFixed(2));
};
NgColorScaleComponent.prototype._drawLabels = function () {
//left label
this._chart.append('text')
.attr('x', 0)
.attr('y', this._textHeight)
.attr('text-anchor', 'middle')
.attr('font-family', 'Roboto')
.attr('font-weight', 200)
.attr('class', 'left-label')
.text(this.leftLabel);
// right label
this._chart.append('text')
.attr('x', this._barWidth)
.attr('y', this._textHeight)
.attr('text-anchor', 'middle')
.attr('font-family', 'Roboto')
.attr('class', 'right-label')
.text(this.rightLabel);
// middle label
this._chart.append('text')
.attr('x', this._barWidth / 2)
.attr('y', this._textHeight)
.attr('font-family', 'Roboto')
.attr('text-anchor', 'middle')
.attr('class', 'middle-label')
.text(this.middleLabel);
// display meta
d3.select("#" + this._id)
.append('div')
.style('position', 'absolute')
.style('font-family', 'Roboto')
.style('text-align', 'center')
.style('width', '100%')
.style('top', this._axisOffset + "px")
.html(this.displayMeta);
};
NgColorScaleComponent.prototype._onResize = function (event) {
this._createChart();
};
NgColorScaleComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
__decorate([
Input()
], NgColorScaleComponent.prototype, "data", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "leftLabel", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "rightLabel", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "middleLabel", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "minVal", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "maxVal", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "hideAxis", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "colorList", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "displayMeta", void 0);
__decorate([
HostListener('window:resize', ['$event'])
], NgColorScaleComponent.prototype, "_onResize", null);
NgColorScaleComponent = __decorate([
Component({
selector: 'ng-color-scale',
template: "",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@import url(https://fonts.googleapis.com/css?family=Roboto:400,700);:host{width:100%;height:100%;min-height:150px;max-width:1500px;display:block;font-family:Roboto}"]
})
], NgColorScaleComponent);
return NgColorScaleComponent;
}());
export { NgColorScaleComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY29sb3Itc2NhbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctY29sb3Itc2NhbGUvIiwic291cmNlcyI6WyJsaWIvbmctY29sb3Itc2NhbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hKLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBUXpCO0lBOEJFLCtCQUNVLElBQWU7UUFBZixTQUFJLEdBQUosSUFBSSxDQUFXO1FBekJoQixXQUFNLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDcEIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGNBQVMsR0FBYSxDQUFDLFNBQVMsRUFBRSxTQUFTO1lBQ2xDLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsQ0FBQyxDQUFBO1FBR3BCLFlBQU8sR0FBRyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUMsQ0FBQztRQVFyRCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFHLEdBQUcsQ0FBQztJQUlFLENBQUM7SUFFN0IsMkNBQVcsR0FBWDtRQUNFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCx3Q0FBUSxHQUFSO1FBQ0Us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QVIsS0FBSyxFQUFFOzJEQUEyQjtJQUMxQjtRQUFSLEtBQUssRUFBRTs0REFLb0I7SUFDbkI7UUFBUixLQUFLLEVBQUU7OERBQXFCO0lBOE03QjtRQURDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzswREFHekM7SUEvTlUscUJBQXFCO1FBTmpDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsWUFBOEM7WUFDOUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O1NBRWhELENBQUM7T0FDVyxxQkFBcUIsQ0FrT2pDO0lBQUQsNEJBQUM7Q0FBQSxBQWxPRCxJQWtPQztTQWxPWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uQ2hhbmdlcywgSW5wdXQsIE9uSW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIFNpbXBsZUNoYW5nZXMsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgVmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvcmUnOyAgXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWNvbG9yLXNjYWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25nLWNvbG9yLXNjYWxlLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0eWxlVXJsczogWycuL25nLWNvbG9yLXNjYWxlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmdDb2xvclNjYWxlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhIDogbnVtYmVyO1xuICBASW5wdXQoKSBsZWZ0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcmlnaHRMYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBtaWRkbGVMYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBtaW5WYWw6IG51bWJlciA9IC0xO1xuICBASW5wdXQoKSBtYXhWYWw6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIGhpZGVBeGlzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbG9yTGlzdDogc3RyaW5nW10gPSBbXCIjOUUwMTQyXCIsIFwiI0Q1M0U0RlwiLFxuICAgICAgICAgICAgICAgICAgICBcIiNGNDZENDNcIiwgXCIjRkRBRTYxXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiI0ZFRTA4QlwiLCBcIiNGRkZGQkZcIixcbiAgICAgICAgICAgICAgICAgICAgXCIjRTZGNTk4XCIsIFwiI0FCRERBNFwiLCBcbiAgICAgICAgICAgICAgICAgICAgXCIjNjZDMkE1XCIsIFwiIzZBQTg0RlwiLFxuICAgICAgICAgICAgICAgICAgICBcIiMzODc2MURcIl1cbiAgQElucHV0KCkgZGlzcGxheU1ldGE6IHN0cmluZztcblxuICBwcml2YXRlIF9tYXJnaW4gPSB7dG9wOiA1MCwgcmlnaHQ6IDUwLCBib3R0b206IDMwLCBsZWZ0OiA1MH07ICBcbiAgcHJpdmF0ZSBfc3ZnOiBhbnk7IFxuICBwcml2YXRlIF9jaGFydDogYW55O1xuICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuICBwcml2YXRlIF9oZWlnaHQ6bnVtYmVyO1xuICBwcml2YXRlIF9iYXJXaWR0aDogbnVtYmVyO1xuICBwcml2YXRlIF94U2NhbGU6IGFueTtcbiAgcHJpdmF0ZSBfY29sb3JzOiBhbnk7XG4gIHByaXZhdGUgX3RleHRIZWlnaHQgPSAzNTtcbiAgcHJpdmF0ZSBfYXhpc0hlaWdodCA9IDQ1O1xuICBwcml2YXRlIF9heGlzT2Zmc2V0ID0gMTMwO1xuICBwcml2YXRlIF9pZDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdDpFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICh0aGlzLl9jaGFydCkge1xuICAgICAgdGhpcy5fY3JlYXRlQ2hhcnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpe1xuICAgIHRoaXMuX2lkID0naWQnICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICBpZih0aGlzLmRhdGEpe1xuICAgICAgdGhpcy5fY3JlYXRlQ2hhcnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVDaGFydCgpe1xuICAgIGQzLnNlbGVjdChgIyR7dGhpcy5faWR9YCkucmVtb3ZlKCk7ICBcbiAgICBcbiAgICB0aGlzLl93aWR0aCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHRoaXMuX2hlaWdodCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB0aGlzLl9iYXJXaWR0aCA9IHRoaXMuX3dpZHRoIC0gKHRoaXMuX21hcmdpbi5sZWZ0ICsgdGhpcy5fbWFyZ2luLnJpZ2h0KVxuXG4gICAgdGhpcy5fc3ZnID0gZDMuc2VsZWN0KHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgLmF0dHIoJ2lkJywgYCR7dGhpcy5faWR9YClcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMuX21hcmdpbi5sZWZ0fSwgJHt0aGlzLl9tYXJnaW4udG9wfSlgKVxuICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAncmVsYXRpdmUnKVxuICAgICAgICAgIC5hcHBlbmQoXCJzdmc6c3ZnXCIpIFxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgdGhpcy5fd2lkdGgpXG4gICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgdGhpcy5faGVpZ2h0KVxuXG4gICAgdGhpcy5fY2hhcnQgPSB0aGlzLl9zdmcuYXBwZW5kKCdnJykgIFxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5fbWFyZ2luLmxlZnR9LCAke3RoaXMuX21hcmdpbi50b3B9KWApO1xuXG4gICAgdGhpcy5feFNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgICAgICAuZG9tYWluKFt0aGlzLm1pblZhbCwgdGhpcy5tYXhWYWxdKVxuICAgICAgICAucmFuZ2UoWzAsIHRoaXMuX2JhcldpZHRoXSlcblxuICAgIHRoaXMuX2NvbG9ycyA9IGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFt0aGlzLm1pblZhbCwgdGhpcy5tYXhWYWxdKS5yYW5nZSg8YW55W10+dGhpcy5jb2xvckxpc3QpO1xuXG4gICAgaWYoIXRoaXMuaGlkZUF4aXMpe1xuICAgICAgdGhpcy5fZHJhd0F4aXMoKVxuICAgIH1cblxuICAgIHRoaXMuX2RyYXdMYWJlbHMoKTtcbiAgICB0aGlzLl9kcmF3Y29sb3JCYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RyYXdBeGlzKCl7XG4gICAgICB2YXIgeEF4aXMgPSBkMy5heGlzQm90dG9tKHRoaXMuX3hTY2FsZSlcbiAgICAgICAgLnRpY2tQYWRkaW5nKDUpXG4gICAgICAgIC50aWNrcyg1KVxuXG4gICAgICB0aGlzLl9jaGFydC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwiYXhpc1wiKVxuICAgICAgICAuc3R5bGUoXCJmb250LXNpemVcIiwgMTIpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7dGhpcy5fYXhpc0hlaWdodCArIDV9KWApXG4gICAgICAgIC5jYWxsKHhBeGlzKVxuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd2NvbG9yQmFyKCl7XG4gICAgICBcbiAgICAgIHZhciB0ZW1wQ29sb3JMaXN0ID0gdGhpcy5jb2xvckxpc3RcbiAgICAgIHZhciB0ZW1wSWQgPSBgJHt0aGlzLl9pZH0tZ3JhZGA7XG5cbiAgICAgIHZhciBncmFkID0gdGhpcy5fY2hhcnQuYXBwZW5kKCdkZWZzJylcbiAgICAgICAgLmFwcGVuZCgnbGluZWFyR3JhZGllbnQnKVxuICAgICAgICAuYXR0cignaWQnLCB0ZW1wSWQpXG4gICAgICAgIC5hdHRyKCd4MScsICcwJScpXG4gICAgICAgIC5hdHRyKCd4MicsICcxMDAlJylcbiAgICAgICAgLmF0dHIoJ3kxJywgJzAlJylcbiAgICAgICAgLmF0dHIoJ3kyJywgJzAlJyk7XG5cbiAgICAgIGdyYWQuc2VsZWN0QWxsKCdzdG9wJylcbiAgICAgICAgLmRhdGEodGVtcENvbG9yTGlzdClcbiAgICAgICAgLmVudGVyKClcbiAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgIC5zdHlsZSgnc3RvcC1jb2xvcicsIGZ1bmN0aW9uKGQpeyByZXR1cm4gZDsgfSlcbiAgICAgICAgLmF0dHIoJ29mZnNldCcsIGZ1bmN0aW9uKGQsaSl7XG4gICAgICAgICAgcmV0dXJuIDEwMCAqIChpIC8gKHRlbXBDb2xvckxpc3QubGVuZ3RoIC0gMSkpICsgJyUnO1xuICAgICAgICB9KVxuXG4gICAgICB2YXIgZ3JhZFZhbHVlID0gYHVybCgjJHt0ZW1wSWR9KWA7XG4gICAgICB2YXIgdGlwSWQgPSB0aGlzLl9pZFxuXG4gICAgICB2YXIgY29sb3JfYmFyID0gdGhpcy5fY2hhcnQuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2JnLXJlY3QnKVxuICAgICAgICAuYXR0cigncngnLCA1KVxuICAgICAgICAuYXR0cigncnknLCA1KVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBncmFkVmFsdWUpXG4gICAgICAgIC5hdHRyKCdoZWlnaHQnLCAxNSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgdGhpcy5fYmFyV2lkdGgpXG4gICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgLm9uKFwibW91c2VvdmVyXCIsIGZ1bmN0aW9uKGQpIHsgICBcbiAgICAgICAgICBkMy5zZWxlY3QoYCMke3RpcElkfSA+IGRpdi50aXBgKS50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5kdXJhdGlvbigzMDApXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIC45KTsgICAgICBcbiAgICAgICAgICBcbiAgICAgICAgICBwaWNrZXJUaXAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24oMzAwKSAgICBcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgLjkpOyAgXG5cbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpICAgIFxuICAgICAgICAgICAgLmR1cmF0aW9uKDE1MCkgICAgXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIC44KTsgICAgICBcbiAgICAgICAgfSkgICAgICAgICAgXG4gICAgICAgIC5vbihcIm1vdXNlb3V0XCIsIGZ1bmN0aW9uKGQpIHsgICAgXG4gICAgICAgICAgZDMuc2VsZWN0KGAjJHt0aXBJZH0gPiBkaXYudGlwYCkudHJhbnNpdGlvbigpICAgIFxuICAgICAgICAgICAgICAuZHVyYXRpb24oNTAwKSAgICBcbiAgICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwKTtcblxuICAgICAgICAgIHBpY2tlclRpcC50cmFuc2l0aW9uKCkgICAgXG4gICAgICAgICAgICAgIC5kdXJhdGlvbig1MDApICAgIFxuICAgICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDAuNyk7XG5cbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpICAgIFxuICAgICAgICAgICAgLmR1cmF0aW9uKDUwMCkgICAgXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIFxuXG4gICAgICB2YXIgcGlja2VyVGlwID0gdGhpcy5fY2hhcnQuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3BpY2tlci10aXAnKVxuICAgICAgICAuYXR0cigncngnLCA0KVxuICAgICAgICAuYXR0cigncnknLCA0KVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAnIzMzMycpXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuNylcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDI1KVxuICAgICAgICAuYXR0cignd2lkdGgnLCAxMClcbiAgICAgICAgLmF0dHIoJ3knLCAtNSlcbiAgICAgICAgLmF0dHIoJ3gnLCB0aGlzLl94U2NhbGUodGhpcy5kYXRhKSAtNSlcblxuICAgICAgZDMuc2VsZWN0KGAjJHt0aGlzLl9pZH1gKVxuICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAndGlwJylcbiAgICAgICAgLnN0eWxlKCdwb3NpdGlvbicsJ2Fic29sdXRlJylcbiAgICAgICAgLnN0eWxlKCdib3JkZXItcmFkaXVzJywgJzEwcHgnKVxuICAgICAgICAuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAnI2U4ZjJmYScpXG4gICAgICAgIC5zdHlsZSgncGFkZGluZycsICcxMHB4JylcbiAgICAgICAgLnN0eWxlKCd0b3AnLCBgJHstNX1weGApXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAgIC5zdHlsZSgnbGVmdCcsIGAke3RoaXMuX3hTY2FsZSh0aGlzLmRhdGEpICs1MH1weGApXG4gICAgICAgIC5odG1sKHRoaXMuZGF0YS50b0ZpeGVkKDIpKVxuXG4gIH1cblxuXG4gIHByaXZhdGUgX2RyYXdMYWJlbHMoKXtcbiAgICAvL2xlZnQgbGFiZWxcbiAgICB0aGlzLl9jaGFydC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgLmF0dHIoJ3knLCB0aGlzLl90ZXh0SGVpZ2h0KVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuYXR0cignZm9udC1mYW1pbHknLCAnUm9ib3RvJylcbiAgICAgIC5hdHRyKCdmb250LXdlaWdodCcsIDIwMClcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsZWZ0LWxhYmVsJylcbiAgICAgIC50ZXh0KHRoaXMubGVmdExhYmVsKTtcblxuICAgIC8vIHJpZ2h0IGxhYmVsXG4gICAgdGhpcy5fY2hhcnQuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCd4JywgdGhpcy5fYmFyV2lkdGgpXG4gICAgICAuYXR0cigneScsIHRoaXMuX3RleHRIZWlnaHQpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCdmb250LWZhbWlseScsICdSb2JvdG8nKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3JpZ2h0LWxhYmVsJylcbiAgICAgIC50ZXh0KHRoaXMucmlnaHRMYWJlbCk7XG5cbiAgICAvLyBtaWRkbGUgbGFiZWxcbiAgICB0aGlzLl9jaGFydC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ3gnLHRoaXMuX2JhcldpZHRoLzIpXG4gICAgICAuYXR0cigneScsIHRoaXMuX3RleHRIZWlnaHQpXG4gICAgICAuYXR0cignZm9udC1mYW1pbHknLCAnUm9ib3RvJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ21pZGRsZS1sYWJlbCcpXG4gICAgICAudGV4dCh0aGlzLm1pZGRsZUxhYmVsKTtcblxuICAgIC8vIGRpc3BsYXkgbWV0YVxuICAgIGQzLnNlbGVjdChgIyR7dGhpcy5faWR9YClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCdmb250LWZhbWlseScsICdSb2JvdG8nKVxuICAgICAgLnN0eWxlKCd0ZXh0LWFsaWduJywgJ2NlbnRlcicpXG4gICAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKSAgICBcbiAgICAgIC5zdHlsZSgndG9wJywgYCR7dGhpcy5fYXhpc09mZnNldH1weGApXG4gICAgICAuaHRtbCh0aGlzLmRpc3BsYXlNZXRhKVxuICAgICAgXG4gICAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBwdWJsaWMgX29uUmVzaXplKGV2ZW50KSB7XG4gICAgdGhpcy5fY3JlYXRlQ2hhcnQoKTtcbiAgfVxuXG5cbn1cblxuIl19