@nova-ui/charts
Version:
Nova Charts is a library created to provide potential consumers with solutions for various data visualizations that conform with the Nova Design Language. It's designed to solve common patterns identified by UX designers, but also be very flexible so that
96 lines • 16.1 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import isNil from "lodash/isNil";
import { DATA_POINT_NOT_FOUND, HIGHLIGHT_SERIES_EVENT, INTERACTION_SERIES_EVENT, } from "../../../constants";
import { InteractionType, } from "../../../core/common/types";
import { RenderLayerName, } from "../../types";
export class LineSelectSeriesInteractionStrategy {
INTERACTION_MARGIN = 8;
draw(renderer, renderSeries, rendererSubject) {
const target = renderSeries.containers[RenderLayerName.data];
let interactionPath = target.select("path.interaction");
if (isNil(renderer.config.strokeWidth)) {
throw new Error("renderer.config.strokeWidth is not defined");
}
if (interactionPath.empty()) {
interactionPath = target
.append("path")
.classed("interaction", true)
.classed(`pointer-events pointer-events-click`, true)
.attrs({
"stroke-width": renderer.config.strokeWidth +
2 * this.INTERACTION_MARGIN,
stroke: "transparent",
fill: "none",
})
.on("mouseenter", () => {
const dataPoint = {
seriesId: renderSeries.dataSeries.id,
dataSeries: renderSeries.dataSeries,
// TODO: doesn't work with empty data
index: 0,
data: renderSeries.dataSeries.data[0],
};
rendererSubject.next({
eventName: HIGHLIGHT_SERIES_EVENT,
data: dataPoint,
});
})
.on("mouseleave", () => {
const dataPoint = {
seriesId: renderSeries.dataSeries.id,
dataSeries: renderSeries.dataSeries,
index: DATA_POINT_NOT_FOUND,
};
rendererSubject.next({
eventName: HIGHLIGHT_SERIES_EVENT,
data: dataPoint,
});
})
.on("click", (d, i) => {
this.emitEvent(renderer, INTERACTION_SERIES_EVENT, InteractionType.Click, renderSeries, d, i, rendererSubject);
});
}
renderer.drawLine(renderSeries, interactionPath);
}
// TODO: Get rid of this function or make it optional in interface
getDataPointIndex(renderer, series, values, scales) {
// @ts-ignore
return;
}
highlightDataPoint(renderer, renderSeries, dataPointIndex, rendererSubject) { }
emitEvent(renderer, eventName, interactionType, renderSeries, data, i, rendererSubject) {
const dataPoint = {
seriesId: renderSeries.dataSeries.id,
dataSeries: renderSeries.dataSeries,
index: i,
data: data,
position: renderer.getDataPointPosition(renderSeries.dataSeries, i, renderSeries.scales),
};
rendererSubject.next({
eventName: eventName,
data: {
interactionType: interactionType,
payload: dataPoint,
},
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1zZWxlY3Qtc2VyaWVzLWludGVyYWN0aW9uLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JlbmRlcmVycy9saW5lL2ludGVyYWN0aW9uLXN0cmF0ZWdpZXMvbGluZS1zZWxlY3Qtc2VyaWVzLWludGVyYWN0aW9uLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFHakMsT0FBTyxFQUNILG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsd0JBQXdCLEdBQzNCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUlILGVBQWUsR0FFbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBR0gsZUFBZSxHQUNsQixNQUFNLGFBQWEsQ0FBQztBQUlyQixNQUFNLE9BQU8sbUNBQW1DO0lBRzVCLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUVoQyxJQUFJLENBQ1AsUUFBc0IsRUFDdEIsWUFBMkMsRUFDM0MsZUFBK0M7UUFFL0MsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0QsSUFBSSxlQUFlLEdBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXRDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFN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RUFBRTtnQkFDRixlQUFlLEVBQUUsZUFBZTtnQkFDaEMsT0FBTyxFQUFFLFNBQVM7YUFDckI7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQge1xuICAgIERBVEFfUE9JTlRfTk9UX0ZPVU5ELFxuICAgIEhJR0hMSUdIVF9TRVJJRVNfRVZFTlQsXG4gICAgSU5URVJBQ1RJT05fU0VSSUVTX0VWRU5ULFxufSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTY2FsZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9jb21tb24vc2NhbGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICAgIEQzU2VsZWN0aW9uLFxuICAgIElEYXRhUG9pbnQsXG4gICAgSURhdGFTZXJpZXMsXG4gICAgSW50ZXJhY3Rpb25UeXBlLFxuICAgIElSZW5kZXJlckV2ZW50UGF5bG9hZCxcbn0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvY29tbW9uL3R5cGVzXCI7XG5pbXBvcnQge1xuICAgIElIaWdobGlnaHRTdHJhdGVneSxcbiAgICBJUmVuZGVyU2VyaWVzLFxuICAgIFJlbmRlckxheWVyTmFtZSxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJTGluZUFjY2Vzc29ycyB9IGZyb20gXCIuLi9saW5lLWFjY2Vzc29yc1wiO1xuaW1wb3J0IHsgTGluZVJlbmRlcmVyIH0gZnJvbSBcIi4uL2xpbmUtcmVuZGVyZXJcIjtcblxuZXhwb3J0IGNsYXNzIExpbmVTZWxlY3RTZXJpZXNJbnRlcmFjdGlvblN0cmF0ZWd5XG4gICAgaW1wbGVtZW50cyBJSGlnaGxpZ2h0U3RyYXRlZ3k8SUxpbmVBY2Nlc3NvcnMsIExpbmVSZW5kZXJlcj5cbntcbiAgICBwdWJsaWMgcmVhZG9ubHkgSU5URVJBQ1RJT05fTUFSR0lOID0gODtcblxuICAgIHB1YmxpYyBkcmF3KFxuICAgICAgICByZW5kZXJlcjogTGluZVJlbmRlcmVyLFxuICAgICAgICByZW5kZXJTZXJpZXM6IElSZW5kZXJTZXJpZXM8SUxpbmVBY2Nlc3NvcnM+LFxuICAgICAgICByZW5kZXJlclN1YmplY3Q6IFN1YmplY3Q8SVJlbmRlcmVyRXZlbnRQYXlsb2FkPlxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSByZW5kZXJTZXJpZXMuY29udGFpbmVyc1tSZW5kZXJMYXllck5hbWUuZGF0YV07XG5cbiAgICAgICAgbGV0IGludGVyYWN0aW9uUGF0aDogRDNTZWxlY3Rpb248U1ZHUGF0aEVsZW1lbnQ+ID1cbiAgICAgICAgICAgIHRhcmdldC5zZWxlY3QoXCJwYXRoLmludGVyYWN0aW9uXCIpO1xuXG4gICAgICAgIGlmIChpc05pbChyZW5kZXJlci5jb25maWcuc3Ryb2tlV2lkdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZW5kZXJlci5jb25maWcuc3Ryb2tlV2lkdGggaXMgbm90IGRlZmluZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW50ZXJhY3Rpb25QYXRoLmVtcHR5KCkpIHtcbiAgICAgICAgICAgIGludGVyYWN0aW9uUGF0aCA9IHRhcmdldFxuICAgICAgICAgICAgICAgIC5hcHBlbmQoXCJwYXRoXCIpXG4gICAgICAgICAgICAgICAgLmNsYXNzZWQoXCJpbnRlcmFjdGlvblwiLCB0cnVlKVxuICAgICAgICAgICAgICAgIC5jbGFzc2VkKGBwb2ludGVyLWV2ZW50cyBwb2ludGVyLWV2ZW50cy1jbGlja2AsIHRydWUpXG4gICAgICAgICAgICAgICAgLmF0dHJzKHtcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJva2Utd2lkdGhcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLmNvbmZpZy5zdHJva2VXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAyICogdGhpcy5JTlRFUkFDVElPTl9NQVJHSU4sXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhUG9pbnQ6IE9taXQ8SURhdGFQb2ludCwgXCJwb3NpdGlvblwiPiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc0lkOiByZW5kZXJTZXJpZXMuZGF0YVNlcmllcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTZXJpZXM6IHJlbmRlclNlcmllcy5kYXRhU2VyaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZG9lc24ndCB3b3JrIHdpdGggZW1wdHkgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByZW5kZXJTZXJpZXMuZGF0YVNlcmllcy5kYXRhWzBdLFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZTogSElHSExJR0hUX1NFUklFU19FVkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVBvaW50OiBPbWl0PElEYXRhUG9pbnQsIFwicG9zaXRpb25cIiB8IFwiZGF0YVwiPiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc0lkOiByZW5kZXJTZXJpZXMuZGF0YVNlcmllcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTZXJpZXM6IHJlbmRlclNlcmllcy5kYXRhU2VyaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IERBVEFfUE9JTlRfTk9UX0ZPVU5ELFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZTogSElHSExJR0hUX1NFUklFU19FVkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oXCJjbGlja1wiLCAoZDogYW55LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0RXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSQUNUSU9OX1NFUklFU19FVkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIEludGVyYWN0aW9uVHlwZS5DbGljayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclNlcmllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJTdWJqZWN0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZW5kZXJlci5kcmF3TGluZShyZW5kZXJTZXJpZXMsIGludGVyYWN0aW9uUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogR2V0IHJpZCBvZiB0aGlzIGZ1bmN0aW9uIG9yIG1ha2UgaXQgb3B0aW9uYWwgaW4gaW50ZXJmYWNlXG4gICAgcHVibGljIGdldERhdGFQb2ludEluZGV4KFxuICAgICAgICByZW5kZXJlcjogTGluZVJlbmRlcmVyLFxuICAgICAgICBzZXJpZXM6IElEYXRhU2VyaWVzPElMaW5lQWNjZXNzb3JzPixcbiAgICAgICAgdmFsdWVzOiB7IFtwOiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICAgc2NhbGVzOiBTY2FsZXNcbiAgICApOiBudW1iZXIge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlnaGxpZ2h0RGF0YVBvaW50KFxuICAgICAgICByZW5kZXJlcjogTGluZVJlbmRlcmVyLFxuICAgICAgICByZW5kZXJTZXJpZXM6IElSZW5kZXJTZXJpZXM8SUxpbmVBY2Nlc3NvcnM+LFxuICAgICAgICBkYXRhUG9pbnRJbmRleDogbnVtYmVyLFxuICAgICAgICByZW5kZXJlclN1YmplY3Q6IFN1YmplY3Q8SVJlbmRlcmVyRXZlbnRQYXlsb2FkPlxuICAgICk6IHZvaWQge31cblxuICAgIHByaXZhdGUgZW1pdEV2ZW50KFxuICAgICAgICByZW5kZXJlcjogTGluZVJlbmRlcmVyLFxuICAgICAgICBldmVudE5hbWU6IHN0cmluZyxcbiAgICAgICAgaW50ZXJhY3Rpb25UeXBlOiBJbnRlcmFjdGlvblR5cGUsXG4gICAgICAgIHJlbmRlclNlcmllczogSVJlbmRlclNlcmllczxJTGluZUFjY2Vzc29ycz4sXG4gICAgICAgIGRhdGE6IGFueSxcbiAgICAgICAgaTogbnVtYmVyLFxuICAgICAgICByZW5kZXJlclN1YmplY3Q6IFN1YmplY3Q8SVJlbmRlcmVyRXZlbnRQYXlsb2FkPlxuICAgICkge1xuICAgICAgICBjb25zdCBkYXRhUG9pbnQ6IElEYXRhUG9pbnQgPSB7XG4gICAgICAgICAgICBzZXJpZXNJZDogcmVuZGVyU2VyaWVzLmRhdGFTZXJpZXMuaWQsXG4gICAgICAgICAgICBkYXRhU2VyaWVzOiByZW5kZXJTZXJpZXMuZGF0YVNlcmllcyxcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiByZW5kZXJlci5nZXREYXRhUG9pbnRQb3NpdGlvbihcbiAgICAgICAgICAgICAgICByZW5kZXJTZXJpZXMuZGF0YVNlcmllcyxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIHJlbmRlclNlcmllcy5zY2FsZXNcbiAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIHJlbmRlcmVyU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGludGVyYWN0aW9uVHlwZTogaW50ZXJhY3Rpb25UeXBlLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==