UNPKG

react-native-chart-kit

Version:

If you're looking to **build a website or a cross-platform mobile app** – we will be happy to help you! Send a note to clients@ui1.io and we will be in touch with you shortly.

309 lines 43.9 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import React from "react"; import { View } from "react-native"; import { G, Rect, Svg, Text } from "react-native-svg"; import AbstractChart from "../AbstractChart"; import { mapValue } from "../Utils"; import { convertToDate, getBeginningTimeForDate, shiftDate } from "./DateHelpers"; import { DAYS_IN_WEEK, MILLISECONDS_IN_ONE_DAY, MONTH_LABELS } from "./constants"; var SQUARE_SIZE = 20; var MONTH_LABEL_GUTTER_SIZE = 8; var paddingLeft = 32; var range = function (count) { return Array.from({ length: count }, function (_, i) { return i; }); }; var ContributionGraph = /** @class */ (function (_super) { __extends(ContributionGraph, _super); function ContributionGraph(props) { var _this = _super.call(this, props) || this; var _a = _this.getValueCache(props.values), maxValue = _a.maxValue, minValue = _a.minValue, valueCache = _a.valueCache; _this.state = { maxValue: maxValue, minValue: minValue, valueCache: valueCache }; return _this; } ContributionGraph.prototype.componentDidUpdate = function (prevProps) { var shouldUpdateValueCache = prevProps.values !== this.props.values || prevProps.endDate !== this.props.endDate || prevProps.numDays !== this.props.numDays || prevProps.accessor !== this.props.accessor || prevProps.titleForValue !== this.props.titleForValue || prevProps.tooltipDataAttrs !== this.props.tooltipDataAttrs; if (!shouldUpdateValueCache) { return; } var _a = this.getValueCache(this.props.values), maxValue = _a.maxValue, minValue = _a.minValue, valueCache = _a.valueCache; this.setState({ maxValue: maxValue, minValue: minValue, valueCache: valueCache }); }; ContributionGraph.prototype.getSquareSizeWithGutter = function () { return (this.props.squareSize || SQUARE_SIZE) + this.props.gutterSize; }; ContributionGraph.prototype.getMonthLabelSize = function () { var _a = this.props.squareSize, squareSize = _a === void 0 ? SQUARE_SIZE : _a; if (!this.props.showMonthLabels) { return 0; } if (this.props.horizontal) { return squareSize + MONTH_LABEL_GUTTER_SIZE; } return 2 * (squareSize + MONTH_LABEL_GUTTER_SIZE); }; ContributionGraph.prototype.getStartDate = function () { return shiftDate(this.getEndDate(), -this.props.numDays + 1); // +1 because endDate is inclusive }; ContributionGraph.prototype.getEndDate = function () { return getBeginningTimeForDate(convertToDate(this.props.endDate)); }; ContributionGraph.prototype.getStartDateWithEmptyDays = function () { return shiftDate(this.getStartDate(), -this.getNumEmptyDaysAtStart()); }; ContributionGraph.prototype.getNumEmptyDaysAtStart = function () { return this.getStartDate().getDay(); }; ContributionGraph.prototype.getNumEmptyDaysAtEnd = function () { return DAYS_IN_WEEK - 1 - this.getEndDate().getDay(); }; ContributionGraph.prototype.getWeekCount = function () { var numDaysRoundedToWeek = this.props.numDays + this.getNumEmptyDaysAtStart() + this.getNumEmptyDaysAtEnd(); return Math.ceil(numDaysRoundedToWeek / DAYS_IN_WEEK); }; ContributionGraph.prototype.getWeekWidth = function () { return DAYS_IN_WEEK * this.getSquareSizeWithGutter(); }; ContributionGraph.prototype.getWidth = function () { return (this.getWeekCount() * this.getSquareSizeWithGutter() - this.props.gutterSize); }; ContributionGraph.prototype.getHeight = function () { return (this.getWeekWidth() + (this.getMonthLabelSize() - this.props.gutterSize)); }; ContributionGraph.prototype.getValueCache = function (values) { var _this = this; var minValue = Infinity, maxValue = -Infinity; return { valueCache: values.reduce(function (memo, value) { var date = convertToDate(value.date); var index = Math.floor((date.valueOf() - _this.getStartDateWithEmptyDays().valueOf()) / MILLISECONDS_IN_ONE_DAY); minValue = Math.min(value[_this.props.accessor], minValue); maxValue = Math.max(value[_this.props.accessor], maxValue); memo[index] = { value: value, title: _this.props.titleForValue ? _this.props.titleForValue(value) : null, tooltipDataAttrs: _this.getTooltipDataAttrsForValue(value) }; return memo; }, {}), minValue: minValue, maxValue: maxValue }; }; ContributionGraph.prototype.getValueForIndex = function (index) { if (this.state.valueCache[index]) { return this.state.valueCache[index].value; } return null; }; ContributionGraph.prototype.getClassNameForIndex = function (index) { if (this.state.valueCache[index]) { if (this.state.valueCache[index].value) { var count = this.state.valueCache[index].value[this.props.accessor]; if (count) { var opacity = mapValue(count, this.state.maxValue === this.state.minValue ? 0 : this.state.minValue, isNaN(this.state.maxValue) ? 1 : this.state.maxValue, 0.15 + 0.05, // + 0.05 to make smaller values a bit more visible 1); return this.props.chartConfig.color(opacity); } } } return this.props.chartConfig.color(0.15); }; ContributionGraph.prototype.getTitleForIndex = function (index) { if (this.state.valueCache[index]) { return this.state.valueCache[index].title; } return this.props.titleForValue ? this.props.titleForValue(null) : null; }; ContributionGraph.prototype.getTooltipDataAttrsForIndex = function (index) { var _a; if (this.state.valueCache[index]) { return this.state.valueCache[index].tooltipDataAttrs; } return this.getTooltipDataAttrsForValue((_a = { date: null }, _a[this.props.accessor] = null, _a)); }; ContributionGraph.prototype.getTooltipDataAttrsForValue = function (value) { var tooltipDataAttrs = this.props.tooltipDataAttrs; if (typeof tooltipDataAttrs === "function") { return tooltipDataAttrs(value); } return tooltipDataAttrs; }; ContributionGraph.prototype.getTransformForWeek = function (weekIndex) { if (this.props.horizontal) { return [weekIndex * this.getSquareSizeWithGutter(), 50]; } return [10, weekIndex * this.getSquareSizeWithGutter()]; }; ContributionGraph.prototype.getTransformForMonthLabels = function () { if (this.props.horizontal) { return null; } return "".concat(this.getWeekWidth() + MONTH_LABEL_GUTTER_SIZE, ", 0"); }; ContributionGraph.prototype.getTransformForAllWeeks = function () { if (this.props.horizontal) { return "0, ".concat(this.getMonthLabelSize() - 100); } return null; }; ContributionGraph.prototype.getViewBox = function () { if (this.props.horizontal) { return "".concat(this.getWidth(), " ").concat(this.getHeight()); } return "".concat(this.getHeight(), " ").concat(this.getWidth()); }; ContributionGraph.prototype.getSquareCoordinates = function (dayIndex) { if (this.props.horizontal) { return [0, dayIndex * this.getSquareSizeWithGutter()]; } return [dayIndex * this.getSquareSizeWithGutter(), 0]; }; ContributionGraph.prototype.getMonthLabelCoordinates = function (weekIndex) { if (this.props.horizontal) { return [ weekIndex * this.getSquareSizeWithGutter(), this.getMonthLabelSize() - MONTH_LABEL_GUTTER_SIZE ]; } var verticalOffset = -2; return [ 0, (weekIndex + 1) * this.getSquareSizeWithGutter() + verticalOffset ]; }; ContributionGraph.prototype.renderSquare = function (dayIndex, index) { var _this = this; var indexOutOfRange = index < this.getNumEmptyDaysAtStart() || index >= this.getNumEmptyDaysAtStart() + this.props.numDays; if (indexOutOfRange && !this.props.showOutOfRangeDays) { return null; } var _a = this.getSquareCoordinates(dayIndex), x = _a[0], y = _a[1]; var _b = this.props.squareSize, squareSize = _b === void 0 ? SQUARE_SIZE : _b; return (<Rect key={index} width={squareSize} height={squareSize} x={x + paddingLeft} y={y} title={this.getTitleForIndex(index)} fill={this.getClassNameForIndex(index)} onPress={function () { _this.handleDayPress(index); }} {...this.getTooltipDataAttrsForIndex(index)}/>); }; ContributionGraph.prototype.handleDayPress = function (index) { var _a; if (!this.props.onDayPress) { return; } this.props.onDayPress(this.state.valueCache[index] && this.state.valueCache[index].value ? this.state.valueCache[index].value : (_a = {}, _a[this.props.accessor] = 0, _a.date = new Date(this.getStartDate().valueOf() + index * MILLISECONDS_IN_ONE_DAY), _a)); }; ContributionGraph.prototype.renderWeek = function (weekIndex) { var _this = this; var _a = this.getTransformForWeek(weekIndex), x = _a[0], y = _a[1]; return (<G key={weekIndex} x={x} y={y}> {range(DAYS_IN_WEEK).map(function (dayIndex) { return _this.renderSquare(dayIndex, weekIndex * DAYS_IN_WEEK + dayIndex); })} </G>); }; ContributionGraph.prototype.renderAllWeeks = function () { var _this = this; return range(this.getWeekCount()).map(function (weekIndex) { return _this.renderWeek(weekIndex); }); }; ContributionGraph.prototype.renderMonthLabels = function () { var _this = this; if (!this.props.showMonthLabels) { return null; } var weekRange = range(this.getWeekCount() - 1); // don't render for last week, because label will be cut off return weekRange.map(function (weekIndex) { var endOfWeek = shiftDate(_this.getStartDateWithEmptyDays(), (weekIndex + 1) * DAYS_IN_WEEK); var _a = _this.getMonthLabelCoordinates(weekIndex), x = _a[0], y = _a[1]; return endOfWeek.getDate() >= 1 && endOfWeek.getDate() <= DAYS_IN_WEEK ? (<Text key={weekIndex} x={x + paddingLeft} y={y + 8} {..._this.getPropsForLabels()}> {_this.props.getMonthLabel ? _this.props.getMonthLabel(endOfWeek.getMonth()) : MONTH_LABELS[endOfWeek.getMonth()]} </Text>) : null; }); }; ContributionGraph.prototype.render = function () { var style = this.props.style; var _a = style.borderRadius, borderRadius = _a === void 0 ? 0 : _a; if (!borderRadius && this.props.chartConfig.style) { var stupidXo = this.props.chartConfig.style.borderRadius; borderRadius = stupidXo; } return (<View style={style}> <Svg height={this.props.height} width={this.props.width}> {this.renderDefs(__assign({ width: this.props.width, height: this.props.height }, this.props.chartConfig))} <Rect width="100%" height={this.props.height} rx={borderRadius} ry={borderRadius} fill={this.getGradientUrl("backgroundGradient")}/> <G>{this.renderMonthLabels()}</G> <G>{this.renderAllWeeks()}</G> </Svg> </View>); }; ContributionGraph.defaultProps = { numDays: 200, endDate: new Date(), gutterSize: 1, squareSize: SQUARE_SIZE, horizontal: true, showMonthLabels: true, showOutOfRangeDays: false, accessor: "count", classForValue: function (value) { return (value ? "black" : "#8cc665"); }, style: {} }; return ContributionGraph; }(AbstractChart)); export default ContributionGraph; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJpYnV0aW9uR3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJpYnV0aW9uLWdyYXBoL0NvbnRyaWJ1dGlvbkdyYXBoLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFhLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxPQUFPLGFBQWEsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsWUFBWSxFQUNaLHVCQUF1QixFQUN2QixZQUFZLEVBQ2IsTUFBTSxhQUFhLENBQUM7QUFHckIsSUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLElBQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLElBQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUN2QixJQUFNLEtBQUssR0FBRyxVQUFDLEtBQWEsSUFBSyxPQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxFQUFELENBQUMsQ0FBQyxFQUExQyxDQUEwQyxDQUFDO0FBYTVFO0lBQWdDLHFDQUcvQjtJQUNDLDJCQUFZLEtBQTZCO1FBQ3ZDLFlBQUEsTUFBSyxZQUFDLEtBQUssQ0FBQyxTQUFDO1FBRVQsSUFBQSxLQUFxQyxLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMs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QyxDQUMxQixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FDakIsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQ2pCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUVsRDtVQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLENBQ2hDO1VBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQy9CO1FBQUEsRUFBRSxHQUFHLENBQ1A7TUFBQSxFQUFFLElBQUksQ0FBQyxDQUNSLENBQUM7SUFDSixDQUFDO0lBM0NhLDhCQUFZLEdBQUc7UUFDM0IsT0FBTyxFQUFFLEdBQUc7UUFDWixPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUU7UUFDbkIsVUFBVSxFQUFFLENBQUM7UUFDYixVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsSUFBSTtRQUNoQixlQUFlLEVBQUUsSUFBSTtRQUNyQixrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLGFBQWEsRUFBRSxVQUFBLEtBQUssSUFBSSxPQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUE3QixDQUE2QjtRQUNyRCxLQUFLLEVBQUUsRUFBRTtLQUNWLENBQUM7SUFpQ0osd0JBQUM7Q0FBQSxBQXpYRCxDQUFnQyxhQUFhLEdBeVg1QztBQUVELGVBQWUsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcInJlYWN0LW5hdGl2ZVwiO1xuaW1wb3J0IHsgRywgUmVjdCwgUmVjdFByb3BzLCBTdmcsIFRleHQgfSBmcm9tIFwicmVhY3QtbmF0aXZlLXN2Z1wiO1xuXG5pbXBvcnQgQWJzdHJhY3RDaGFydCBmcm9tIFwiLi4vQWJzdHJhY3RDaGFydFwiO1xuaW1wb3J0IHsgbWFwVmFsdWUgfSBmcm9tIFwiLi4vVXRpbHNcIjtcbmltcG9ydCB7XG4gIGNvbnZlcnRUb0RhdGUsXG4gIGdldEJlZ2lubmluZ1RpbWVGb3JEYXRlLFxuICBzaGlmdERhdGVcbn0gZnJvbSBcIi4vRGF0ZUhlbHBlcnNcIjtcbmltcG9ydCB7XG4gIERBWVNfSU5fV0VFSyxcbiAgTUlMTElTRUNPTkRTX0lOX09ORV9EQVksXG4gIE1PTlRIX0xBQkVMU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnRyaWJ1dGlvbkdyYXBoUHJvcHMsIENvbnRyaWJ1dGlvbkdyYXBoU3RhdGUgfSBmcm9tIFwiLlwiO1xuXG5jb25zdCBTUVVBUkVfU0laRSA9IDIwO1xuY29uc3QgTU9OVEhfTEFCRUxfR1VUVEVSX1NJWkUgPSA4O1xuY29uc3QgcGFkZGluZ0xlZnQgPSAzMjtcbmNvbnN0IHJhbmdlID0gKGNvdW50OiBudW1iZXIpID0+IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiBpKTtcblxuZXhwb3J0IHR5cGUgQ29udHJpYnV0aW9uQ2hhcnRWYWx1ZSA9IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdG9vbHRpcERhdGFBdHRyczogVG9vbHRpcERhdGFBdHRycztcbiAgZGF0ZTogRGF0ZTtcbn07XG5cbmV4cG9ydCB0eXBlIFRvb2x0aXBEYXRhQXR0cnMgPSAoXG4gIHZhbHVlOiBDb250cmlidXRpb25DaGFydFZhbHVlXG4pID0+IFBhcnRpYWw8UmVjdFByb3BzPiB8IFBhcnRpYWw8UmVjdFByb3BzPjtcblxuY2xhc3MgQ29udHJpYnV0aW9uR3JhcGggZXh0ZW5kcyBBYnN0cmFjdENoYXJ0PFxuICBDb250cmlidXRpb25HcmFwaFByb3BzLFxuICBDb250cmlidXRpb25HcmFwaFN0YXRlXG4+IHtcbiAgY29uc3RydWN0b3IocHJvcHM6IENvbnRyaWJ1dGlvbkdyYXBoUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBsZXQgeyBtYXhWYWx1ZSwgbWluVmFsdWUsIHZhbHVlQ2FjaGUgfSA9IHRoaXMuZ2V0VmFsdWVDYWNoZShwcm9wcy52YWx1ZXMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICB2YWx1ZUNhY2hlXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IENvbnRyaWJ1dGlvbkdyYXBoUHJvcHMpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVWYWx1ZUNhY2hlID1cbiAgICAgIHByZXZQcm9wcy52YWx1ZXMgIT09IHRoaXMucHJvcHMudmFsdWVzIHx8XG4gICAgICBwcmV2UHJvcHMuZW5kRGF0ZSAhPT0gdGhpcy5wcm9wcy5lbmREYXRlIHx8XG4gICAgICBwcmV2UHJvcHMubnVtRGF5cyAhPT0gdGhpcy5wcm9wcy5udW1EYXlzIHx8XG4gICAgICBwcmV2UHJvcHMuYWNjZXNzb3IgIT09IHRoaXMucHJvcHMuYWNjZXNzb3IgfHxcbiAgICAgIHByZXZQcm9wcy50aXRsZUZvclZhbHVlICE9PSB0aGlzLnByb3BzLnRpdGxlRm9yVmFsdWUgfHxcbiAgICAgIHByZXZQcm9wcy50b29sdGlwRGF0YUF0dHJzICE9PSB0aGlzLnByb3BzLnRvb2x0aXBEYXRhQXR0cnM7XG5cbiAgICBpZiAoIXNob3VsZFVwZGF0ZVZhbHVlQ2FjaGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgeyBtYXhWYWx1ZSwgbWluVmFsdWUsIHZhbHVlQ2FjaGUgfSA9IHRoaXMuZ2V0VmFsdWVDYWNoZShcbiAgICAgIHRoaXMucHJvcHMudmFsdWVzXG4gICAgKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbWF4VmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIHZhbHVlQ2FjaGVcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNxdWFyZVNpemVXaXRoR3V0dGVyKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5zcXVhcmVTaXplIHx8IFNRVUFSRV9TSVpFKSArIHRoaXMucHJvcHMuZ3V0dGVyU2l6ZTtcbiAgfVxuXG4gIGdldE1vbnRoTGFiZWxTaXplKCkge1xuICAgIGxldCB7IHNxdWFyZVNpemUgPSBTUVVBUkVfU0laRSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoIXRoaXMucHJvcHMuc2hvd01vbnRoTGFiZWxzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvcHMuaG9yaXpvbnRhbCkge1xuICAgICAgcmV0dXJuIHNxdWFyZVNpemUgKyBNT05USF9MQUJFTF9HVVRURVJfU0laRTtcbiAgICB9XG4gICAgcmV0dXJuIDIgKiAoc3F1YXJlU2l6ZSArIE1PTlRIX0xBQkVMX0dVVFRFUl9TSVpFKTtcbiAgfVxuXG4gIGdldFN0YXJ0RGF0ZSgpIHtcbiAgICByZXR1cm4gc2hpZnREYXRlKHRoaXMuZ2V0RW5kRGF0ZSgpLCAtdGhpcy5wcm9wcy5udW1EYXlzICsgMSk7IC8vICsxIGJlY2F1c2UgZW5kRGF0ZSBpcyBpbmNsdXNpdmVcbiAgfVxuXG4gIGdldEVuZERhdGUoKSB7XG4gICAgcmV0dXJuIGdldEJlZ2lubmluZ1RpbWVGb3JEYXRlKGNvbnZlcnRUb0RhdGUodGhpcy5wcm9wcy5lbmREYXRlKSk7XG4gIH1cblxuICBnZXRTdGFydERhdGVXaXRoRW1wdHlEYXlzKCkge1xuICAgIHJldHVybiBzaGlmdERhdGUodGhpcy5nZXRTdGFydERhdGUoKSwgLXRoaXMuZ2V0TnVtRW1wdHlEYXlzQXRTdGFydCgpKTtcbiAgfVxuXG4gIGdldE51bUVtcHR5RGF5c0F0U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhcnREYXRlKCkuZ2V0RGF5KCk7XG4gIH1cblxuICBnZXROdW1FbXB0eURheXNBdEVuZCgpIHtcbiAgICByZXR1cm4gREFZU19JTl9XRUVLIC0gMSAtIHRoaXMuZ2V0RW5kRGF0ZSgpLmdldERheSgpO1xuICB9XG5cbiAgZ2V0V2Vla0NvdW50KCkge1xuICAgIGNvbnN0IG51bURheXNSb3VuZGVkVG9XZWVrID1cbiAgICAgIHRoaXMucHJvcHMubnVtRGF5cyArXG4gICAgICB0aGlzLmdldE51bUVtcHR5RGF5c0F0U3RhcnQoKSArXG4gICAgICB0aGlzLmdldE51bUVtcHR5RGF5c0F0RW5kKCk7XG4gICAgcmV0dXJuIE1hdGguY2VpbChudW1EYXlzUm91bmRlZFRvV2VlayAvIERBWVNfSU5fV0VFSyk7XG4gIH1cblxuICBnZXRXZWVrV2lkdGgoKSB7XG4gICAgcmV0dXJuIERBWVNfSU5fV0VFSyAqIHRoaXMuZ2V0U3F1YXJlU2l6ZVdpdGhHdXR0ZXIoKTtcbiAgfVxuXG4gIGdldFdpZHRoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmdldFdlZWtDb3VudCgpICogdGhpcy5nZXRTcXVhcmVTaXplV2l0aEd1dHRlcigpIC1cbiAgICAgIHRoaXMucHJvcHMuZ3V0dGVyU2l6ZVxuICAgICk7XG4gIH1cblxuICBnZXRIZWlnaHQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZ2V0V2Vla1dpZHRoKCkgKyAodGhpcy5nZXRNb250aExhYmVsU2l6ZSgpIC0gdGhpcy5wcm9wcy5ndXR0ZXJTaXplKVxuICAgICk7XG4gIH1cblxuICBnZXRWYWx1ZUNhY2hlKHZhbHVlczogQ29udHJpYnV0aW9uQ2hhcnRWYWx1ZVtdKSB7XG4gICAgbGV0IG1pblZhbHVlID0gSW5maW5pdHksXG4gICAgICBtYXhWYWx1ZSA9IC1JbmZpbml0eTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZUNhY2hlOiB2YWx1ZXMucmVkdWNlKChtZW1vLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRlID0gY29udmVydFRvRGF0ZSh2YWx1ZS5kYXRlKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgKGRhdGUudmFsdWVPZigpIC0gdGhpcy5nZXRTdGFydERhdGVXaXRoRW1wdHlEYXlzKCkudmFsdWVPZigpKSAvXG4gICAgICAgICAgICBNSUxMSVNFQ09ORFNfSU5fT05FX0RBWVxuICAgICAgICApO1xuXG4gICAgICAgIG1pblZhbHVlID0gTWF0aC5taW4odmFsdWVbdGhpcy5wcm9wcy5hY2Nlc3Nvcl0sIG1pblZhbHVlKTtcbiAgICAgICAgbWF4VmFsdWUgPSBNYXRoLm1heCh2YWx1ZVt0aGlzLnByb3BzLmFjY2Vzc29yXSwgbWF4VmFsdWUpO1xuXG4gICAgICAgIG1lbW9baW5kZXhdID0ge1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLnByb3BzLnRpdGxlRm9yVmFsdWVcbiAgICAgICAgICAgID8gdGhpcy5wcm9wcy50aXRsZUZvclZhbHVlKHZhbHVlKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHRvb2x0aXBEYXRhQXR0cnM6IHRoaXMuZ2V0VG9vbHRpcERhdGFBdHRyc0ZvclZhbHVlKHZhbHVlKVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfSwge30pLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZVxuICAgIH07XG4gIH1cblxuICBnZXRWYWx1ZUZvckluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lRm9ySW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlQ2FjaGVbaW5kZXhdKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XS52YWx1ZSkge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0udmFsdWVbdGhpcy5wcm9wcy5hY2Nlc3Nvcl07XG5cbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgY29uc3Qgb3BhY2l0eSA9IG1hcFZhbHVlKFxuICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLm1heFZhbHVlID09PSB0aGlzLnN0YXRlLm1pblZhbHVlXG4gICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICA6IHRoaXMuc3RhdGUubWluVmFsdWUsXG4gICAgICAgICAgICBpc05hTih0aGlzLnN0YXRlLm1heFZhbHVlKSA/IDEgOiB0aGlzLnN0YXRlLm1heFZhbHVlLFxuICAgICAgICAgICAgMC4xNSArIDAuMDUsIC8vICsgMC4wNSB0byBtYWtlIHNtYWxsZXIgdmFsdWVzIGEgYml0IG1vcmUgdmlzaWJsZVxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGFydENvbmZpZy5jb2xvcihvcGFjaXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3BzLmNoYXJ0Q29uZmlnLmNvbG9yKDAuMTUpO1xuICB9XG5cbiAgZ2V0VGl0bGVGb3JJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0pIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLnZhbHVlQ2FjaGVbaW5kZXhdLnRpdGxlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3BzLnRpdGxlRm9yVmFsdWUgPyB0aGlzLnByb3BzLnRpdGxlRm9yVmFsdWUobnVsbCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0VG9vbHRpcERhdGFBdHRyc0ZvckluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0udG9vbHRpcERhdGFBdHRycztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUb29sdGlwRGF0YUF0dHJzRm9yVmFsdWUoe1xuICAgICAgZGF0ZTogbnVsbCxcbiAgICAgIFt0aGlzLnByb3BzLmFjY2Vzc29yXTogbnVsbFxuICAgIH0gYXMgQ29udHJpYnV0aW9uQ2hhcnRWYWx1ZSk7XG4gIH1cblxuICBnZXRUb29sdGlwRGF0YUF0dHJzRm9yVmFsdWUodmFsdWU6IENvbnRyaWJ1dGlvbkNoYXJ0VmFsdWUpIHtcbiAgICBjb25zdCB7IHRvb2x0aXBEYXRhQXR0cnMgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAodHlwZW9mIHRvb2x0aXBEYXRhQXR0cnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRvb2x0aXBEYXRhQXR0cnModmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0b29sdGlwRGF0YUF0dHJzO1xuICB9XG5cbiAgZ2V0VHJhbnNmb3JtRm9yV2Vlayh3ZWVrSW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnByb3BzLmhvcml6b250YWwpIHtcbiAgICAgIHJldHVybiBbd2Vla0luZGV4ICogdGhpcy5nZXRTcXVhcmVTaXplV2l0aEd1dHRlcigpLCA1MF07XG4gICAgfVxuICAgIHJldHVybiBbMTAsIHdlZWtJbmRleCAqIHRoaXMuZ2V0U3F1YXJlU2l6ZVdpdGhHdXR0ZXIoKV07XG4gIH1cblxuICBnZXRUcmFuc2Zvcm1Gb3JNb250aExhYmVscygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5ob3Jpem9udGFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0V2Vla1dpZHRoKCkgKyBNT05USF9MQUJFTF9HVVRURVJfU0laRX0sIDBgO1xuICB9XG5cbiAgZ2V0VHJhbnNmb3JtRm9yQWxsV2Vla3MoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaG9yaXpvbnRhbCkge1xuICAgICAgcmV0dXJuIGAwLCAke3RoaXMuZ2V0TW9udGhMYWJlbFNpemUoKSAtIDEwMH1gO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldFZpZXdCb3goKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaG9yaXpvbnRhbCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0V2lkdGgoKX0gJHt0aGlzLmdldEhlaWdodCgpfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLmdldEhlaWdodCgpfSAke3RoaXMuZ2V0V2lkdGgoKX1gO1xuICB9XG5cbiAgZ2V0U3F1YXJlQ29vcmRpbmF0ZXMoZGF5SW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnByb3BzLmhvcml6b250YWwpIHtcbiAgICAgIHJldHVybiBbMCwgZGF5SW5kZXggKiB0aGlzLmdldFNxdWFyZVNpemVXaXRoR3V0dGVyKCldO1xuICAgIH1cbiAgICByZXR1cm4gW2RheUluZGV4ICogdGhpcy5nZXRTcXVhcmVTaXplV2l0aEd1dHRlcigpLCAwXTtcbiAgfVxuXG4gIGdldE1vbnRoTGFiZWxDb29yZGluYXRlcyh3ZWVrSW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnByb3BzLmhvcml6b250YWwpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHdlZWtJbmRleCAqIHRoaXMuZ2V0U3F1YXJlU2l6ZVdpdGhHdXR0ZXIoKSxcbiAgICAgICAgdGhpcy5nZXRNb250aExhYmVsU2l6ZSgpIC0gTU9OVEhfTEFCRUxfR1VUVEVSX1NJWkVcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IHZlcnRpY2FsT2Zmc2V0ID0gLTI7XG4gICAgcmV0dXJuIFtcbiAgICAgIDAsXG4gICAgICAod2Vla0luZGV4ICsgMSkgKiB0aGlzLmdldFNxdWFyZVNpemVXaXRoR3V0dGVyKCkgKyB2ZXJ0aWNhbE9mZnNldFxuICAgIF07XG4gIH1cblxuICByZW5kZXJTcXVhcmUoZGF5SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGluZGV4T3V0T2ZSYW5nZSA9XG4gICAgICBpbmRleCA8IHRoaXMuZ2V0TnVtRW1wdHlEYXlzQXRTdGFydCgpIHx8XG4gICAgICBpbmRleCA+PSB0aGlzLmdldE51bUVtcHR5RGF5c0F0U3RhcnQoKSArIHRoaXMucHJvcHMubnVtRGF5cztcblxuICAgIGlmIChpbmRleE91dE9mUmFuZ2UgJiYgIXRoaXMucHJvcHMuc2hvd091dE9mUmFuZ2VEYXlzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBbeCwgeV0gPSB0aGlzLmdldFNxdWFyZUNvb3JkaW5hdGVzKGRheUluZGV4KTtcbiAgICBjb25zdCB7IHNxdWFyZVNpemUgPSBTUVVBUkVfU0laRSB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiAoXG4gICAgICA8UmVjdFxuICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICB3aWR0aD17c3F1YXJlU2l6ZX1cbiAgICAgICAgaGVpZ2h0PXtzcXVhcmVTaXplfVxuICAgICAgICB4PXt4ICsgcGFkZGluZ0xlZnR9XG4gICAgICAgIHk9e3l9XG4gICAgICAgIHRpdGxlPXt0aGlzLmdldFRpdGxlRm9ySW5kZXgoaW5kZXgpfVxuICAgICAgICBmaWxsPXt0aGlzLmdldENsYXNzTmFtZUZvckluZGV4KGluZGV4KX1cbiAgICAgICAgb25QcmVzcz17KCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRGF5UHJlc3MoaW5kZXgpO1xuICAgICAgICB9fVxuICAgICAgICB7Li4udGhpcy5nZXRUb29sdGlwRGF0YUF0dHJzRm9ySW5kZXgoaW5kZXgpfVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgaGFuZGxlRGF5UHJlc3MoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5wcm9wcy5vbkRheVByZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vbkRheVByZXNzKFxuICAgICAgdGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XSAmJiB0aGlzLnN0YXRlLnZhbHVlQ2FjaGVbaW5kZXhdLnZhbHVlXG4gICAgICAgID8gdGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XS52YWx1ZVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIFt0aGlzLnByb3BzLmFjY2Vzc29yXTogMCxcbiAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKFxuICAgICAgICAgICAgICB0aGlzLmdldFN0YXJ0RGF0ZSgpLnZhbHVlT2YoKSArIGluZGV4ICogTUlMTElTRUNPTkRTX0lOX09ORV9EQVlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlcldlZWsod2Vla0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBbeCwgeV0gPSB0aGlzLmdldFRyYW5zZm9ybUZvcldlZWsod2Vla0luZGV4KTtcbiAgICByZXR1cm4gKFxuICAgICAgPEcga2V5PXt3ZWVrSW5kZXh9IHg9e3h9IHk9e3l9PlxuICAgICAgICB7cmFuZ2UoREFZU19JTl9XRUVLKS5tYXAoZGF5SW5kZXggPT5cbiAgICAgICAgICB0aGlzLnJlbmRlclNxdWFyZShkYXlJbmRleCwgd2Vla0luZGV4ICogREFZU19JTl9XRUVLICsgZGF5SW5kZXgpXG4gICAgICAgICl9XG4gICAgICA8L0c+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlckFsbFdlZWtzKCkge1xuICAgIHJldHVybiByYW5nZSh0aGlzLmdldFdlZWtDb3VudCgpKS5tYXAod2Vla0luZGV4ID0+XG4gICAgICB0aGlzLnJlbmRlcldlZWsod2Vla0luZGV4KVxuICAgICk7XG4gIH1cblxuICByZW5kZXJNb250aExhYmVscygpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuc2hvd01vbnRoTGFiZWxzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWVrUmFuZ2UgPSByYW5nZSh0aGlzLmdldFdlZWtDb3VudCgpIC0gMSk7IC8vIGRvbid0IHJlbmRlciBmb3IgbGFzdCB3ZWVrLCBiZWNhdXNlIGxhYmVsIHdpbGwgYmUgY3V0IG9mZlxuXG4gICAgcmV0dXJuIHdlZWtSYW5nZS5tYXAod2Vla0luZGV4ID0+IHtcbiAgICAgIGNvbnN0IGVuZE9mV2VlayA9IHNoaWZ0RGF0ZShcbiAgICAgICAgdGhpcy5nZXRTdGFydERhdGVXaXRoRW1wdHlEYXlzKCksXG4gICAgICAgICh3ZWVrSW5kZXggKyAxKSAqIERBWVNfSU5fV0VFS1xuICAgICAgKTtcblxuICAgICAgY29uc3QgW3gsIHldID0gdGhpcy5nZXRNb250aExhYmVsQ29vcmRpbmF0ZXMod2Vla0luZGV4KTtcblxuICAgICAgcmV0dXJuIGVuZE9mV2Vlay5nZXREYXRlKCkgPj0gMSAmJiBlbmRPZldlZWsuZ2V0RGF0ZSgpIDw9IERBWVNfSU5fV0VFSyA/IChcbiAgICAgICAgPFRleHRcbiAgICAgICAgICBrZXk9e3dlZWtJbmRleH1cbiAgICAgICAgICB4PXt4ICsgcGFkZGluZ0xlZnR9XG4gICAgICAgICAgeT17eSArIDh9XG4gICAgICAgICAgey4uLnRoaXMuZ2V0UHJvcHNGb3JMYWJlbHMoKX1cbiAgICAgICAgPlxuICAgICAgICAgIHt0aGlzLnByb3BzLmdldE1vbnRoTGFiZWxcbiAgICAgICAgICAgID8gdGhpcy5wcm9wcy5nZXRNb250aExhYmVsKGVuZE9mV2Vlay5nZXRNb250aCgpKVxuICAgICAgICAgICAgOiBNT05USF9MQUJFTFNbZW5kT2ZXZWVrLmdldE1vbnRoKCldfVxuICAgICAgICA8L1RleHQ+XG4gICAgICApIDogbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIG51bURheXM6IDIwMCxcbiAgICBlbmREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIGd1dHRlclNpemU6IDEsXG4gICAgc3F1YXJlU2l6ZTogU1FVQVJFX1NJWkUsXG4gICAgaG9yaXpvbnRhbDogdHJ1ZSxcbiAgICBzaG93TW9udGhMYWJlbHM6IHRydWUsXG4gICAgc2hvd091dE9mUmFuZ2VEYXlzOiBmYWxzZSxcbiAgICBhY2Nlc3NvcjogXCJjb3VudFwiLFxuICAgIGNsYXNzRm9yVmFsdWU6IHZhbHVlID0+ICh2YWx1ZSA/IFwiYmxhY2tcIiA6IFwiIzhjYzY2NVwiKSxcbiAgICBzdHlsZToge31cbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBzdHlsZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIGxldCB7IGJvcmRlclJhZGl1cyA9IDAgfSA9IHN0eWxlO1xuXG4gICAgaWYgKCFib3JkZXJSYWRpdXMgJiYgdGhpcy5wcm9wcy5jaGFydENvbmZpZy5zdHlsZSkge1xuICAgICAgY29uc3Qgc3R1cGlkWG8gPSB0aGlzLnByb3BzLmNoYXJ0Q29uZmlnLnN0eWxlLmJvcmRlclJhZGl1cztcbiAgICAgIGJvcmRlclJhZGl1cyA9IHN0dXBpZFhvO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8VmlldyBzdHlsZT17c3R5bGV9PlxuICAgICAgICA8U3ZnIGhlaWdodD17dGhpcy5wcm9wcy5oZWlnaHR9IHdpZHRoPXt0aGlzLnByb3BzLndpZHRofT5cbiAgICAgICAgICB7dGhpcy5yZW5kZXJEZWZzKHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnByb3BzLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnByb3BzLmhlaWdodCxcbiAgICAgICAgICAgIC4uLnRoaXMucHJvcHMuY2hhcnRDb25maWdcbiAgICAgICAgICB9KX1cbiAgICAgICAgICA8UmVjdFxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD17dGhpcy5wcm9wcy5oZWlnaHR9XG4gICAgICAgICAgICByeD17Ym9yZGVyUmFkaXVzfVxuICAgICAgICAgICAgcnk9e2JvcmRlclJhZGl1c31cbiAgICAgICAgICAgIGZpbGw9e3RoaXMuZ2V0R3JhZGllbnRVcmwoXCJiYWNrZ3JvdW5kR3JhZGllbnRcIil9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8Rz57dGhpcy5yZW5kZXJNb250aExhYmVscygpfTwvRz5cbiAgICAgICAgICA8Rz57dGhpcy5yZW5kZXJBbGxXZWVrcygpfTwvRz5cbiAgICAgICAgPC9Tdmc+XG4gICAgICA8L1ZpZXc+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250cmlidXRpb25HcmFwaDtcbiJdfQ==