UNPKG

ng-color-scale

Version:

[![npm](https://img.shields.io/npm/v/ng-color-scale.svg)](https://www.npmjs.com/package/ng-color-scale) [![npm downloads](https://img.shields.io/npm/dm/ng-color-scale.svg)](https://npmjs.org/ng-color-scale) ![publish](https://github.com/eddrichjanzzen/ng-

223 lines 27.7 kB
import { __decorate } from "tslib"; import { Component, OnChanges, Input, OnInit, ChangeDetectionStrategy, SimpleChanges, ElementRef, HostListener, ViewEncapsulation } from '@angular/core'; import * as d3 from 'd3'; var NgColorScaleComponent = /** @class */ (function () { 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