Search
We found 1 example(s) We found example(s) We couldn't find
Tag results Tag results for tag:
[{"id":"lcjs-example-0000-lineSeries","title":"JavaScript Line Chart","tags":["xy","line","legendbox"],"description":"Example showcasing the use of Line Series. Also known as Line Graph and Line Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases a simple XY line series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\n// Create a XY Chart.\nconst chart = lightningChart().ChartXY({\n // theme: Themes.darkGold\n})\n\n// Modify the default X Axis to use DateTime TickStrategy, and set the axis interval\nchart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setInterval({\n start: new Date(2022, 0, 1).getTime(),\n end: new Date(2022, 0, 31).getTime(),\n })\n\nchart\n .setPadding({\n right: 50,\n })\n .setTitle('Diesel and Gasoline Price Comparison')\n\nconst diesel = [\n { x: new Date(2022, 0, 1).getTime(), y: 1.52 },\n { x: new Date(2022, 0, 2).getTime(), y: 1.52 },\n { x: new Date(2022, 0, 3).getTime(), y: 1.58 },\n { x: new Date(2022, 0, 4).getTime(), y: 1.52 },\n { x: new Date(2022, 0, 5).getTime(), y: 2.0 },\n { x: new Date(2022, 0, 6).getTime(), y: 2.0 },\n { x: new Date(2022, 0, 7).getTime(), y: 2.0 },\n { x: new Date(2022, 0, 8).getTime(), y: 2.0 },\n { x: new Date(2022, 0, 9).getTime(), y: 2.26 },\n { x: new Date(2022, 0, 10).getTime(), y: 1.9 },\n { x: new Date(2022, 0, 11).getTime(), y: 1.9 },\n { x: new Date(2022, 0, 12).getTime(), y: 1.9 },\n { x: new Date(2022, 0, 13).getTime(), y: 1.9 },\n { x: new Date(2022, 0, 14).getTime(), y: 1.6 },\n { x: new Date(2022, 0, 15).getTime(), y: 1.6 },\n { x: new Date(2022, 0, 16).getTime(), y: 1.6 },\n { x: new Date(2022, 0, 17).getTime(), y: 1.0 },\n { x: new Date(2022, 0, 18).getTime(), y: 1.0 },\n { x: new Date(2022, 0, 19).getTime(), y: 1.0 },\n { x: new Date(2022, 0, 20).getTime(), y: 1.74 },\n { x: new Date(2022, 0, 21).getTime(), y: 1.47 },\n { x: new Date(2022, 0, 22).getTime(), y: 1.47 },\n { x: new Date(2022, 0, 23).getTime(), y: 1.47 },\n { x: new Date(2022, 0, 24).getTime(), y: 1.74 },\n { x: new Date(2022, 0, 25).getTime(), y: 1.74 },\n { x: new Date(2022, 0, 26).getTime(), y: 1.74 },\n { x: new Date(2022, 0, 27).getTime(), y: 1.5 },\n { x: new Date(2022, 0, 28).getTime(), y: 1.5 },\n { x: new Date(2022, 0, 29).getTime(), y: 1.5 },\n]\n\nconst gasoline = [\n { x: new Date(2022, 0, 1).getTime(), y: 1.35 },\n { x: new Date(2022, 0, 2).getTime(), y: 1.35 },\n { x: new Date(2022, 0, 3).getTime(), y: 1.35 },\n { x: new Date(2022, 0, 4).getTime(), y: 1.35 },\n { x: new Date(2022, 0, 5).getTime(), y: 1.9 },\n { x: new Date(2022, 0, 6).getTime(), y: 1.9 },\n { x: new Date(2022, 0, 7).getTime(), y: 1.9 },\n { x: new Date(2022, 0, 8).getTime(), y: 1.92 },\n { x: new Date(2022, 0, 9).getTime(), y: 1.5 },\n { x: new Date(2022, 0, 10).getTime(), y: 1.5 },\n { x: new Date(2022, 0, 11).getTime(), y: 1.3 },\n { x: new Date(2022, 0, 12).getTime(), y: 1.3 },\n { x: new Date(2022, 0, 13).getTime(), y: 1.3 },\n { x: new Date(2022, 0, 14).getTime(), y: 1.3 },\n { x: new Date(2022, 0, 15).getTime(), y: 1.3 },\n { x: new Date(2022, 0, 16).getTime(), y: 1.32 },\n { x: new Date(2022, 0, 17).getTime(), y: 1.4 },\n { x: new Date(2022, 0, 18).getTime(), y: 1.44 },\n { x: new Date(2022, 0, 19).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 20).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 21).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 22).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 23).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 24).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 25).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 26).getTime(), y: 1.02 },\n { x: new Date(2022, 0, 27).getTime(), y: 1.3 },\n { x: new Date(2022, 0, 28).getTime(), y: 1.3 },\n { x: new Date(2022, 0, 29).getTime(), y: 1.3 },\n]\n\n// Add two line series.\nconst lineSeries = chart.addLineSeries().setName('Diesel')\nconst lineSeries2 = chart.addLineSeries().setName('Gasoline')\n\n// Add the points to each Series\nlineSeries2.add(diesel)\nlineSeries.add(gasoline)\n\n// Setup view nicely.\nchart.getDefaultAxisY().setTitle('$/litre').setInterval({ start: 0, end: 3, stopAxisAfter: true })\n\n// Enable AutoCursor auto-fill.\nchart.setAutoCursor((cursor) => cursor.setResultTableAutoTextStyle(true).setTickMarkerXVisible(false).setTickMarkerYAutoTextStyle(true))\nconst legend = chart\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n\n// Add Chart to LegendBox.\nlegend.add(chart)\n","url":null,"readme":"_Also known as a Line Graph or Line Chart_\n\nThis example shows the basic usage of a line series. The line series is drawn on a Cartesian coordinate system and represents the relationship between two variables. Line series display information as a series of data points connected by straight line segments. They are most often used to visualize the changes in data or reveal trends in a dataset.\n\nThis type of series does not contain the visual representation of 'markers' for the data points but only continuously connected line between all of them. Additionally, it allows drawing lines in any direction.\n\nThe chart can be created with few simple lines of code:\n\n```javascript\n// Create a new ChartXY.\nconst chart = lightningChart().ChartXY()\n\n// Add a line series using default X and Y axes.\nconst series = chart.addLineSeries()\n```\n\nThe series accepts points in format `{ x: number, y: number }`. Any number of points can be added with a single call.\n\n```javascript\n// Single point.\nseries.add({ x: 50, y: 60 })\n\n// Multiple points at once.\nseries.add([\n { x: 55, y: 60 },\n { x: 60, y: 62 },\n { x: 65, y: 65 },\n])\n```\n","image":"lineSeries"},{"id":"lcjs-example-0001-simpleScatter","title":"JavaScript Scatter Chart","tags":["scatter","point","xy","legendbox"],"description":"Using a point series to display a Point Graph. Also known as a Scatter Graph, Scatter Series, Point Graph, Scatter diagram or Scattergram.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"/*\n * LightningChartJS example that showcases a simple scatter series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n AxisTickStrategies,\n emptyLine,\n PointShape,\n SolidFill,\n ColorRGBA,\n UIElementBuilders,\n UIButtonPictures,\n LegendBoxBuilders,\n Themes,\n} = lcjs\n\n// Create a XY Chart.\nconst chart = lightningChart().ChartXY({\n // theme: Themes.darkGold\n})\n\n// Modify the default X Axis to use DateTime TickStrategy, and set the axis interval\nchart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setInterval({\n start: new Date(2018, 6, 1).getTime(),\n end: new Date(2018, 8, 29).getTime(),\n })\n\nchart.getDefaultAxisY().setScrollStrategy(undefined).setTitle('Units Sold').setInterval({ start: 0, end: 2000, stopAxisAfter: false })\n\nchart.setTitle('Product Sales').setAutoCursor((cursor) => {\n cursor.setTickMarkerYVisible(false)\n cursor.setGridStrokeYStyle(emptyLine)\n})\n\n// Create a LegendBox as part of the chart.\nconst legend = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n\n// Create series.\nconst smartPhonesSeries = chart.addPointSeries({ pointShape: PointShape.Circle }).setName('Smart Phones').setPointSize(10)\nconst laptopsSeries = chart.addPointSeries({ pointShape: PointShape.Square }).setName('Laptops').setPointSize(10)\nconst smartTvSeries = chart.addPointSeries({ pointShape: PointShape.Triangle }).setName('Smart TV').setPointSize(10)\n\n// Data for the plotting\nconst smartPhoneData = [\n { x: new Date(2018, 6, 1).getTime(), y: 200 },\n { x: new Date(2018, 6, 2).getTime(), y: 220 },\n { x: new Date(2018, 6, 3).getTime(), y: 260 },\n { x: new Date(2018, 6, 4).getTime(), y: 264 },\n { x: new Date(2018, 6, 5).getTime(), y: 280 },\n { x: new Date(2018, 6, 6).getTime(), y: 288 },\n { x: new Date(2018, 6, 7).getTime(), y: 280 },\n { x: new Date(2018, 6, 8).getTime(), y: 248 },\n { x: new Date(2018, 6, 9).getTime(), y: 292 },\n { x: new Date(2018, 6, 10).getTime(), y: 308 },\n { x: new Date(2018, 6, 11).getTime(), y: 316 },\n { x: new Date(2018, 6, 12).getTime(), y: 328 },\n { x: new Date(2018, 6, 13).getTime(), y: 344 },\n { x: new Date(2018, 6, 14).getTime(), y: 360 },\n { x: new Date(2018, 6, 15).getTime(), y: 388 },\n { x: new Date(2018, 6, 16).getTime(), y: 404 },\n { x: new Date(2018, 6, 17).getTime(), y: 432 },\n { x: new Date(2018, 6, 18).getTime(), y: 444 },\n { x: new Date(2018, 6, 19).getTime(), y: 432 },\n { x: new Date(2018, 6, 20).getTime(), y: 444 },\n { x: new Date(2018, 6, 21).getTime(), y: 452 },\n { x: new Date(2018, 6, 22).getTime(), y: 460 },\n { x: new Date(2018, 6, 23).getTime(), y: 464 },\n { x: new Date(2018, 6, 24).getTime(), y: 492 },\n { x: new Date(2018, 6, 25).getTime(), y: 508 },\n { x: new Date(2018, 6, 26).getTime(), y: 492 },\n { x: new Date(2018, 6, 27).getTime(), y: 520 },\n { x: new Date(2018, 6, 28).getTime(), y: 532 },\n { x: new Date(2018, 6, 29).getTime(), y: 548 },\n { x: new Date(2018, 6, 30).getTime(), y: 576 },\n { x: new Date(2018, 6, 31).getTime(), y: 600 },\n { x: new Date(2018, 7, 1).getTime(), y: 608 },\n { x: new Date(2018, 7, 2).getTime(), y: 628 },\n { x: new Date(2018, 7, 3).getTime(), y: 624 },\n { x: new Date(2018, 7, 4).getTime(), y: 640 },\n { x: new Date(2018, 7, 5).getTime(), y: 672 },\n { x: new Date(2018, 7, 6).getTime(), y: 692 },\n { x: new Date(2018, 7, 7).getTime(), y: 716 },\n { x: new Date(2018, 7, 8).getTime(), y: 732 },\n { x: new Date(2018, 7, 9).getTime(), y: 744 },\n { x: new Date(2018, 7, 10).getTime(), y: 760 },\n { x: new Date(2018, 7, 11).getTime(), y: 792 },\n { x: new Date(2018, 7, 12).getTime(), y: 840 },\n { x: new Date(2018, 7, 13).getTime(), y: 884 },\n { x: new Date(2018, 7, 14).getTime(), y: 880 },\n { x: new Date(2018, 7, 15).getTime(), y: 900 },\n { x: new Date(2018, 7, 16).getTime(), y: 928 },\n { x: new Date(2018, 7, 17).getTime(), y: 992 },\n { x: new Date(2018, 7, 18).getTime(), y: 980 },\n { x: new Date(2018, 7, 19).getTime(), y: 1004 },\n { x: new Date(2018, 7, 20).getTime(), y: 1032 },\n { x: new Date(2018, 7, 21).getTime(), y: 1056 },\n { x: new Date(2018, 7, 22).getTime(), y: 1072 },\n { x: new Date(2018, 7, 23).getTime(), y: 1080 },\n { x: new Date(2018, 7, 24).getTime(), y: 1108 },\n { x: new Date(2018, 7, 25).getTime(), y: 1136 },\n { x: new Date(2018, 7, 26).getTime(), y: 1160 },\n { x: new Date(2018, 7, 27).getTime(), y: 1188 },\n { x: new Date(2018, 7, 28).getTime(), y: 1200 },\n { x: new Date(2018, 7, 29).getTime(), y: 1204 },\n { x: new Date(2018, 7, 30).getTime(), y: 1220 },\n { x: new Date(2018, 7, 31).getTime(), y: 1244 },\n { x: new Date(2018, 8, 1).getTime(), y: 1272 },\n { x: new Date(2018, 8, 2).getTime(), y: 1308 },\n { x: new Date(2018, 8, 3).getTime(), y: 1340 },\n { x: new Date(2018, 8, 4).getTime(), y: 1364 },\n { x: new Date(2018, 8, 5).getTime(), y: 1388 },\n { x: new Date(2018, 8, 6).getTime(), y: 1400 },\n { x: new Date(2018, 8, 7).getTime(), y: 1420 },\n { x: new Date(2018, 8, 8).getTime(), y: 1480 },\n { x: new Date(2018, 8, 9).getTime(), y: 1460 },\n { x: new Date(2018, 8, 10).getTime(), y: 1484 },\n { x: new Date(2018, 8, 11).getTime(), y: 1520 },\n { x: new Date(2018, 8, 12).getTime(), y: 1552 },\n { x: new Date(2018, 8, 13).getTime(), y: 1568 },\n { x: new Date(2018, 8, 14).getTime(), y: 1600 },\n { x: new Date(2018, 8, 15).getTime(), y: 1620 },\n { x: new Date(2018, 8, 16).getTime(), y: 1632 },\n { x: new Date(2018, 8, 17).getTime(), y: 1660 },\n { x: new Date(2018, 8, 18).getTime(), y: 1680 },\n { x: new Date(2018, 8, 19).getTime(), y: 1740 },\n { x: new Date(2018, 8, 20).getTime(), y: 1728 },\n { x: new Date(2018, 8, 21).getTime(), y: 1772 },\n { x: new Date(2018, 8, 22).getTime(), y: 1792 },\n { x: new Date(2018, 8, 23).getTime(), y: 1788 },\n { x: new Date(2018, 8, 24).getTime(), y: 1800 },\n { x: new Date(2018, 8, 25).getTime(), y: 1808 },\n { x: new Date(2018, 8, 26).getTime(), y: 1840 },\n { x: new Date(2018, 8, 27).getTime(), y: 1872 },\n { x: new Date(2018, 8, 28).getTime(), y: 1900 },\n { x: new Date(2018, 8, 29).getTime(), y: 1932 },\n]\nconst laptopsData = [\n { x: new Date(2018, 6, 1).getTime(), y: 70 },\n { x: new Date(2018, 6, 2).getTime(), y: 57.2 },\n { x: new Date(2018, 6, 3).getTime(), y: 88.4 },\n { x: new Date(2018, 6, 4).getTime(), y: 83.6 },\n { x: new Date(2018, 6, 5).getTime(), y: 80.8 },\n { x: new Date(2018, 6, 6).getTime(), y: 106 },\n { x: new Date(2018, 6, 7).getTime(), y: 117.2 },\n { x: new Date(2018, 6, 8).getTime(), y: 108.4 },\n { x: new Date(2018, 6, 9).getTime(), y: 95.6 },\n { x: new Date(2018, 6, 10).getTime(), y: 108.8 },\n { x: new Date(2018, 6, 11).getTime(), y: 118 },\n { x: new Date(2018, 6, 12).getTime(), y: 127.2 },\n { x: new Date(2018, 6, 13).getTime(), y: 138.4 },\n { x: new Date(2018, 6, 14).getTime(), y: 131.6 },\n { x: new Date(2018, 6, 15).getTime(), y: 128.8 },\n { x: new Date(2018, 6, 16).getTime(), y: 142 },\n { x: new Date(2018, 6, 17).getTime(), y: 157.2 },\n { x: new Date(2018, 6, 18).getTime(), y: 164.4 },\n { x: new Date(2018, 6, 19).getTime(), y: 163.6 },\n { x: new Date(2018, 6, 20).getTime(), y: 182.8 },\n { x: new Date(2018, 6, 21).getTime(), y: 192 },\n { x: new Date(2018, 6, 22).getTime(), y: 199.2 },\n { x: new Date(2018, 6, 23).getTime(), y: 204.4 },\n { x: new Date(2018, 6, 24).getTime(), y: 213.6 },\n { x: new Date(2018, 6, 25).getTime(), y: 226.8 },\n { x: new Date(2018, 6, 26).getTime(), y: 218 },\n { x: new Date(2018, 6, 27).getTime(), y: 229.2 },\n { x: new Date(2018, 6, 28).getTime(), y: 228.4 },\n { x: new Date(2018, 6, 29).getTime(), y: 243.6 },\n { x: new Date(2018, 6, 30).getTime(), y: 254.8 },\n { x: new Date(2018, 6, 31).getTime(), y: 264 },\n { x: new Date(2018, 7, 1).getTime(), y: 287.2 },\n { x: new Date(2018, 7, 2).getTime(), y: 266.4 },\n { x: new Date(2018, 7, 3).getTime(), y: 277.6 },\n { x: new Date(2018, 7, 4).getTime(), y: 278.8 },\n { x: new Date(2018, 7, 5).getTime(), y: 306 },\n { x: new Date(2018, 7, 6).getTime(), y: 311.2 },\n { x: new Date(2018, 7, 7).getTime(), y: 320.4 },\n { x: new Date(2018, 7, 8).getTime(), y: 333.6 },\n { x: new Date(2018, 7, 9).getTime(), y: 324.8 },\n { x: new Date(2018, 7, 10).getTime(), y: 330 },\n { x: new Date(2018, 7, 11).getTime(), y: 353.2 },\n { x: new Date(2018, 7, 12).getTime(), y: 378.4 },\n { x: new Date(2018, 7, 13).getTime(), y: 401.6 },\n { x: new Date(2018, 7, 14).getTime(), y: 396.8 },\n { x: new Date(2018, 7, 15).getTime(), y: 396 },\n { x: new Date(2018, 7, 16).getTime(), y: 413.2 },\n { x: new Date(2018, 7, 17).getTime(), y: 452.4 },\n { x: new Date(2018, 7, 18).getTime(), y: 441.6 },\n { x: new Date(2018, 7, 19).getTime(), y: 444.8 },\n { x: new Date(2018, 7, 20).getTime(), y: 462 },\n { x: new Date(2018, 7, 21).getTime(), y: 485.2 },\n { x: new Date(2018, 7, 22).getTime(), y: 492.4 },\n { x: new Date(2018, 7, 23).getTime(), y: 483.6 },\n { x: new Date(2018, 7, 24).getTime(), y: 494.8 },\n { x: new Date(2018, 7, 25).getTime(), y: 514 },\n { x: new Date(2018, 7, 26).getTime(), y: 531.2 },\n { x: new Date(2018, 7, 27).getTime(), y: 536.4 },\n { x: new Date(2018, 7, 28).getTime(), y: 535.6 },\n { x: new Date(2018, 7, 29).getTime(), y: 544.8 },\n { x: new Date(2018, 7, 30).getTime(), y: 556 },\n { x: new Date(2018, 7, 31).getTime(), y: 557.2 },\n { x: new Date(2018, 8, 1).getTime(), y: 566.4 },\n { x: new Date(2018, 8, 2).getTime(), y: 587.6 },\n { x: new Date(2018, 8, 3).getTime(), y: 602.8 },\n { x: new Date(2018, 8, 4).getTime(), y: 624 },\n { x: new Date(2018, 8, 5).getTime(), y: 639.2 },\n { x: new Date(2018, 8, 6).getTime(), y: 640.4 },\n { x: new Date(2018, 8, 7).getTime(), y: 645.6 },\n { x: new Date(2018, 8, 8).getTime(), y: 678.8 },\n { x: new Date(2018, 8, 9).getTime(), y: 660 },\n { x: new Date(2018, 8, 10).getTime(), y: 683.2 },\n { x: new Date(2018, 8, 11).getTime(), y: 694.4 },\n { x: new Date(2018, 8, 12).getTime(), y: 709.6 },\n { x: new Date(2018, 8, 13).getTime(), y: 712.8 },\n { x: new Date(2018, 8, 14).getTime(), y: 722 },\n { x: new Date(2018, 8, 15).getTime(), y: 745.2 },\n { x: new Date(2018, 8, 16).getTime(), y: 744.4 },\n { x: new Date(2018, 8, 17).getTime(), y: 755.6 },\n { x: new Date(2018, 8, 18).getTime(), y: 768.8 },\n { x: new Date(2018, 8, 19).getTime(), y: 792 },\n { x: new Date(2018, 8, 20).getTime(), y: 793.2 },\n { x: new Date(2018, 8, 21).getTime(), y: 820.4 },\n { x: new Date(2018, 8, 22).getTime(), y: 817.6 },\n { x: new Date(2018, 8, 23).getTime(), y: 820.8 },\n { x: new Date(2018, 8, 24).getTime(), y: 816 },\n { x: new Date(2018, 8, 25).getTime(), y: 831.2 },\n { x: new Date(2018, 8, 26).getTime(), y: 844.4 },\n { x: new Date(2018, 8, 27).getTime(), y: 853.6 },\n { x: new Date(2018, 8, 28).getTime(), y: 870.8 },\n { x: new Date(2018, 8, 29).getTime(), y: 886 },\n]\nconst smartTvData = [\n { x: new Date(2018, 6, 1).getTime(), y: 10 },\n { x: new Date(2018, 6, 2).getTime(), y: 15.5 },\n { x: new Date(2018, 6, 3).getTime(), y: 21.1 },\n { x: new Date(2018, 6, 4).getTime(), y: 27 },\n { x: new Date(2018, 6, 5).getTime(), y: 30.8 },\n { x: new Date(2018, 6, 6).getTime(), y: 38 },\n { x: new Date(2018, 6, 7).getTime(), y: 40 },\n { x: new Date(2018, 6, 8).getTime(), y: 44.4 },\n { x: new Date(2018, 6, 9).getTime(), y: 47.6 },\n { x: new Date(2018, 6, 10).getTime(), y: 50.8 },\n { x: new Date(2018, 6, 11).getTime(), y: 52 },\n { x: new Date(2018, 6, 12).getTime(), y: 54.2 },\n { x: new Date(2018, 6, 13).getTime(), y: 59.4 },\n { x: new Date(2018, 6, 14).getTime(), y: 65.6 },\n { x: new Date(2018, 6, 15).getTime(), y: 57.8 },\n { x: new Date(2018, 6, 16).getTime(), y: 62 },\n { x: new Date(2018, 6, 17).getTime(), y: 74.2 },\n { x: new Date(2018, 6, 18).getTime(), y: 70.4 },\n { x: new Date(2018, 6, 19).getTime(), y: 82.6 },\n { x: new Date(2018, 6, 20).getTime(), y: 74.8 },\n { x: new Date(2018, 6, 21).getTime(), y: 84 },\n { x: new Date(2018, 6, 22).getTime(), y: 87.2 },\n { x: new Date(2018, 6, 23).getTime(), y: 98.4 },\n { x: new Date(2018, 6, 24).getTime(), y: 99.6 },\n { x: new Date(2018, 6, 25).getTime(), y: 98.8 },\n { x: new Date(2018, 6, 26).getTime(), y: 98 },\n { x: new Date(2018, 6, 27).getTime(), y: 102.2 },\n { x: new Date(2018, 6, 28).getTime(), y: 99.4 },\n { x: new Date(2018, 6, 29).getTime(), y: 111.6 },\n { x: new Date(2018, 6, 30).getTime(), y: 121.8 },\n { x: new Date(2018, 6, 31).getTime(), y: 117 },\n { x: new Date(2018, 7, 1).getTime(), y: 127.2 },\n { x: new Date(2018, 7, 2).getTime(), y: 117.4 },\n { x: new Date(2018, 7, 3).getTime(), y: 125.6 },\n { x: new Date(2018, 7, 4).getTime(), y: 131.8 },\n { x: new Date(2018, 7, 5).getTime(), y: 136 },\n { x: new Date(2018, 7, 6).getTime(), y: 138.2 },\n { x: new Date(2018, 7, 7).getTime(), y: 142.4 },\n { x: new Date(2018, 7, 8).getTime(), y: 148.6 },\n { x: new Date(2018, 7, 9).getTime(), y: 146.8 },\n { x: new Date(2018, 7, 10).getTime(), y: 157 },\n { x: new Date(2018, 7, 11).getTime(), y: 159.2 },\n { x: new Date(2018, 7, 12).getTime(), y: 168.4 },\n { x: new Date(2018, 7, 13).getTime(), y: 184.6 },\n { x: new Date(2018, 7, 14).getTime(), y: 181.8 },\n { x: new Date(2018, 7, 15).getTime(), y: 189 },\n { x: new Date(2018, 7, 16).getTime(), y: 195.2 },\n { x: new Date(2018, 7, 17).getTime(), y: 202.4 },\n { x: new Date(2018, 7, 18).getTime(), y: 197.6 },\n { x: new Date(2018, 7, 19).getTime(), y: 207.8 },\n { x: new Date(2018, 7, 20).getTime(), y: 218 },\n { x: new Date(2018, 7, 21).getTime(), y: 216.2 },\n { x: new Date(2018, 7, 22).getTime(), y: 221.4 },\n { x: new Date(2018, 7, 23).getTime(), y: 226.6 },\n { x: new Date(2018, 7, 24).getTime(), y: 231.8 },\n { x: new Date(2018, 7, 25).getTime(), y: 233 },\n { x: new Date(2018, 7, 26).getTime(), y: 241.2 },\n { x: new Date(2018, 7, 27).getTime(), y: 250.4 },\n { x: new Date(2018, 7, 28).getTime(), y: 246.6 },\n { x: new Date(2018, 7, 29).getTime(), y: 248.8 },\n { x: new Date(2018, 7, 30).getTime(), y: 251 },\n { x: new Date(2018, 7, 31).getTime(), y: 254.2 },\n { x: new Date(2018, 8, 1).getTime(), y: 267.4 },\n { x: new Date(2018, 8, 2).getTime(), y: 275.6 },\n { x: new Date(2018, 8, 3).getTime(), y: 282.8 },\n { x: new Date(2018, 8, 4).getTime(), y: 285 },\n { x: new Date(2018, 8, 5).getTime(), y: 291.2 },\n { x: new Date(2018, 8, 6).getTime(), y: 292.4 },\n { x: new Date(2018, 8, 7).getTime(), y: 292.6 },\n { x: new Date(2018, 8, 8).getTime(), y: 304.8 },\n { x: new Date(2018, 8, 9).getTime(), y: 307 },\n { x: new Date(2018, 8, 10).getTime(), y: 313.2 },\n { x: new Date(2018, 8, 11).getTime(), y: 317.4 },\n { x: new Date(2018, 8, 12).getTime(), y: 326.6 },\n { x: new Date(2018, 8, 13).getTime(), y: 327.8 },\n { x: new Date(2018, 8, 14).getTime(), y: 338 },\n { x: new Date(2018, 8, 15).getTime(), y: 342.2 },\n { x: new Date(2018, 8, 16).getTime(), y: 345.4 },\n { x: new Date(2018, 8, 17).getTime(), y: 350.6 },\n { x: new Date(2018, 8, 18).getTime(), y: 347.8 },\n { x: new Date(2018, 8, 19).getTime(), y: 371 },\n { x: new Date(2018, 8, 20).getTime(), y: 362.2 },\n { x: new Date(2018, 8, 21).getTime(), y: 376.4 },\n { x: new Date(2018, 8, 22).getTime(), y: 378.6 },\n { x: new Date(2018, 8, 23).getTime(), y: 378.8 },\n { x: new Date(2018, 8, 24).getTime(), y: 372 },\n { x: new Date(2018, 8, 25).getTime(), y: 375.2 },\n { x: new Date(2018, 8, 26).getTime(), y: 385.4 },\n { x: new Date(2018, 8, 27).getTime(), y: 390.6 },\n { x: new Date(2018, 8, 28).getTime(), y: 396.8 },\n { x: new Date(2018, 8, 29).getTime(), y: 406 },\n]\n\n// Adding points to the series\nsmartPhonesSeries.add(smartPhoneData)\nlaptopsSeries.add(laptopsData)\nsmartTvSeries.add(smartTvData)\n\n// Add series to LegendBox and style entries.\nlegend.add(smartPhonesSeries)\nlegend.add(laptopsSeries)\nlegend.add(smartTvSeries)\n\n// Enable AutoCursor auto-fill.\nchart.setAutoCursor((cursor) => {\n cursor\n .setResultTableAutoTextStyle(true)\n .setTickMarkerXVisible(false)\n .setTickMarkerXAutoTextStyle(false)\n .setTickMarkerYAutoTextStyle(false)\n})\n","url":null,"readme":"_Also known as a Scatter Graph, Scatter Series, Point Graph, Scatter diagram or Scattergram_\n\nThis example shows a simple Point Graph with points drawn using PointSeries for a visual representation of the data points 'markers'. The point graph is a type of chart or mathematical diagram drawn on a Cartesian coordinate system and represents the relationship between two variables.\n\nThis type of series does not contain the visual representation of lines for the connection of data points but only data 'markers'.\n\nThe chart can be created with few simple lines of code:\n\n```javascript\n// Add a scatter series with markers using default X and Y axes.\nconst pointSeries = chart.addPointSeries()\n```\n\nThe PointSeries API allows configuring the visual representation of data markers.\n\n- PointShape: _enum_\n\n | PointShape | Description |\n | :--------: | :-------------------------------------: |\n | Rectangle | The series with rectangle-shaped points |\n | Triangle | The series with triangle-shaped points. |\n | Square | The series with square-shaped points. |\n\n PointShape must be specified upon creation of Series!\n\n ```javascript\n // Add a scatter series with markers using default X and Y axes. Select Circle PointShape.\n const pointSeries = chart.addPointSeries({ pointShape: PointShape.Circle })\n ```\n\n- PointSize: _number_\n\n ```javascript\n pointSeries.setPointSize(5.0)\n ```\n\n- FillStyle\n Scatter Series with markers provides an ability to specify a fill style of data markers as well as individual point fill style (explained further).\n\n ```javascript\n pointSeries.setPointFillStyle(fillStyleObject)\n ```\n\n- IndividualPointFill: _FillStyle_\n\n The style indicates individual per point coloring. The style enables the usage of individual fill taken from the input.\n The series can accept points in format `{ x: number, y: number, color: Color }`\n If the color is not provided during the input of data points ( e.g. in format `{ x: number, y: number }` ), the configurable fallback color is used.\n\n ```javascript\n // Create the instance of IndividualPointFill fill style.\n const individualStyle = new IndividualPointFill()\n // Set red color as a fallback color\n individualStyle.setFallbackColor(ColorRGBA(255, 0, 0))\n ```\n\nAs it was mentioned before, the series accepts points in format `{ x: number, y: number: color: Color }` with specified IndividualPointFill to enable individual point coloring or `{ x: number, y: number }` for other fill styles. Any number of points can be added with a single call similarly to line series with point markers.\n\n- Dataset without colors. If IndividualPointFill is specified, the fallback color is used. Otherwise, the specified fill style is used.\n\n ```javascript\n // Dataset of Vec2 data points without color.\n pointSeries.add([\n { x: 5, y: 10 },\n { x: 7.5, y: 20 },\n { x: 10, y: 30 },\n ])\n ```\n\n- Dataset with individual colors. If IndividualPointFill is specified, the color from data point or fallback color is used. Otherwise, the specified fill style is used.\n\n ```javascript\n // Dataset of Vec2Color data points with individual color.\n pointSeries.add([\n // use red color if IndividualPointFill is specified\n { x: 2.5, y: 0, color: ColorRGBA(255, 0, 0) },\n // use fallback color if IndividualPointFill is specified\n { x: 5, y: 10 },\n // use green color if IndividualPointFill is specified\n { x: 7.5, y: 20, color: ColorRGBA(0, 255, 0) },\n // use blue color if IndividualPointFill is specified\n { x: 10, y: 30, color: ColorRGBA(0, 0, 255) },\n ])\n ```\n","image":"simpleScatter"},{"id":"lcjs-example-0002-styledSplines","title":"JavaScript Spline Line Chart","tags":["spline","xy"],"description":"Example showing how to draw and style Spline Series.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases creation and styling of spline-series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, AxisScrollStrategies, PointShape, SolidFill, ColorHEX, Themes } = lcjs\nconst { createProgressiveRandomGenerator } = xydata\n\n// Decide on an origin for DateTime axis.\nconst dateOrigin = new Date()\nconst dateOriginTime = dateOrigin.getTime()\n\nconst chart = lightningChart().ChartXY({\n // theme: Themes.darkGold\n})\n\nchart\n .setTitle('Live power consumption')\n // Modify the default X Axis to use DateTime TickStrategy, and set the origin for the DateTime Axis.\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime, (tickStrategy) => tickStrategy.setDateOrigin(dateOrigin))\n // Progressive DateTime view of 61 seconds.\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 61 * 1000, stopAxisAfter: false }))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\nchart\n .getDefaultAxisY()\n .setTitle('Power consumption (kW)')\n .setInterval({ start: 0, end: 500, stopAxisAfter: false })\n .setScrollStrategy(AxisScrollStrategies.expansion)\n\nconst series = chart\n .addSplineSeries({ pointShape: PointShape.Circle })\n .setName('Power consumption')\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((tableBuilder, series, x, y) =>\n tableBuilder\n .addRow(series.getName())\n .addRow(series.axisX.formatValue(x))\n .addRow(series.axisY.formatValue(y) + ' kW'),\n )\n\n// Stream some random data.\ncreateProgressiveRandomGenerator()\n .setNumberOfPoints(10000)\n .generate()\n .setStreamBatchSize(1)\n .setStreamInterval(1000)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => {\n point.x = Date.now() - dateOriginTime\n point.y = point.y * 2000\n series.add(point)\n })\n","url":null,"readme":"This example shows how to draw and style spline-series.\n\nFirst create the series using chart method.\n\n```javascript\n// Add a spline series using default X and Y axes.\nconst splineSeries = chart.addSplineSeries()\n```\n\n## Option 1: Styling using a style object.\n\nThe first option for styling of series is to create a new object that contains the necessary information about visual settings. In the case of line-series, the object must be type of _SolidLine_ to be visible.\n\n```javascript\n// Create a new instance of visible solid line-style.\nconst strokeStyle = new SolidLine()\n // Set desired fill style of the stroke.\n .setFillStyle(\n // SolidLine can have only SolidFill fill-style.\n new SolidFill().setColor(ColorRGBA(96, 204, 232)),\n )\n // Set thickness of the stroke.\n .setThickness(5.0)\n\n// Apply styling settings to the series.\nsplineSeries.setStrokeStyle(strokeStyle)\n```\n\n## Option 2: Styling using a mutator function.\n\nUsually, it can be even more easy to simply modify the existing _Style_ of a component, rather than constructing a new one. This is done using so-called _mutator-functions_. Here's an example:\n\n```javascript\n// Modify the previous Stroke style of a SplineSeries, by overriding its previous thickness.\nsplineSeries.setStrokeStyle((strokeStyle) => strokeStyle.setThickness(1.0))\n```\n\nOur coding practices include fluent, self-returning API, which allows us to easily call multiple setters in one statement.\n\n```javascript\nsplineSeries\n .setStrokeStyle(strokeStyle)\n // 'transparentFill' is a static constant\n // that needs to be imported from the library in order to be used.\n // It is used to draw things with transparent fill that aren't disposable\n // - like the points of a PointLineSeries.\n .setPointFillStyle(transparentFill)\n```\n","image":"styledSplines"},{"id":"lcjs-example-0003-pointLinePlot","title":"JavaScript Point Line Chart","tags":["point-line","xy","point","line"],"description":"Basic use of Point Line Series. Also known as a Line Series, Line Graph, Line Chart, and Line with Markers.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases point & line -series with different point types.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PointShape, Themes } = lcjs\n\nconst pointSize = 10\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Car Mileage Comparison')\n\n// Add point line series with different point styles with a few static points.\n// Combine different LineStyles, FillStyles and PointShapes.\n\n// Add line series with rectangle-shaped points.\nchart\n .addPointLineSeries()\n .setName('Sports Car')\n .setPointSize(pointSize)\n .add([\n { x: 0, y: 0 },\n { x: 50, y: 10 },\n { x: 80, y: 20 },\n { x: 100, y: 30 },\n { x: 150, y: 40 },\n { x: 180, y: 50 },\n { x: 230, y: 60 },\n { x: 290, y: 70 },\n ])\n\n// Add line series with circle-shaped points.\nchart\n .addPointLineSeries({ pointShape: PointShape.Circle })\n .setName('Family Car')\n .setPointSize(pointSize)\n .add([\n { x: 0, y: 0 },\n { x: 100, y: 10 },\n { x: 230, y: 20 },\n { x: 390, y: 30 },\n { x: 470, y: 40 },\n { x: 540, y: 50 },\n { x: 600, y: 60 },\n { x: 800, y: 70 },\n ])\n\n// Add line series with triangle-shaped points.\nchart\n .addPointLineSeries({ pointShape: PointShape.Triangle })\n .setName('Pick-up Car')\n .setPointSize(pointSize)\n .add([\n { x: 0, y: 0 },\n { x: 80, y: 10 },\n { x: 100, y: 20 },\n { x: 150, y: 30 },\n { x: 230, y: 40 },\n { x: 380, y: 50 },\n { x: 450, y: 60 },\n { x: 580, y: 70 },\n ])\n\n// Setup view nicely.\nchart.getDefaultAxisX().setInterval({ start: 0, end: 1000 }).setTitle('Km')\nchart.getDefaultAxisY().setInterval({ start: 0, end: 100 }).setTitle('Litre')\nchart.setAutoCursor((cursor) =>\n cursor.setResultTableAutoTextStyle(true).setTickMarkerXAutoTextStyle(true).setTickMarkerYAutoTextStyle(true),\n)\n\n// Add Legend Box.\nconst legend = chart.addLegendBox().add(chart)\n","url":null,"readme":"_Also known as a Line Series, Line Graph, Line Chart, and Line with Markers_\n\nThis example shows the basic usage of a line series with 'markers' for visual representation of the data points. Similarly to line series, it is drawn on a Cartesian coordinate system and represents the relationship between two variables. Line series display information as a series of data points connected by straight line segments in any direction. This type of series additionally draws data markers on top of the line at the location specified in a dataset.\n\nThe chart can be created with few simple lines of code:\n\n```javascript\n// Add a line series with markers using default X and Y axes.\nconst lineSeries = chart.addPointLineSeries()\n```\n\nLine Series with markers provides an ability to specify styles for both markers and lines individually.\n\n```javascript\nlineSeries.setStrokeStyle(lineStyleObject).setPointFillStyle(fillStyleObject)\n```\n\nIt shares the same API with the PointSeries, which allows configuring the visual representation of data markers.\n\n- PointShape: _enum_\n\n | PointShape | Description |\n | :--------: | :-------------------------------------: |\n | Rectangle | The series with rectangle-shaped points |\n | Triangle | The series with triangle-shaped points. |\n | Square | The series with square-shaped points. |\n\n PointShape must be specified upon creation of Series!\n\n ```javascript\n // Add a line series with markers using default X and Y axes. Select Circle PointShape.\n const lineSeries = chart.addPointLineSeries({\n pointShape: PointShape.Circle,\n })\n ```\n\n- PointSize: _number_\n\n ```javascript\n lineSeries.setPointSize(5.0)\n ```\n\n- IndividualPointFill: _FillStyle_\n\n The style indicates individual per point coloring. The style enables the usage of individual fill taken from the input.\n The series can accept points in format `{ x: number, y: number, color: Color }`\n If the color is not provided during the input of data points ( e.g. in format `{ x: number, y: number }` ), the configurable fallback color is used.\n\n ```javascript\n // Create the instance of IndividualPointFill fill style.\n const individualStyle = new IndividualPointFill()\n // Set red color as a fallback color\n individualStyle.setFallbackColor(ColorRGBA(255, 0, 0))\n ```\n\nAs it was mentioned before, the series accepts points in format `{ x: number, y: number: color: Color }` with specified IndividualPointFill to enable individual point coloring or `{ x: number, y: number }` for other fill styles. Any number of points can be added with a single call similarly to line series with point markers.\n\n- Dataset without colors.\n\n - If IndividualPointFill is specified, the fallback color is used. Otherwise, the specified fill style is used.\n\n ```javascript\n // Dataset of Vec2 data points without color.\n lineSeries.add([\n { x: 5, y: 10 },\n { x: 7.5, y: 20 },\n { x: 10, y: 30 },\n ])\n ```\n\n- Dataset with individual colors.\n\n - If IndividualPointFill is specified, the color from data point or fallback color is used. Otherwise, the specified fill style is used.\n\n ```javascript\n // Dataset of Vec2Color data points with individual color.\n lineSeries.add([\n // use red color if IndividualPointFill is specified\n { x: 2.5, y: 0, color: ColorRGBA(255, 0, 0) },\n // use fallback color if IndividualPointFill is specified\n { x: 5, y: 10 },\n // use green color if IndividualPointFill is specified\n { x: 7.5, y: 20, color: ColorRGBA(0, 255, 0) },\n // use blue color if IndividualPointFill is specified\n { x: 10, y: 30, color: ColorRGBA(0, 0, 255) },\n ])\n ```\n","image":"pointLinePlot"},{"id":"lcjs-example-0004-1MillionPointsLineTrace","title":"1 Million Points JavaScript Line Chart","tags":["line","xy","datapattern"],"description":"Example plotting a million data points using progressive Line Series.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases a line series with 1 Million streamed points with animated transitions.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, Themes } = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = xydata\n\n// Create a XY Chart.\nconst chart = lightningChart().ChartXY({\n // theme: Themes.darkGold\n})\n\n// Create line series optimized for regular progressive X data.\nconst series = chart.addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n // regularProgressiveStep: true => The X step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n})\n\n// Generate traced points stream using 'xydata'-library.\nchart.setTitle('Generating test data...')\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(1 * 1000 * 1000)\n .generate()\n .toPromise()\n .then((data) => {\n chart.setTitle('1 Million Points Line Trace')\n const dataLen = data.length\n let dataPointsCount = 0\n const addPoints = () => {\n const addDataPointsCount = 20000\n const newDataPoints = data.slice(dataPointsCount, dataPointsCount + addDataPointsCount)\n series.add(newDataPoints)\n dataPointsCount += addDataPointsCount\n if (dataPointsCount < dataLen) {\n requestAnimationFrame(addPoints)\n }\n }\n addPoints()\n })\n","url":null,"readme":"This example plots a million data points in an instant using line series.\n\n## Progressive data optimizations\n\nBy default, `LineSeries` can take list of XY coordinates in any order, connecting them with a line stroke.\nHowever, in a lot of applications, the input data comes in a distinct order, for example, X coordinates describe a timestamp which increases between each consecutive data point. We refer to this as a _progressive data pattern_.\n\n`LineSeries` is coupled together with highly sophisticated optimizations that can be enabled in applications where input data follows a _data pattern_. This example showcases the `'ProgressiveX'` _pattern_.\n\n### Enabling data pattern optimizations\n\n_Data pattern_ must be specified when the _series_ is created:\n\n```typescript\n// Create LineSeries with 'ProgressiveX' data pattern.\nconst series = ChartXY.addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n // regularProgressiveStep: true => The X step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n})\n```\n\nAvailable _data patterns_ are:\n\n- `'ProgressiveX'`: Each consecutive data point has increased X coordinate.\n- `'ProgressiveY'`: Each consecutive data point has increased Y coordinate.\n- `'RegressiveX'`: Each consecutive data point has decreased X coordinate.\n- `'RegressiveX'`: Each consecutive data point has decreased Y coordinate.\n\nThe pattern of data can be identified even further with the optional `regularProgressiveStep` property.\nThis can be enabled when the _progressive step_ (for example, `'ProgressiveX'` -> X step) between each data point is regular, leading to even more significant optimizations.\n\n### Side-effects and good to know\n\nWhen a series is configured with a _data pattern_, the rendering process makes logical deductions and ssumptions on the user input data, according to the _data pattern_ specification. **If the supplied input data does not follow the specification, rendering errors or even crashes can occur.** If you run into strange issues, first see if disabling the _data pattern_ helps, or if your input data is somehow invalid.\n\n## Automatic Axis scrolling\n\nThe scrolling of data in progressive series can also be automated and optimized by specifying **_ScrollStrategy_** for both x-axis & y-axis to perform the scrolling efficiently.\n\n- Select **_AxisScrollStrategies.expansion_**. Automatically increases a scale if some points are out of scale. Retains progressivity/regressivity of used scale.\n- Select **_AxisScrollStrategies.fitting_**. Automatically increases a scale if some points are out of scale and reduces it if there is too much empty space. Retains progressivity/regressivity of used scale.\n- Select **_AxisScrollStrategies.progressive_**. Automatically scrolls a scale in a positive direction.\n- Select **_AxisScrollStrategies.regressive_**. Automatically scrolls a scale to a negative direction.\n- Pass **_undefined_** to disable automatic scrolling. Scale can then be manually set using _setInterval_ method of **_Axis_**\n","image":"1mPointsLineTrace"},{"id":"lcjs-example-0005-stepPlot","title":"JavaScript Step Series","tags":["step","xy","legendbox"],"description":"Example showing the use of a Step Series with different preprocessing modes. Also known as a Step Graph or Step Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases step-series with dynamically changeable stepping-options.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, StepOptions, UILayoutBuilders, UIElementBuilders, emptyFill, UIOrigins, AxisTickStrategies, Themes } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Survey Report')\n\nconst reportTableXlabel = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\n// Create step series for each available step-option.\n// The step-function can not be changed during runtime!\nconst stepSeries = []\nconst addSeries = (stepOption) =>\n stepSeries.push(\n chart\n .addStepSeries({ mode: stepOption, automaticColorIndex: 0 })\n // Show identifier of stepping option as the name of the Series.\n .setName(StepOptions[stepOption])\n .setVisible(false)\n .setCursorResultTableFormatter((builder, _, xValue, yValue) =>\n builder\n .addRow('Survey Report')\n .addRow('Month: ' + reportTableXlabel[Math.trunc(xValue)])\n .addRow('Amount: ' + yValue.toFixed(2)),\n ),\n )\naddSeries(StepOptions.before)\naddSeries(StepOptions.middle)\naddSeries(StepOptions.after)\n\n// X-axis of the series\nconst axisX = chart\n .getDefaultAxisX()\n .setMouseInteractions(false)\n // Disable default ticks.\n .setTickStrategy(AxisTickStrategies.Empty)\n .setMouseInteractions(false)\n\n// Enable AutoCursor auto-fill.\nchart.setAutoCursor((cursor) => {\n cursor.setResultTableAutoTextStyle(true).setTickMarkerXVisible(false).setTickMarkerYAutoTextStyle(true)\n})\n\n// Generate progressive points and add it to every series.\nconst data = [\n {\n x: 'Jan',\n y: 1,\n },\n {\n x: 'Feb',\n y: 11,\n },\n {\n x: 'Mar',\n y: 21,\n },\n {\n x: 'Apr',\n y: 15,\n },\n {\n x: 'May',\n y: 57,\n },\n {\n x: 'Jun',\n y: 77,\n },\n {\n x: 'Jul',\n y: 47,\n },\n {\n x: 'Aug',\n y: 24,\n },\n {\n x: 'Sep',\n y: 76,\n },\n {\n x: 'Oct',\n y: 88,\n },\n {\n x: 'Nov',\n y: 99,\n },\n {\n x: 'Dec',\n y: 3,\n },\n]\nlet x = 0\nlet changedData = []\n\nstepSeries.forEach((values, i) => {\n changedData = data.map((changex, index) => ({ x: index, y: changex.y }))\n values.add(changedData)\n})\n\nchangedData.forEach((_, index) => {\n // Add custom tick, more like categorical axis.\n axisX\n .addCustomTick()\n .setValue(index)\n .setGridStrokeLength(0)\n .setTextFormatter((_) => data[index].x)\n x += 1\n})\nchart.getDefaultAxisY().setTitle('Amount / Month').setInterval({ start: 0, end: 100, stopAxisAfter: false })\n\n// Add UI controls for switching between step-mode-options.\n// NOTE: This is not the focus of the example, and will be better covered elsewhere.\nconst stepControls = chart.addUIElement(UILayoutBuilders.Column)\nstepControls.addElement(UIElementBuilders.TextBox).setText('Step options')\nconst buttonLayout = stepControls.addElement(UILayoutBuilders.Row)\nconst radioButtons = []\nlet switching = false\nconst addRadioButton = (series) => {\n const checkBox = buttonLayout.addElement(UIElementBuilders.CheckBox).setButtonOnFillStyle(emptyFill).setButtonOffFillStyle(emptyFill)\n radioButtons.push(checkBox)\n series.attach(checkBox)\n checkBox.setOn(false)\n // Add radio button logic immediately afterwards so that it is applied after plot.\n // Attach logic (otherwise plot logic will override this)\n setTimeout(() => {\n checkBox.onSwitch((activatedButton, state) => {\n if (switching) {\n return\n }\n switching = true\n if (state) {\n // Deactivate other buttons\n for (const button of radioButtons) if (button !== activatedButton) button.setOn(false)\n } else {\n // Prevent turning of the selected option\n activatedButton.setOn(true)\n }\n switching = false\n })\n }, 100)\n}\naddRadioButton(stepSeries[0])\naddRadioButton(stepSeries[1])\naddRadioButton(stepSeries[2])\nconst margin = 10\nstepControls.setPosition({ x: 30, y: 80 }).setOrigin(UIOrigins.CenterBottom).setMargin(margin)\n\n// Apply initial selection\nstepSeries[1].setVisible(true)\n","url":null,"readme":"_Also known as a Step Graph or Step Chart_\n\nThis example shows the basic usage of a step series with different preprocessing modes. Similarly to line series, it is drawn on a Cartesian coordinate system and represents the relationship between two variables. However, it is used to visualize the changing variables that have irregular fluctuation forming a step-like progression.\n\nThe data that changes at irregular intervals remains constant between the changes. The vertical risers of a chart denote changes in the data and their magnitude, the horizontal - the constancy of the data within the interval.\n\n![](./assets/comparison.png 'Line Chart vs. Step Chart')\n\nCreation of a step series is equal to any basic line series, with the exception of an additional optional parameter, which specifies the 'step option' of the series.\n\n```javascript\nconst stepSeries = chart.addStepSeries({ mode: stepOption })\n```\n\nThere is no need in data preparation, step chart will be generated automatically from the provided curve based on selected step mode.\n\n| Step Options | Description |\n| :----------: | :----------------------------------------------------: |\n| before | The magnitude changes before the next interval start. |\n| middle | The magnitude changes at the midpoint of the interval. |\n| after | The magnitude changes after the previous interval end. |\n\nThe series accepts points in format `{ x: number, y: number: color: Color }` with specified IndividualPointFill to enable individual point coloring or `{ x: number, y: number }` for other fill styles. Any number of points can be added with a single call similarly to line series with point markers.\n","image":"stepPlot"},{"id":"lcjs-example-0006-pointClusters","title":"JavaScript Point Clusters Chart","tags":["point-cluster","point","xy","rectangle"],"description":"Example showing how to create clusters of differently colored points. Using Point Series.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"/*\n * LightningChartJS example that showcases clusters of points.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, SolidFill, SolidLine, ColorPalettes, emptyFill, AxisTickStrategies, PointShape, Themes } = lcjs\n\nconst pointSize = 10\n// Decide on an origin for DateTime axis.\nconst dateOrigin = new Date(2018, 8, 1)\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Salary differences between Kuopio and Helsinki')\n .setPadding({\n right: 50,\n })\n\n// Modify the default X Axis to use DateTime TickStrategy, and set the origin for the DateTime Axis.\nchart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setInterval({\n start: new Date(2018, 7, 31).getTime(),\n end: new Date(2018, 9, 1).getTime(),\n })\n\n// Add a series for each cluster of points\nconst fstClusterSeries = chart.addPointSeries({ pointShape: PointShape.Circle }).setName('Kuopio').setPointSize(pointSize)\nconst sndClusterSeries = chart.addPointSeries({ pointShape: PointShape.Triangle }).setName('Helsinki').setPointSize(pointSize)\n\nconst kuopioPoints = [\n { x: 12.152641878669275, y: 5335.336538461539 },\n { x: 11.62426614481409, y: 5259.615384615385 },\n { x: 10.919765166340508, y: 5082.932692307692 },\n { x: 10.156555772994128, y: 4923.076923076923 },\n { x: 9.334637964774949, y: 4796.875 },\n { x: 8.101761252446183, y: 4704.326923076923 },\n { x: 6.634050880626223, y: 4620.192307692308 },\n { x: 3.933463796477495, y: 4418.2692307692305 },\n { x: 3.111545988258317, y: 4342.548076923077 },\n { x: 2.8180039138943247, y: 4199.5192307692305 },\n { x: 2.8180039138943247, y: 4014.423076923077 },\n { x: 2.4657534246575334, y: 3930.2884615384614 },\n { x: 2.407045009784736, y: 3745.1923076923076 },\n { x: 2.935420743639921, y: 3408.653846153846 },\n { x: 3.6399217221135025, y: 3307.6923076923076 },\n { x: 5.107632093933463, y: 3181.4903846153848 },\n { x: 6.868884540117416, y: 3181.4903846153848 },\n { x: 7.749510763209393, y: 3198.3173076923076 },\n { x: 9.217221135029353, y: 3316.1057692307695 },\n { x: 10.215264187866929, y: 3475.9615384615386 },\n { x: 11.037181996086105, y: 3585.3365384615386 },\n { x: 12.035225048923678, y: 3719.951923076923 },\n { x: 12.798434442270057, y: 3778.846153846154 },\n { x: 16.027397260273972, y: 3820.9134615384614 },\n { x: 22.544031311154598, y: 3896.6346153846152 },\n { x: 24.187866927592953, y: 3963.9423076923076 },\n { x: 24.83365949119374, y: 4325.721153846154 },\n { x: 24.65753424657534, y: 4435.096153846154 },\n { x: 24.422700587084147, y: 4603.365384615385 },\n { x: 24.129158512720156, y: 4754.807692307692 },\n { x: 22.4853228962818, y: 5082.932692307692 },\n { x: 21.78082191780822, y: 5167.067307692308 },\n { x: 19.080234833659492, y: 5562.5 },\n { x: 17.31898238747554, y: 5722.3557692307695 },\n { x: 16.262230919765166, y: 5865.384615384615 },\n { x: 15.264187866927593, y: 5924.278846153846 },\n { x: 14.324853228962818, y: 5966.346153846154 },\n { x: 11.859099804305282, y: 5915.865384615385 },\n { x: 10.919765166340508, y: 5865.384615384615 },\n { x: 7.749510763209393, y: 5579.326923076923 },\n { x: 6.164383561643835, y: 5419.471153846154 },\n { x: 5.048923679060665, y: 5108.173076923077 },\n { x: 3.5812133072407044, y: 4460.336538461539 },\n { x: 2.8767123287671232, y: 4174.278846153846 },\n { x: 0.3522504892367906, y: 4342.548076923077 },\n { x: 0.3522504892367906, y: 4056.4903846153848 },\n { x: 0.23483365949119372, y: 3551.6826923076924 },\n { x: 0.410958904109589, y: 3282.4519230769233 },\n { x: 0.23483365949119372, y: 3046.875 },\n { x: 0.410958904109589, y: 2887.019230769231 },\n { x: 0.6457925636007827, y: 2693.5096153846152 },\n { x: 2.759295499021526, y: 2643.028846153846 },\n { x: 3.7573385518590996, y: 2643.028846153846 },\n { x: 5.98825831702544, y: 2668.269230769231 },\n { x: 9.510763209393346, y: 2693.5096153846152 },\n { x: 10.391389432485322, y: 2802.8846153846157 },\n { x: 11.037181996086105, y: 3030.048076923077 },\n { x: 11.741682974559687, y: 3274.038461538462 },\n { x: 12.857142857142856, y: 3475.9615384615386 },\n { x: 14.383561643835616, y: 3602.1634615384614 },\n { x: 15.205479452054796, y: 3652.6442307692305 },\n { x: 16.43835616438356, y: 3711.5384615384614 },\n { x: 17.96477495107632, y: 3804.0865384615386 },\n { x: 19.256360078277883, y: 4090.1442307692305 },\n { x: 19.021526418786692, y: 4233.173076923077 },\n { x: 17.201565557729943, y: 4384.615384615385 },\n { x: 15.088062622309199, y: 4435.096153846154 },\n { x: 12.270058708414872, y: 4376.201923076923 },\n { x: 10.626223091976517, y: 4207.932692307692 },\n { x: 8.336594911937379, y: 3862.9807692307695 },\n { x: 7.808219178082191, y: 3770.4326923076924 },\n { x: 5.283757338551859, y: 4485.576923076923 },\n { x: 4.87279843444227, y: 3896.6346153846152 },\n { x: 4.285714285714286, y: 3669.471153846154 },\n { x: 2.172211350293542, y: 4578.125 },\n { x: 3.933463796477495, y: 4981.971153846154 },\n { x: 5.518590998043054, y: 5335.336538461539 },\n { x: 7.749510763209393, y: 5798.076923076923 },\n { x: 10.09784735812133, y: 5688.701923076923 },\n { x: 9.628180039138943, y: 5352.163461538461 },\n { x: 13.209393346379647, y: 5570.913461538461 },\n { x: 12.68101761252446, y: 5772.836538461539 },\n { x: 14.794520547945204, y: 5688.701923076923 },\n { x: 16.203522504892366, y: 5461.538461538461 },\n { x: 18.493150684931507, y: 5183.8942307692305 },\n { x: 20.19569471624266, y: 4998.798076923077 },\n { x: 21.42857142857143, y: 4788.461538461539 },\n { x: 22.07436399217221, y: 4443.509615384615 },\n { x: 22.720156555772995, y: 4123.798076923077 },\n { x: 21.722113502935418, y: 4039.6634615384614 },\n { x: 19.608610567514678, y: 4443.509615384615 },\n { x: 18.786692759295498, y: 4586.538461538461 },\n { x: 16.731898238747554, y: 4822.115384615385 },\n { x: 14.500978473581215, y: 5032.451923076923 },\n { x: 13.972602739726026, y: 5099.759615384615 },\n { x: 12.38747553816047, y: 4754.807692307692 },\n { x: 14.911937377690801, y: 4687.5 },\n { x: 14.500978473581215, y: 4822.115384615385 },\n { x: 16.027397260273972, y: 5125 },\n { x: 15.029354207436398, y: 5394.2307692307695 },\n { x: 13.737769080234832, y: 5436.298076923077 },\n { x: 15.322896281800393, y: 5242.788461538461 },\n { x: 17.495107632093934, y: 5183.8942307692305 },\n { x: 18.904109589041095, y: 4838.942307692308 },\n { x: 20.900195694716242, y: 4603.365384615385 },\n { x: 22.133072407045006, y: 4620.192307692308 },\n { x: 22.367906066536204, y: 4737.9807692307695 },\n { x: 21.78082191780822, y: 4889.423076923077 },\n { x: 20.54794520547945, y: 5116.586538461539 },\n { x: 19.49119373776908, y: 5259.615384615385 },\n { x: 18.258317025440316, y: 5411.057692307692 },\n { x: 17.436399217221137, y: 5478.365384615385 },\n { x: 16.497064579256357, y: 5621.3942307692305 },\n { x: 14.383561643835616, y: 5814.903846153846 },\n { x: 13.561643835616438, y: 5840.1442307692305 },\n { x: 12.093933463796477, y: 5646.634615384615 },\n { x: 11.037181996086105, y: 5411.057692307692 },\n { x: 10.861056751467709, y: 5293.2692307692305 },\n { x: 9.921722113502934, y: 5150.240384615385 },\n { x: 8.336594911937379, y: 5301.682692307692 },\n { x: 6.927592954990215, y: 5217.548076923077 },\n { x: 6.34050880626223, y: 5015.625 },\n { x: 5.518590998043054, y: 4889.423076923077 },\n { x: 2.5244618395303324, y: 4679.086538461539 },\n { x: 4.1682974559686885, y: 4780.048076923077 },\n { x: 3.170254403131115, y: 4805.288461538461 },\n { x: 2.407045009784736, y: 4527.6442307692305 },\n { x: 1.8199608610567513, y: 4334.134615384615 },\n { x: 1.467710371819961, y: 4048.076923076923 },\n { x: 1.467710371819961, y: 3888.221153846154 },\n { x: 1.2915851272015655, y: 3711.5384615384614 },\n { x: 1.11545988258317, y: 3484.375 },\n { x: 1.3502935420743638, y: 3223.5576923076924 },\n { x: 1.4090019569471623, y: 3080.528846153846 },\n { x: 1.9960861056751458, y: 3030.048076923077 },\n { x: 4.10958904109589, y: 2929.0865384615386 },\n { x: 5.401174168297455, y: 2903.846153846154 },\n { x: 6.046966731898238, y: 2887.019230769231 },\n { x: 6.75146771037182, y: 2920.673076923077 },\n { x: 8.101761252446183, y: 2929.0865384615386 },\n { x: 9.217221135029353, y: 2996.394230769231 },\n { x: 10.09784735812133, y: 3189.903846153846 },\n { x: 6.34050880626223, y: 3097.3557692307695 },\n { x: 4.050880626223091, y: 3147.8365384615386 },\n { x: 2.8767123287671232, y: 3206.7307692307695 },\n { x: 2.1135029354207435, y: 2811.298076923077 },\n { x: 3.2289628180039136, y: 2929.0865384615386 },\n { x: 2.8180039138943247, y: 3055.288461538462 },\n { x: 4.931506849315069, y: 3265.625 },\n { x: 5.518590998043054, y: 3467.548076923077 },\n { x: 4.637964774951076, y: 3518.028846153846 },\n { x: 3.874755381604696, y: 3534.8557692307695 },\n { x: 2.8180039138943247, y: 3602.1634615384614 },\n { x: 2.23091976516634, y: 3644.2307692307695 },\n { x: 3.7573385518590996, y: 3879.8076923076924 },\n { x: 4.1682974559686885, y: 4098.557692307692 },\n { x: 4.6966731898238745, y: 4191.1057692307695 },\n { x: 5.694716242661448, y: 4258.413461538461 },\n { x: 6.986301369863013, y: 4350.961538461539 },\n { x: 7.86692759295499, y: 4409.8557692307695 },\n { x: 8.864970645792564, y: 4527.6442307692305 },\n { x: 9.217221135029353, y: 4586.538461538461 },\n { x: 9.041095890410958, y: 5141.826923076923 },\n { x: 8.512720156555773, y: 5074.5192307692305 },\n { x: 7.984344422700587, y: 4965.1442307692305 },\n { x: 7.455968688845399, y: 4838.942307692308 },\n { x: 6.457925636007829, y: 4754.807692307692 },\n { x: 5.577299412915851, y: 4679.086538461539 },\n { x: 6.986301369863013, y: 5343.75 },\n { x: 8.63013698630137, y: 5469.951923076923 },\n { x: 10.215264187866929, y: 5503.6057692307695 },\n { x: 11.154598825831703, y: 5537.259615384615 },\n { x: 13.033268101761252, y: 5427.884615384615 },\n { x: 13.09197651663405, y: 5192.307692307692 },\n { x: 12.152641878669275, y: 4990.384615384615 },\n { x: 10.919765166340508, y: 4695.913461538461 },\n { x: 10.450097847358121, y: 4611.778846153846 },\n { x: 9.804305283757339, y: 4477.163461538461 },\n { x: 8.806262230919765, y: 4359.375 },\n { x: 8.043052837573384, y: 4275.240384615385 },\n { x: 7.10371819960861, y: 4174.278846153846 },\n { x: 6.105675146771037, y: 3921.875 },\n { x: 5.636007827788649, y: 3719.951923076923 },\n { x: 6.223091976516634, y: 3568.5096153846152 },\n { x: 6.34050880626223, y: 3375 },\n { x: 6.986301369863013, y: 3324.519230769231 },\n { x: 7.632093933463796, y: 3425.4807692307695 },\n { x: 8.160469667318981, y: 3518.028846153846 },\n { x: 9.217221135029353, y: 3610.576923076923 },\n { x: 10.09784735812133, y: 3694.7115384615386 },\n { x: 11.037181996086105, y: 3787.2596153846152 },\n { x: 11.97651663405088, y: 3862.9807692307695 },\n { x: 12.915851272015654, y: 3947.1153846153848 },\n { x: 13.385518590998043, y: 4073.3173076923076 },\n { x: 14.442270058708415, y: 4115.384615384615 },\n { x: 15.616438356164382, y: 4123.798076923077 },\n { x: 17.201565557729943, y: 4115.384615384615 },\n { x: 18.375733855185906, y: 4048.076923076923 },\n { x: 19.608610567514678, y: 3947.1153846153848 },\n { x: 19.608610567514678, y: 3879.8076923076924 },\n { x: 21.42857142857143, y: 4182.692307692308 },\n { x: 20.958904109589042, y: 4308.894230769231 },\n { x: 23.01369863013699, y: 4275.240384615385 },\n { x: 19.021526418786692, y: 4426.682692307692 },\n { x: 17.377690802348333, y: 4645.432692307692 },\n { x: 17.553816046966734, y: 4931.490384615385 },\n { x: 16.262230919765166, y: 4990.384615384615 },\n { x: 16.203522504892366, y: 4679.086538461539 },\n { x: 14.853228962818003, y: 4468.75 },\n { x: 13.09197651663405, y: 4628.6057692307695 },\n { x: 13.913894324853228, y: 4805.288461538461 },\n { x: 12.622309197651663, y: 4906.25 },\n { x: 11.330724070450097, y: 4847.3557692307695 },\n { x: 11.037181996086105, y: 4199.5192307692305 },\n { x: 9.628180039138943, y: 3989.1826923076924 },\n { x: 9.217221135029353, y: 3930.2884615384614 },\n { x: 13.561643835616438, y: 4157.451923076923 },\n { x: 14.20743639921722, y: 4199.5192307692305 },\n { x: 18.904109589041095, y: 5823.317307692308 },\n { x: 19.608610567514678, y: 5739.182692307692 },\n { x: 20.900195694716242, y: 5713.942307692308 },\n { x: 21.722113502935418, y: 5865.384615384615 },\n { x: 22.720156555772995, y: 5655.048076923077 },\n { x: 23.95303326810176, y: 5528.846153846154 },\n { x: 23.894324853228966, y: 5394.2307692307695 },\n { x: 23.835616438356162, y: 5326.923076923077 },\n { x: 23.835616438356162, y: 5183.8942307692305 },\n { x: 23.894324853228966, y: 5024.038461538461 },\n { x: 24.481409001956948, y: 4872.596153846154 },\n { x: 21.487279843444227, y: 5394.2307692307695 },\n { x: 21.956947162426612, y: 5562.5 },\n { x: 22.367906066536204, y: 5512.0192307692305 },\n { x: 22.89628180039139, y: 5352.163461538461 },\n { x: 20.841487279843445, y: 5444.711538461539 },\n { x: 14.031311154598825, y: 3862.9807692307695 },\n { x: 15.557729941291585, y: 3854.5673076923076 },\n { x: 12.32876712328767, y: 4174.278846153846 },\n { x: 11.859099804305282, y: 4115.384615384615 },\n { x: 11.330724070450097, y: 3921.875 },\n]\n\nconst helsinkiPoints = [\n { x: 6.164383561643835, y: 2314.6634615384614 },\n { x: 6.516634050880624, y: 2351.2019230769233 },\n { x: 7.045009784735812, y: 2479.0865384615386 },\n { x: 7.279843444227005, y: 2543.028846153846 },\n { x: 7.514677103718199, y: 2638.9423076923076 },\n { x: 8.277886497064578, y: 2794.230769230769 },\n { x: 8.63013698630137, y: 2853.605769230769 },\n { x: 10.156555772994128, y: 2972.355769230769 },\n { x: 10.919765166340508, y: 3018.028846153846 },\n { x: 11.800391389432484, y: 3063.7019230769233 },\n { x: 12.798434442270057, y: 3109.375 },\n { x: 14.442270058708415, y: 3155.0480769230767 },\n { x: 16.555772994129157, y: 3228.125 },\n { x: 17.025440313111545, y: 3292.0673076923076 },\n { x: 17.729941291585128, y: 3419.951923076923 },\n { x: 18.610567514677104, y: 3904.086538461538 },\n { x: 18.6692759295499, y: 3753.3653846153848 },\n { x: 18.31702544031311, y: 3616.346153846154 },\n { x: 18.082191780821915, y: 3534.1346153846152 },\n { x: 19.667318982387478, y: 3922.355769230769 },\n { x: 20.782778864970645, y: 3894.951923076923 },\n { x: 22.07436399217221, y: 3858.413461538461 },\n { x: 23.131115459882583, y: 3799.0384615384614 },\n { x: 24.951076320939336, y: 3739.6634615384614 },\n { x: 26.301369863013697, y: 3639.1826923076924 },\n { x: 26.59491193737769, y: 3424.5192307692305 },\n { x: 26.771037181996086, y: 3200.721153846154 },\n { x: 27.76908023483366, y: 2949.5192307692305 },\n { x: 28.12133072407045, y: 2712.0192307692305 },\n { x: 26.53620352250489, y: 2638.9423076923076 },\n { x: 25.655577299412915, y: 2437.980769230769 },\n { x: 15.616438356164382, y: 2150.2403846153848 },\n { x: 19.138943248532293, y: 2227.8846153846152 },\n { x: 20.782778864970645, y: 2300.9615384615386 },\n { x: 23.776908023483365, y: 2469.951923076923 },\n { x: 25.71428571428571, y: 2757.6923076923076 },\n { x: 26.301369863013697, y: 2849.0384615384614 },\n { x: 26.947162426614483, y: 2954.086538461538 },\n { x: 24.951076320939336, y: 3050 },\n { x: 24.83365949119374, y: 3324.0384615384614 },\n { x: 25.949119373776906, y: 3547.836538461538 },\n { x: 27.06457925636008, y: 3598.076923076923 },\n { x: 27.886497064579256, y: 3630.0480769230767 },\n { x: 28.003913894324853, y: 3767.0673076923076 },\n { x: 27.59295499021526, y: 3780.7692307692305 },\n { x: 26.066536203522503, y: 3744.230769230769 },\n { x: 24.36399217221135, y: 3853.8461538461534 },\n { x: 19.080234833659492, y: 3218.9903846153848 },\n { x: 14.442270058708415, y: 2944.951923076923 },\n { x: 10.626223091976517, y: 2821.6346153846152 },\n { x: 9.628180039138943, y: 2670.9134615384614 },\n { x: 8.454011741682974, y: 2492.7884615384614 },\n { x: 9.393346379647749, y: 2469.951923076923 },\n { x: 10.743639921722114, y: 2465.3846153846152 },\n { x: 13.033268101761252, y: 2488.221153846154 },\n { x: 8.21917808219178, y: 2323.798076923077 },\n { x: 7.10371819960861, y: 2273.5576923076924 },\n { x: 6.2818003913894325, y: 2264.423076923077 },\n { x: 6.223091976516634, y: 2186.778846153846 },\n { x: 6.457925636007829, y: 2168.5096153846152 },\n { x: 8.101761252446183, y: 2145.673076923077 },\n { x: 10.567514677103718, y: 2232.4519230769233 },\n { x: 11.448140900195694, y: 2442.548076923077 },\n { x: 12.270058708414872, y: 2661.778846153846 },\n { x: 14.031311154598825, y: 2967.7884615384614 },\n { x: 15.73385518590998, y: 3282.9326923076924 },\n { x: 16.908023483365948, y: 3438.221153846154 },\n { x: 17.61252446183953, y: 3570.6730769230767 },\n { x: 13.50293542074364, y: 3328.605769230769 },\n { x: 11.97651663405088, y: 3155.0480769230767 },\n { x: 10.332681017612524, y: 2958.653846153846 },\n { x: 8.864970645792564, y: 2826.201923076923 },\n { x: 7.162426614481409, y: 2652.644230769231 },\n { x: 10.450097847358121, y: 2702.8846153846152 },\n { x: 13.033268101761252, y: 2903.846153846154 },\n { x: 18.610567514677104, y: 3342.3076923076924 },\n { x: 19.608610567514678, y: 3575.2403846153848 },\n { x: 20.19569471624266, y: 3652.8846153846152 },\n { x: 19.960861056751465, y: 3739.6634615384614 },\n { x: 22.015655577299416, y: 3693.9903846153848 },\n { x: 23.24853228962818, y: 3333.1730769230767 },\n { x: 21.07632093933464, y: 3191.586538461538 },\n { x: 19.726027397260275, y: 3109.375 },\n { x: 18.31702544031311, y: 3086.5384615384614 },\n { x: 15.499021526418783, y: 3013.461538461538 },\n { x: 15.264187866927593, y: 2684.6153846153848 },\n { x: 14.031311154598825, y: 2529.326923076923 },\n { x: 13.561643835616438, y: 2680.048076923077 },\n { x: 16.908023483365948, y: 2775.961538461538 },\n { x: 18.02348336594912, y: 2830.7692307692305 },\n { x: 22.89628180039139, y: 2817.0673076923076 },\n { x: 21.78082191780822, y: 2437.980769230769 },\n { x: 20.724070450097848, y: 2433.4134615384614 },\n { x: 16.908023483365948, y: 2433.4134615384614 },\n { x: 12.915851272015654, y: 2218.75 },\n { x: 11.62426614481409, y: 2223.3173076923076 },\n { x: 13.85518590998043, y: 2364.903846153846 },\n { x: 16.08610567514677, y: 2278.125 },\n { x: 17.260273972602743, y: 2310.096153846154 },\n { x: 18.7279843444227, y: 2406.0096153846152 },\n { x: 19.021526418786692, y: 2465.3846153846152 },\n { x: 18.610567514677104, y: 2575 },\n { x: 17.201565557729943, y: 2588.701923076923 },\n { x: 15.675146771037182, y: 2451.6826923076924 },\n { x: 15.264187866927593, y: 2424.278846153846 },\n { x: 15.557729941291585, y: 2620.673076923077 },\n { x: 18.140900195694716, y: 2725.721153846154 },\n { x: 18.6692759295499, y: 2739.423076923077 },\n { x: 20.900195694716242, y: 2625.2403846153848 },\n { x: 22.309197651663403, y: 2620.673076923077 },\n { x: 23.95303326810176, y: 2570.4326923076924 },\n { x: 25.303326810176124, y: 2538.4615384615386 },\n { x: 25.655577299412915, y: 2538.4615384615386 },\n { x: 25.00978473581213, y: 2652.644230769231 },\n { x: 24.77495107632094, y: 2890.1442307692305 },\n { x: 23.424657534246577, y: 2986.0576923076924 },\n { x: 21.545988258317024, y: 2903.846153846154 },\n { x: 21.135029354207433, y: 2785.096153846154 },\n { x: 20.313111545988257, y: 2849.0384615384614 },\n { x: 19.726027397260275, y: 2972.355769230769 },\n { x: 17.96477495107632, y: 2958.653846153846 },\n { x: 17.553816046966734, y: 2940.3846153846152 },\n { x: 15.557729941291585, y: 2821.6346153846152 },\n { x: 13.620352250489233, y: 2803.3653846153848 },\n { x: 13.50293542074364, y: 2862.7403846153848 },\n { x: 12.38747553816047, y: 3008.8942307692305 },\n { x: 16.731898238747554, y: 3132.211538461538 },\n { x: 19.080234833659492, y: 3465.625 },\n { x: 20.430528375733854, y: 3511.2980769230767 },\n { x: 21.898238747553815, y: 3561.5384615384614 },\n { x: 22.95499021526419, y: 3602.6442307692305 },\n { x: 23.424657534246577, y: 3648.3173076923076 },\n { x: 23.718199608610565, y: 3675.721153846154 },\n { x: 24.77495107632094, y: 3520.4326923076924 },\n { x: 22.544031311154598, y: 3433.6538461538457 },\n { x: 20.078277886497062, y: 3342.3076923076924 },\n { x: 22.95499021526419, y: 3241.826923076923 },\n { x: 24.246575342465754, y: 3187.0192307692305 },\n { x: 22.661448140900195, y: 3109.375 },\n { x: 21.545988258317024, y: 3063.7019230769233 },\n { x: 26.360078277886497, y: 3118.5096153846152 },\n { x: 26.53620352250489, y: 3301.201923076923 },\n { x: 25.655577299412915, y: 3387.980769230769 },\n { x: 24.89236790606654, y: 3429.086538461538 },\n { x: 24.070450097847356, y: 3502.1634615384614 },\n { x: 25.244618395303327, y: 3643.75 },\n { x: 22.837573385518592, y: 3721.3942307692305 },\n { x: 21.135029354207433, y: 3776.201923076923 },\n { x: 19.608610567514678, y: 3821.875 },\n { x: 18.8454011741683, y: 3643.75 },\n { x: 20.665362035225048, y: 3419.951923076923 },\n { x: 21.252446183953033, y: 3319.471153846154 },\n { x: 16.379647749510767, y: 2986.0576923076924 },\n { x: 16.84931506849315, y: 3031.730769230769 },\n { x: 14.677103718199607, y: 3072.836538461538 },\n { x: 12.152641878669275, y: 2807.9326923076924 },\n { x: 11.682974559686889, y: 2593.269230769231 },\n { x: 10.626223091976517, y: 2561.298076923077 },\n { x: 9.686888454011742, y: 2570.4326923076924 },\n { x: 8.63013698630137, y: 2716.586538461538 },\n { x: 11.62426614481409, y: 2332.9326923076924 },\n { x: 6.986301369863013, y: 2369.471153846154 },\n { x: 8.63013698630137, y: 2383.173076923077 },\n { x: 9.334637964774949, y: 2364.903846153846 },\n { x: 9.804305283757339, y: 2328.3653846153848 },\n { x: 9.393346379647749, y: 2287.2596153846152 },\n { x: 9.393346379647749, y: 2246.153846153846 },\n { x: 10.450097847358121, y: 2214.1826923076924 },\n { x: 12.093933463796477, y: 2182.2115384615386 },\n { x: 13.561643835616438, y: 2191.346153846154 },\n { x: 14.383561643835616, y: 2273.5576923076924 },\n { x: 15.264187866927593, y: 2314.6634615384614 },\n { x: 17.201565557729943, y: 2332.9326923076924 },\n { x: 18.7279843444227, y: 2319.2307692307695 },\n { x: 19.78473581213307, y: 2364.903846153846 },\n { x: 19.960861056751465, y: 2606.971153846154 },\n { x: 20.371819960861057, y: 2611.5384615384614 },\n { x: 20.900195694716242, y: 2712.0192307692305 },\n { x: 22.77886497064579, y: 2739.423076923077 },\n { x: 23.894324853228966, y: 2775.961538461538 },\n { x: 21.956947162426612, y: 2976.9230769230767 },\n { x: 18.02348336594912, y: 3209.855769230769 },\n { x: 21.66340508806262, y: 3310.336538461538 },\n { x: 21.36986301369863, y: 3260.096153846154 },\n { x: 22.07436399217221, y: 3205.2884615384614 },\n { x: 23.659491193737768, y: 3100.2403846153843 },\n { x: 25.479452054794518, y: 3205.2884615384614 },\n { x: 26.65362035225049, y: 3036.2980769230767 },\n { x: 25.538160469667318, y: 2995.1923076923076 },\n { x: 25.244618395303327, y: 2954.086538461538 },\n { x: 27.945205479452053, y: 3159.6153846153848 },\n { x: 27.651663405088062, y: 3081.971153846154 },\n { x: 27.651663405088062, y: 3264.6634615384614 },\n { x: 27.945205479452053, y: 3547.836538461538 },\n { x: 27.475538160469664, y: 3511.2980769230767 },\n { x: 28.356164383561644, y: 3456.4903846153848 },\n { x: 28.767123287671232, y: 3438.221153846154 },\n { x: 16.379647749510767, y: 3442.7884615384614 },\n { x: 15.499021526418783, y: 3374.2788461538457 },\n { x: 14.500978473581215, y: 3269.230769230769 },\n { x: 13.268101761252446, y: 3214.4230769230767 },\n { x: 15.968688845401173, y: 3141.346153846154 },\n { x: 15.381604696673193, y: 3200.721153846154 },\n { x: 15.029354207436398, y: 3104.8076923076924 },\n { x: 11.682974559686889, y: 2922.1153846153848 },\n { x: 10.626223091976517, y: 2894.711538461538 },\n { x: 9.628180039138943, y: 2839.903846153846 },\n { x: 9.686888454011742, y: 2762.2596153846152 },\n { x: 11.859099804305282, y: 2734.855769230769 },\n { x: 9.217221135029353, y: 2912.980769230769 },\n { x: 8.277886497064578, y: 2584.1346153846152 },\n { x: 11.272015655577299, y: 2661.778846153846 },\n { x: 14.324853228962818, y: 2780.528846153846 },\n { x: 15.616438356164382, y: 2762.2596153846152 },\n { x: 16.614481409001957, y: 2712.0192307692305 },\n { x: 17.436399217221137, y: 2675.480769230769 },\n { x: 13.79647749510763, y: 2602.403846153846 },\n { x: 16.320939334637963, y: 2538.4615384615386 },\n { x: 17.729941291585128, y: 2511.0576923076924 },\n { x: 14.442270058708415, y: 2465.3846153846152 },\n { x: 12.093933463796477, y: 2529.326923076923 },\n { x: 12.857142857142856, y: 2597.8365384615386 },\n { x: 12.563600782778865, y: 2419.7115384615386 },\n { x: 12.798434442270057, y: 2342.0673076923076 },\n { x: 13.79647749510763, y: 2296.394230769231 },\n { x: 13.033268101761252, y: 2282.6923076923076 },\n { x: 10.567514677103718, y: 2369.471153846154 },\n { x: 9.041095890410958, y: 2433.4134615384614 },\n { x: 7.749510763209393, y: 2442.548076923077 },\n { x: 8.688845401174168, y: 2648.076923076923 },\n { x: 7.690802348336595, y: 2730.2884615384614 },\n { x: 23.01369863013699, y: 2931.25 },\n { x: 29, y: 2931.25 },\n { x: 29, y: 2931.25 },\n { x: 29, y: 2931.25 },\n]\n\n// Map the x values into timestamps\nlet date = new Date(dateOrigin)\nconst kuopioTimes = kuopioPoints.map((point) => {\n return {\n x: date.setDate(dateOrigin.getDate() + point.x),\n y: point.y,\n }\n})\nconst helsinkiTimes = helsinkiPoints.map((point) => {\n return {\n x: date.setDate(dateOrigin.getDate() + point.x),\n y: point.y,\n }\n})\n\n// Create collection of rectangles which are going to be used as frame for clusters\nconst rects = chart.addRectangleSeries().setCursorEnabled(false)\n\n// Base style for strokes of frames. Line-FillStyle will be overridden per each cluster.\nconst strokeStyle = new SolidLine().setThickness(2)\n\n// Setup view nicely.\n\nchart.getDefaultAxisY().setTitle('Salary ($)').setInterval({ start: 1500, end: 6500, animate: true })\n/**\n * Adds clusters of points to specified series and creates frames for them\n * @param {PointSeries} series Series which should hold the cluster\n * @return Function which receives a cluster of points\n */\nconst drawCluster = (series, points) => {\n // Add points to specified series\n series.add(points.map((point) => ({ x: point.x, y: point.y })))\n // Cache top left corner of cluster area\n series.setCursorResultTableFormatter((builder, series, Xvalue, Yvalue) => {\n return builder\n .addRow(`${series.getName()}`)\n .addRow('Date : ' + series.axisX.formatValue(Xvalue))\n .addRow('Salary : $' + Yvalue.toFixed(0))\n })\n const topLeftCorner = {\n x: series.getXMin(),\n y: series.getYMin(),\n }\n // Create frame around cluster\n rects\n .add({\n x: topLeftCorner.x,\n y: topLeftCorner.y,\n width: series.getXMax() - topLeftCorner.x,\n height: series.getYMax() - topLeftCorner.y,\n })\n // Disable filling of frame\n .setFillStyle(emptyFill)\n // Configure thickness and color of stroke via strokeStyle\n .setStrokeStyle(strokeStyle.setFillStyle(series.getPointFillStyle()))\n}\n\ndrawCluster(fstClusterSeries, kuopioTimes)\ndrawCluster(sndClusterSeries, helsinkiTimes)\n\n// Enable AutoCursor auto-fill.\nchart.setAutoCursor((cursor) => cursor.setResultTableAutoTextStyle(true))\n\n// Finally, add LegendBox to chart.\nchart\n .addLegendBox()\n .add(fstClusterSeries)\n .add(sndClusterSeries)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n","url":null,"readme":"This example shows how to create clusters of differently colored points, how to get the boundaries of a series and use them to draw frames around each cluster.\n\nThe most efficient way to draw point cloud clusters is utilizing **_PointSeries_**. The description of how to configure the visual appearance of points can be found in previous tutorials and more information can be found in API documentation.\n\n```javascript\n// Create point series which represents a single cluster.\nconst cluster = chart.addPointSeries()\n```\n\n## Boundaries\n\nEach series automatically computes its boundaries based on the data input and configuration of a series. Get the boundaries in axis values using the following methods:\n\n```javascript\n// Cache min corner of a series (this would be bottom left on progressive axes).\nconst minCorner = {\n x: series.getXMin(),\n y: series.getYMin(),\n}\n\n// Cache max corner of a series (this would be top right on progressive axes).\nconst maxCorner = {\n x: series.getXMax(),\n y: series.getYMax(),\n}\n```\n\nThe boundary rectangle is defined by two points in 2D space. The same methods are applicable to all the series as well as **_progressive series_** in any directions.\n","image":"pointClusters"},{"id":"lcjs-example-0007-sharedAxis","title":"Shared Axis","tags":["spline","axis","xy","legendbox"],"description":"Shows how to combine multiple series in to one chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases sharing an Axis between two series.\n * Also, styling of chart zooming rectangle & axes.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n ColorPalettes,\n ColorRGBA,\n SolidFill,\n SolidLine,\n emptyLine,\n AxisTickStrategies,\n LegendBoxBuilders,\n UIOrigins,\n Themes,\n} = lcjs\n\n// ----- Cache used styles -----\nconst palette = ColorPalettes.arction(10)\nconst colors = [6, 9, 0].map(palette)\nconst axisYColors = [colors[0], colors[1]]\nconst axisYStyles = axisYColors.map((color) => new SolidFill({ color }))\nconst axisYStrokeStyles = axisYStyles.map((fillStyle) => new SolidLine({ fillStyle, thickness: 2 }))\nconst axisYStylesHighlight = axisYStyles.map((fillStyle) => fillStyle.setA(100))\nconst axisXStyleHighlight = new SolidFill({ color: colors[2].setA(100) })\nconst seriesStrokeStyles = axisYStrokeStyles\nconst fittingRectangleStrokeStyle = new SolidLine({ fillStyle: new SolidFill({ color: ColorRGBA(255, 255, 255, 100) }), thickness: 2 })\nconst zoomingRectangleFillStyle = new SolidFill({ color: colors[2].setA(100) })\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setPadding({\n right: 50,\n })\n .setTitle('Unit production comparison')\n // Style chart zooming rectangle.\n .setFittingRectangleStrokeStyle(fittingRectangleStrokeStyle)\n .setZoomingRectangleFillStyle(zoomingRectangleFillStyle)\n\n// Cache reference to default axes and style them.\nconst axisX = chart\n .getDefaultAxisX()\n .setOverlayStyle(axisXStyleHighlight)\n .setNibOverlayStyle(axisXStyleHighlight)\n // Set the X Axis to use DateTime TickStrategy and set the interval\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setInterval({\n start: new Date(2018, 1, 5).getTime(),\n end: new Date(2018, 1, 24).getTime(),\n })\n\n// Style the default Y Axis.\nconst axisY1 = chart\n .getDefaultAxisY()\n .setStrokeStyle(axisYStrokeStyles[0])\n .setOverlayStyle(axisYStylesHighlight[0])\n .setNibOverlayStyle(axisYStylesHighlight[0])\n // Modify the TickStrategy to remove gridLines from this Y Axis.\n .setTickStrategy(\n // Use Numeric TickStrategy as base.\n AxisTickStrategies.Numeric,\n // Use mutator to modify the TickStrategy.\n (tickStrategy) =>\n tickStrategy\n // Modify Major Tick Style by using a mutator.\n .setMajorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine))\n // Modify Minor Tick Style by using a mutator.\n .setMinorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine)),\n )\n\n// Create additional styled Y axis on left side.\nconst axisY2 = chart\n .addAxisY(false)\n .setTitle('No of units produced')\n .setStrokeStyle(axisYStrokeStyles[1])\n .setOverlayStyle(axisYStylesHighlight[1])\n .setNibOverlayStyle(axisYStylesHighlight[1])\n // Modify the TickStrategy to remove gridLines from this Y Axis.\n .setTickStrategy(\n // Use Numeric TickStrategy as base.\n AxisTickStrategies.Numeric,\n // Use mutator to modify the TickStrategy.\n (tickStrategy) =>\n tickStrategy\n // Modify Major Tick Style by using a mutator.\n .setMajorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine))\n // Modify Minor Tick Style by using a mutator.\n .setMinorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine)),\n )\n\n// Create series with explicit axes.\nconst splineSeries1 = chart\n .addSplineSeries({\n xAxis: axisX,\n yAxis: axisY1,\n })\n .setName('TechComp')\n .setStrokeStyle(seriesStrokeStyles[0])\n .setPointFillStyle(() => seriesStrokeStyles[0].getFillStyle())\n\nconst splineSeries2 = chart\n .addSplineSeries({\n xAxis: axisX,\n yAxis: axisY2,\n })\n .setName('UniTek')\n .setStrokeStyle(seriesStrokeStyles[1])\n .setPointFillStyle(() => seriesStrokeStyles[1].getFillStyle())\n\nconst techcomp = [\n { x: new Date(2018, 1, 5).getTime(), y: 352 },\n { x: new Date(2018, 1, 6).getTime(), y: 352 },\n { x: new Date(2018, 1, 7).getTime(), y: 352 },\n { x: new Date(2018, 1, 8).getTime(), y: 358 },\n { x: new Date(2018, 1, 9).getTime(), y: 400 },\n { x: new Date(2018, 1, 10).getTime(), y: 400 },\n { x: new Date(2018, 1, 11).getTime(), y: 400 },\n { x: new Date(2018, 1, 12).getTime(), y: 400 },\n { x: new Date(2018, 1, 13).getTime(), y: 426 },\n { x: new Date(2018, 1, 14).getTime(), y: 390 },\n { x: new Date(2018, 1, 15).getTime(), y: 390 },\n { x: new Date(2018, 1, 16).getTime(), y: 390 },\n { x: new Date(2018, 1, 17).getTime(), y: 390 },\n { x: new Date(2018, 1, 18).getTime(), y: 360 },\n { x: new Date(2018, 1, 19).getTime(), y: 360 },\n { x: new Date(2018, 1, 20).getTime(), y: 360 },\n { x: new Date(2018, 1, 21).getTime(), y: 500 },\n { x: new Date(2018, 1, 22).getTime(), y: 500 },\n { x: new Date(2018, 1, 23).getTime(), y: 500 },\n { x: new Date(2018, 1, 24).getTime(), y: 600 },\n]\n\nconst unitek = [\n { x: new Date(2018, 1, 5).getTime(), y: 235 },\n { x: new Date(2018, 1, 6).getTime(), y: 235 },\n { x: new Date(2018, 1, 7).getTime(), y: 335 },\n { x: new Date(2018, 1, 8).getTime(), y: 335 },\n { x: new Date(2018, 1, 9).getTime(), y: 490 },\n { x: new Date(2018, 1, 10).getTime(), y: 490 },\n { x: new Date(2018, 1, 11).getTime(), y: 490 },\n { x: new Date(2018, 1, 12).getTime(), y: 492 },\n { x: new Date(2018, 1, 13).getTime(), y: 550 },\n { x: new Date(2018, 1, 14).getTime(), y: 550 },\n { x: new Date(2018, 1, 15).getTime(), y: 600 },\n { x: new Date(2018, 1, 16).getTime(), y: 600 },\n { x: new Date(2018, 1, 17).getTime(), y: 900 },\n { x: new Date(2018, 1, 18).getTime(), y: 900 },\n { x: new Date(2018, 1, 19).getTime(), y: 900 },\n { x: new Date(2018, 1, 20).getTime(), y: 850 },\n { x: new Date(2018, 1, 21).getTime(), y: 1000 },\n { x: new Date(2018, 1, 22).getTime(), y: 1200 },\n { x: new Date(2018, 1, 23).getTime(), y: 1200 },\n { x: new Date(2018, 1, 24).getTime(), y: 1300 },\n]\n\n// Add data to series\nsplineSeries1.add(techcomp)\nsplineSeries2.add(unitek)\n\n// Setup Y views manually (for some extra margins).\naxisY1.setInterval({ start: splineSeries1.getYMin() - 10, end: splineSeries1.getYMax() + 10, animate: true })\naxisY2.setInterval({ start: splineSeries2.getYMin() - 10, end: splineSeries2.getYMax() + 10, animate: true })\n\n// Enable AutoCursor auto-fill.\nchart.setAutoCursor((cursor) => {\n cursor.setResultTableAutoTextStyle(true).setTickMarkerXAutoTextStyle(true).setTickMarkerYAutoTextStyle(true)\n})\nconst legend = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n\n// Add Chart to LegendBox\nlegend.add(chart)\n\nconst parser = (builder, series, Xvalue, Yvalue) => {\n return builder\n .addRow(series.getName())\n .addRow(axisX.formatValue(Xvalue))\n .addRow('Units: ' + Math.floor(Yvalue))\n}\nsplineSeries1.setCursorResultTableFormatter(parser)\nsplineSeries2.setCursorResultTableFormatter(parser)\n","url":null,"readme":"Best practice of data visualization within Data Analysis in different fields and industries is combining multiple series in one chart to examine and get richer insight about collected data. Moreover, it allows researchers to make conclusions about the researching phenomena out of each data set, to search patterns and relationships both within a collection and across collections\n\nThis example shows how to:\n\n- configure the axis styling;\n- create additional axes;\n- assign series to explicit axes;\n- styling of ChartXY zooming rectangle.\n\n## Request default axes.\n\nCartesian XY charts contains default X and Y axes by default. To request the default axes of a chart, you can simply use:\n\n```javascript\n// Cache reference to default X-axis for further usage.\nconst axisXDefault = chart.getDefaultAxisX()\n\n// Cache reference to default Y-axis for further usage.\nconst axisYDefault = chart.getDefaultAxisY()\n```\n\nDuring the creation of any XY series, you can attach series to default axes by not specifying the xAxis or yAxis options.\n\n## Create new axis and attach series.\n\n```javascript\n// Create additional X-axis\nconst axisYNew = chart.addAxisX()\n\n// Create additional Y-axis\nconst axisYNew = chart.addAxisY()\n```\n\nDuring the creation of any XY series, you can attach series to any axes via the cached references as the arguments.\n\n```javascript\n// Create series with explicit axes, share the same x-axis between two series.\nconst allSeries = [\n chart.addSplineSeries({\n xAxis: axisXDefault,\n yAxis: AxisYDefault\n }),\n chart.addSplineSeries({\n xAxis: axisXDefault,\n yAxis: axisYNew\n }),\n ...\n]\n```\n\n## Axis styling.\n\nBoth X and Y axes share the same flexible and fully customizable API, meaning the same setters and getters. The full list of methods of the class **_Axis_** you can find in LightningChart JS API reference.\n\n```javascript\n// Add additional styling for the axis.\naxis\n .setTitle( 'My axis' )\n // Configure axis line style.\n .setStrokeStyle( axisStrokeStyle )\n // Configure axis tick style by modifying the Axis TickStrategy.\n .setTickStrategy(\n // Use Numeric TickStrategy as Base.\n AxisTickStrategies.Numeric,\n // Use a mutator to modify the TickStrategy.\n ( tickStrategy ) => tickStrategy\n // Modify the Major Ticks for the TickStrategy.\n // Minor and Extreme TickStyles must be set separately.\n .setMajorTickStyle( visibleTicks => visibleTicks\n // Label fill Style.\n .setLabelFillStyle( axisLabelFillStyle )\n // Font.\n .setLabelFont( font => font\n // Configure the font.\n ...\n )\n // Grid stroke style\n .setGridStrokeStyle( gridStrokeStyle )\n )\n )\n // Configure axis overlay style (interactive axis area).\n .setOverlayStyle( axisFillStyleHighlight )\n // Configure axis nibs overlay style (interactive axis nibs area).\n .setNibOverlayStyle( axisFillStyleHighlight )\n```\n","image":"sharedAxis"},{"id":"lcjs-example-0008-lineSeriesMicroseconds","title":"JavaScript Microseconds Line Chart","tags":["xy","line","legendbox"],"description":"Example on how to deal with high-resolution data - for example, measurements in microseconds precision.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases an Axis interval that is depicted as microseconds.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setPadding({\n right: 50,\n })\n .setTitle('High resolution voltage measurement')\n\n// Create line series optimized for regular progressive X data.\nconst lineSeries = chart\n .addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n // regularProgressiveStep: true => The X step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n })\n .setName('Voltage')\n\n// Axes can't properly scroll data with microseconds precision - define a factor to scale all X values with.\nconst dataScaleX = 1 * Math.pow(1000, 3) // 1 us\n\n// Style Axes.\nchart\n .getDefaultAxisX()\n .setTitle('Time')\n .setTickStrategy(AxisTickStrategies.Numeric, (strategy) =>\n strategy\n // Format ticks with units.\n .setFormattingFunction((timeScaled) => Math.round(timeScaled) + ' μs'),\n )\n\nchart\n .getDefaultAxisY()\n .setTitle('Voltage')\n .setTickStrategy(AxisTickStrategies.Numeric, (strategy) =>\n strategy\n // Format ticks with units.\n .setFormattingFunction((voltage) => voltage.toFixed(2) + ' V'),\n )\n\nconst renderData = (data) => {\n // Add data.\n lineSeries.add(data.map((p) => ({ x: p.x * dataScaleX, y: p.y })))\n}\n\n// Data where 'x' = time in seconds and 'y' = voltage (V).\nrenderData([\n { x: -0.0000020000000000000003, y: 0.027443997800008942 },\n { x: -0.0000019990000000000003, y: -0.011040000894077058 },\n { x: -0.000001998, y: 0.03220101591561531 },\n { x: -0.000001997, y: 0.0032277195700614984 },\n { x: -0.000001996, y: -0.016034820491464274 },\n { x: -0.000001995, y: -0.008368059183426731 },\n { x: -0.000001994, y: -0.02177862894781828 },\n { x: -0.000001993, y: 0.001636039091765307 },\n { x: -0.0000019919999999999997, y: -0.03158798144826885 },\n { x: -0.0000019909999999999997, y: -0.013230578513313334 },\n { x: -0.0000019899999999999996, y: -0.012694187571129261 },\n { x: -0.0000019889999999999995, y: -0.0027350699497441875 },\n { x: -0.0000019879999999999994, y: 0.03298847629763905 },\n { x: -0.0000019869999999999994, y: -0.03717782287193666 },\n { x: -0.0000019859999999999993, y: 0.028062788701891394 },\n { x: -0.000001984999999999999, y: -0.016266999601182712 },\n { x: -0.000001983999999999999, y: -0.008046589284136109 },\n { x: -0.000001982999999999999, y: -0.003740378143367308 },\n { x: -0.000001981999999999999, y: 0.019358216986926403 },\n { x: -0.000001980999999999999, y: 0.02805533324925918 },\n { x: -0.000001979999999999999, y: 0.031225670024134983 },\n { x: -0.0000019789999999999988, y: 0.020582142130848646 },\n { x: -0.0000019779999999999987, y: -0.007463655137510183 },\n { x: -0.0000019769999999999986, y: -0.012432948528416126 },\n { x: -0.0000019759999999999985, y: -0.008897767785342523 },\n { x: -0.0000019749999999999985, y: 0.009059768800837458 },\n { x: -0.0000019739999999999984, y: -0.01802759024130608 },\n { x: -0.0000019729999999999983, y: -0.02600377226442229 },\n { x: -0.0000019719999999999982, y: 0.028207624634314542 },\n { x: -0.000001970999999999998, y: -0.012739022918053046 },\n { x: -0.000001969999999999998, y: -0.029461215330813854 },\n { x: -0.000001968999999999998, y: 0.03805686913709322 },\n { x: -0.000001967999999999998, y: 0.00863873273448897 },\n { x: -0.000001966999999999998, y: -0.023022703625994633 },\n { x: -0.0000019659999999999978, y: -0.0373599679488816 },\n { x: -0.0000019649999999999977, y: -0.035682458658072 },\n { x: -0.0000019639999999999976, y: 0.01684443788295703 },\n { x: -0.0000019629999999999976, y: 0.0328927810844329 },\n { x: -0.0000019619999999999975, y: -0.007839367701313547 },\n { x: -0.0000019609999999999974, y: 0.010748498921052238 },\n { x: -0.0000019599999999999973, y: -0.014900326268457866 },\n { x: -0.0000019589999999999973, y: 0.03595859412516749 },\n { x: -0.000001957999999999997, y: -0.02923854638665586 },\n { x: -0.000001956999999999997, y: -0.02341062868016332 },\n { x: -0.000001955999999999997, y: 0.007523826280203083 },\n { x: -0.000001954999999999997, y: -0.003733821934002091 },\n { x: -0.000001953999999999997, y: -0.021005461742955544 },\n { x: -0.000001952999999999997, y: -0.03151378617897506 },\n { x: -0.0000019519999999999967, y: 0.02774790358861265 },\n { x: -0.0000019509999999999967, y: 0.03795208393331581 },\n { x: -0.0000019499999999999966, y: 0.026283318084466992 },\n { x: -0.0000019489999999999965, y: 0.0039971746651379 },\n { x: -0.0000019479999999999964, y: -0.010837607472969751 },\n { x: -0.0000019469999999999964, y: 0.0045505495440374515 },\n { x: -0.0000019459999999999963, y: 0.02760932266323016 },\n { x: -0.000001944999999999996, y: -0.012932797683883203 },\n { x: -0.000001943999999999996, y: 0.026313178254021314 },\n { x: -0.000001942999999999996, y: -0.006753080306960189 },\n { x: -0.000001941999999999996, y: -0.005829791514477386 },\n { x: -0.000001940999999999996, y: 0.030479168110012805 },\n { x: -0.000001939999999999996, y: 0.019178344607547356 },\n { x: -0.0000019389999999999958, y: 0.025456333122878295 },\n { x: -0.0000019379999999999957, y: 0.035631691174438956 },\n { x: -0.0000019369999999999956, y: 0.00859127099361588 },\n { x: -0.0000019359999999999955, y: 0.031193035102678842 },\n { x: -0.0000019349999999999954, y: -0.007024064866093383 },\n { x: -0.0000019339999999999954, y: -0.02066494292075876 },\n { x: -0.0000019329999999999953, y: 0.03336475598292969 },\n { x: -0.0000019319999999999952, y: -0.00035095400945603806 },\n { x: -0.000001930999999999995, y: -0.034745500954158105 },\n { x: -0.000001929999999999995, y: 0.005364859917507523 },\n { x: -0.000001928999999999995, y: -0.02445169288471954 },\n { x: -0.000001927999999999995, y: -0.02441816045956086 },\n { x: -0.000001926999999999995, y: 0.027959876909385544 },\n { x: -0.0000019259999999999948, y: -0.007642897144741695 },\n { x: -0.0000019249999999999947, y: 0.032599275065726394 },\n { x: -0.0000019239999999999946, y: 0.01897552794893236 },\n { x: -0.0000019229999999999945, y: -0.0363220820132121 },\n { x: -0.0000019219999999999945, y: 0.03505807770706757 },\n { x: -0.0000019209999999999944, y: 0.009264323825879552 },\n { x: -0.0000019199999999999943, y: -0.02143546262960617 },\n { x: -0.0000019189999999999942, y: 0.028527256171897965 },\n { x: -0.000001917999999999994, y: -0.0067127373419447805 },\n { x: -0.000001916999999999994, y: -0.020852541725547107 },\n { x: -0.000001915999999999994, y: -0.021657662150244002 },\n { x: -0.000001914999999999994, y: -0.03396864467141348 },\n { x: -0.000001913999999999994, y: 0.025170812430718562 },\n { x: -0.000001912999999999994, y: -0.034041062837669465 },\n { x: -0.0000019119999999999937, y: 0.02651841202431338 },\n { x: -0.0000019109999999999936, y: -0.006762134246684295 },\n { x: -0.0000019099999999999936, y: -0.03227858249048464 },\n { x: -0.0000019089999999999935, y: 0.010328213861666406 },\n { x: -0.0000019079999999999934, y: -0.035234975360768035 },\n { x: -0.0000019069999999999933, y: 0.008202285542611463 },\n { x: -0.0000019059999999999933, y: 0.03663418613211281 },\n { x: -0.0000019049999999999932, y: 0.028359697089407786 },\n { x: -0.0000019039999999999931, y: -0.0011449575670857686 },\n { x: -0.000001902999999999993, y: -0.03469593477268927 },\n { x: -0.000001901999999999993, y: -0.008822618293776422 },\n { x: -0.000001900999999999993, y: -0.015392005406952342 },\n { x: -0.0000018999999999999928, y: -0.04518360794385557 },\n { x: -0.0000018989999999999927, y: 0.02910126189319455 },\n { x: -0.0000018979999999999927, y: -0.01300708363967233 },\n { x: -0.0000018969999999999926, y: 0.03130258988661914 },\n { x: -0.0000018959999999999925, y: -0.014506761541320573 },\n { x: -0.0000018949999999999924, y: 0.03218783959641612 },\n { x: -0.0000018939999999999924, y: 0.029112212730334326 },\n { x: -0.0000018929999999999923, y: 0.017927598690127274 },\n { x: -0.0000018919999999999922, y: -0.004076533400195019 },\n { x: -0.0000018909999999999921, y: -0.021586538692518108 },\n { x: -0.000001889999999999992, y: 0.024316189169899333 },\n { x: -0.000001888999999999992, y: -0.0009595592660485554 },\n { x: -0.000001887999999999992, y: 0.022661409690115604 },\n { x: -0.0000018869999999999918, y: -0.008687166080617334 },\n { x: -0.0000018859999999999918, y: -0.023019856894362905 },\n { x: -0.0000018849999999999917, y: -0.036456061302591346 },\n { x: -0.0000018839999999999916, y: -0.029041951272953746 },\n { x: -0.0000018829999999999915, y: 0.00028304357792953736 },\n { x: -0.0000018819999999999915, y: -0.005840458277975979 },\n { x: -0.0000018809999999999914, y: -0.03132213845755484 },\n { x: -0.0000018799999999999913, y: -0.036268599852988324 },\n { x: -0.0000018789999999999912, y: 0.002205837610027757 },\n { x: -0.0000018779999999999912, y: 0.013031057600248145 },\n { x: -0.000001876999999999991, y: -0.03455574905322708 },\n { x: -0.000001875999999999991, y: -0.029743157999385265 },\n { x: -0.000001874999999999991, y: -0.010761312798439556 },\n { x: -0.0000018739999999999909, y: 0.013523124350955592 },\n { x: -0.0000018729999999999908, y: 0.03568361714025206 },\n { x: -0.0000018719999999999907, y: -0.016715409638851157 },\n { x: -0.0000018709999999999906, y: -0.00206357013860716 },\n { x: -0.0000018699999999999906, y: 0.03411670680972927 },\n { x: -0.0000018689999999999905, y: -0.02059153285669426 },\n { x: -0.0000018679999999999904, y: -0.03633104201502672 },\n { x: -0.0000018669999999999903, y: -0.006489791618759054 },\n { x: -0.0000018659999999999903, y: 0.01045866733469699 },\n { x: -0.0000018649999999999902, y: -0.0027697467676163503 },\n { x: -0.0000018639999999999901, y: -0.029697004907042607 },\n { x: -0.00000186299999999999, y: 0.005723695241045038 },\n { x: -0.00000186199999999999, y: -0.023432819432466293 },\n { x: -0.0000018609999999999899, y: 0.018208640624164177 },\n { x: -0.0000018599999999999898, y: 0.03397687566261656 },\n { x: -0.0000018589999999999897, y: 0.001044150533833599 },\n { x: -0.0000018579999999999897, y: 0.016601315132935505 },\n { x: -0.0000018569999999999896, y: 0.03443461371113354 },\n { x: -0.0000018559999999999895, y: 0.030551410069500705 },\n { x: -0.0000018549999999999894, y: 0.023762302714107127 },\n { x: -0.0000018539999999999894, y: 0.0013342846525567543 },\n { x: -0.0000018529999999999893, y: -0.0037704642983602326 },\n { x: -0.0000018519999999999892, y: 0.02075692057102816 },\n { x: -0.0000018509999999999891, y: 0.023435128809193326 },\n { x: -0.000001849999999999989, y: -0.016480263785375045 },\n { x: -0.000001848999999999989, y: 0.008988784831886632 },\n { x: -0.000001847999999999989, y: 0.02373799637260906 },\n { x: -0.0000018469999999999888, y: -0.029384486124532948 },\n { x: -0.0000018459999999999888, y: 0.035290195796315094 },\n { x: -0.0000018449999999999887, y: 0.0020322517599329587 },\n { x: -0.0000018439999999999886, y: 0.013459324289630826 },\n { x: -0.0000018429999999999885, y: -0.03349981225685477 },\n { x: -0.0000018419999999999885, y: 0.0004503222444585232 },\n { x: -0.0000018409999999999884, y: -0.025282688802514657 },\n { x: -0.0000018399999999999883, y: -0.008140477762443664 },\n { x: -0.0000018389999999999882, y: 0.038161874411562505 },\n { x: -0.0000018379999999999882, y: -0.009017410538765064 },\n { x: -0.000001836999999999988, y: 0.00739591383229465 },\n { x: -0.000001835999999999988, y: 0.020793198627238142 },\n { x: -0.000001834999999999988, y: 0.03600691188395843 },\n { x: -0.0000018339999999999879, y: -0.014613405824333863 },\n { x: -0.0000018329999999999878, y: -0.03556249668928594 },\n { x: -0.0000018319999999999877, y: -0.006977721579423031 },\n { x: -0.0000018309999999999876, y: 0.00218877764318305 },\n { x: -0.0000018299999999999876, y: 0.03145750642434614 },\n { x: -0.0000018289999999999875, y: 0.025384659279849106 },\n { x: -0.0000018279999999999874, y: -0.001949637967593855 },\n { x: -0.0000018269999999999873, y: -0.017396974557809246 },\n { x: -0.0000018259999999999873, y: 0.032611469706830126 },\n { x: -0.0000018249999999999872, y: -0.002817649514673136 },\n { x: -0.0000018239999999999871, y: 0.027260544960630944 },\n { x: -0.000001822999999999987, y: 0.00033326240856916046 },\n { x: -0.000001821999999999987, y: 0.03486195512822336 },\n { x: -0.0000018209999999999869, y: 0.03690884703117051 },\n { x: -0.0000018199999999999868, y: 0.03489597947977195 },\n { x: -0.0000018189999999999867, y: -0.030348952949814937 },\n { x: -0.0000018179999999999867, y: 0.026688499136513034 },\n { x: -0.0000018169999999999866, y: 0.006863276108334038 },\n { x: -0.0000018159999999999865, y: -0.026016793825958878 },\n { x: -0.0000018149999999999864, y: 0.014008012573715482 },\n { x: -0.0000018139999999999864, y: 0.009940815646185914 },\n { x: -0.0000018129999999999863, y: -0.037945867585199876 },\n { x: -0.0000018119999999999862, y: -0.001443902586843467 },\n { x: -0.0000018109999999999861, y: 0.01991400228379446 },\n { x: -0.000001809999999999986, y: 0.01020360634032546 },\n { x: -0.000001808999999999986, y: 0.027383171571702034 },\n { x: -0.000001807999999999986, y: -0.011592117108027615 },\n { x: -0.0000018069999999999858, y: 0.03810667828556246 },\n { x: -0.0000018059999999999858, y: 0.009892743158172968 },\n { x: -0.0000018049999999999857, y: 0.02332286861861942 },\n { x: -0.0000018039999999999856, y: -0.029160930928847445 },\n { x: -0.0000018029999999999855, y: 0.03083595102606925 },\n { x: -0.0000018019999999999855, y: 0.03185933705766087 },\n { x: -0.0000018009999999999854, y: -0.016322833672328733 },\n { x: -0.0000017999999999999853, y: -0.037541498780036035 },\n { x: -0.0000017989999999999852, y: 0.03756493189487169 },\n { x: -0.0000017979999999999852, y: 0.00855067935575207 },\n { x: -0.000001796999999999985, y: 0.01762873682077035 },\n { x: -0.000001795999999999985, y: -0.031271530406916194 },\n { x: -0.000001794999999999985, y: -0.007511235404087135 },\n { x: -0.0000017939999999999849, y: 0.008675065759418225 },\n { x: -0.0000017929999999999848, y: 0.003963060404253502 },\n { x: -0.0000017919999999999847, y: 0.00029004691820512697 },\n { x: -0.0000017909999999999846, y: -0.0062925581838445335 },\n { x: -0.0000017899999999999846, y: -0.019073943132143625 },\n { x: -0.0000017889999999999845, y: 0.021782356217131624 },\n { x: -0.0000017879999999999844, y: 0.014551121055763026 },\n { x: -0.0000017869999999999843, y: -0.0037712770378505334 },\n { x: -0.0000017859999999999843, y: 0.003196404071630132 },\n { x: -0.0000017849999999999842, y: 0.004097601482372611 },\n { x: -0.000001783999999999984, y: -0.02760739005761792 },\n { x: -0.000001782999999999984, y: 0.02346455705246093 },\n { x: -0.000001781999999999984, y: 0.028157954639258607 },\n { x: -0.0000017809999999999839, y: -0.0281663646584906 },\n { x: -0.0000017799999999999838, y: -0.020050321492854864 },\n { x: -0.0000017789999999999837, y: -0.03450758648650922 },\n { x: -0.0000017779999999999837, y: -0.004711109700737442 },\n { x: -0.0000017769999999999836, y: -0.02153624154001886 },\n { x: -0.0000017759999999999835, y: 0.0024897326824874764 },\n { x: -0.0000017749999999999834, y: -0.02929082189178312 },\n { x: -0.0000017739999999999834, y: -0.021160404534973545 },\n { x: -0.0000017729999999999833, y: 0.002926598875496956 },\n { x: -0.0000017719999999999832, y: 0.02210674047685129 },\n { x: -0.0000017709999999999831, y: -0.026253693966361482 },\n { x: -0.000001769999999999983, y: 0.05359998036268774 },\n { x: -0.000001768999999999983, y: 0.03806738529198046 },\n { x: -0.000001767999999999983, y: 0.026994016056222522 },\n { x: -0.0000017669999999999828, y: 0.02625644997491527 },\n { x: -0.0000017659999999999828, y: 0.01665819435009591 },\n { x: -0.0000017649999999999827, y: 0.023990832366654127 },\n { x: -0.0000017639999999999826, y: 0.03265737148275018 },\n { x: -0.0000017629999999999825, y: -0.018629533687752838 },\n { x: -0.0000017619999999999825, y: -0.019302626236293367 },\n { x: -0.0000017609999999999824, y: 0.02876098449524871 },\n { x: -0.0000017599999999999823, y: 0.02063751975883102 },\n { x: -0.0000017589999999999822, y: 0.003113301195771266 },\n { x: -0.0000017579999999999822, y: 0.024922292320332523 },\n { x: -0.000001756999999999982, y: -0.0025514888923617663 },\n { x: -0.000001755999999999982, y: -0.028108413760713165 },\n { x: -0.000001754999999999982, y: 0.03770333639507348 },\n { x: -0.0000017539999999999819, y: -0.03317018103662581 },\n { x: -0.0000017529999999999818, y: 0.02577908324360529 },\n { x: -0.0000017519999999999817, y: -0.004217730571231011 },\n { x: -0.0000017509999999999816, y: -0.010211916917125268 },\n { x: -0.0000017499999999999816, y: 0.0002387325693502609 },\n { x: -0.0000017489999999999815, y: 0.01730955555392116 },\n { x: -0.0000017479999999999814, y: -0.003231023023180327 },\n { x: -0.0000017469999999999813, y: 0.015104797909205239 },\n { x: -0.0000017459999999999813, y: -0.01581055133778467 },\n { x: -0.0000017449999999999812, y: -0.014337983194033614 },\n { x: -0.000001743999999999981, y: -0.03189010354523514 },\n { x: -0.000001742999999999981, y: -0.005811701639256257 },\n { x: -0.000001741999999999981, y: 0.02131138341707936 },\n { x: -0.0000017409999999999809, y: 0.033494505712979725 },\n { x: -0.0000017399999999999808, y: -0.011268725478945517 },\n { x: -0.0000017389999999999807, y: -0.00732929990942941 },\n { x: -0.0000017379999999999806, y: 0.0208494277293929 },\n { x: -0.0000017369999999999806, y: -0.004183691156097971 },\n { x: -0.0000017359999999999805, y: 0.002863262513397182 },\n { x: -0.0000017349999999999804, y: 0.011653655449059285 },\n { x: -0.0000017339999999999803, y: 0.004248393677670983 },\n { x: -0.0000017329999999999803, y: 0.03482355223939272 },\n { x: -0.0000017319999999999802, y: -0.03701881013794184 },\n { x: -0.0000017309999999999801, y: -0.004771932178194324 },\n { x: -0.00000172999999999998, y: 0.005817386986338741 },\n { x: -0.00000172899999999998, y: 0.014114083473255634 },\n { x: -0.00000172799999999998, y: -0.005084168187920563 },\n { x: -0.0000017269999999999798, y: -0.028948148966163323 },\n { x: -0.0000017259999999999797, y: 0.026854936956580734 },\n { x: -0.0000017249999999999797, y: -0.014406758716746666 },\n { x: -0.0000017239999999999796, y: 0.0014100396411234517 },\n { x: -0.0000017229999999999795, y: -0.0242366217939274 },\n { x: -0.0000017219999999999794, y: -0.021505584137149807 },\n { x: -0.0000017209999999999794, y: -0.0015774938453259181 },\n { x: -0.0000017199999999999793, y: -0.011577040773153862 },\n { x: -0.0000017189999999999792, y: -0.01651527046796279 },\n { x: -0.0000017179999999999791, y: 0.01351805827157814 },\n { x: -0.000001716999999999979, y: -0.02532953126946272 },\n { x: -0.000001715999999999979, y: -0.00785046991469629 },\n { x: -0.000001714999999999979, y: 0.024158535288603317 },\n { x: -0.0000017139999999999788, y: 0.02136620501046216 },\n { x: -0.0000017129999999999788, y: -0.030617441000178443 },\n { x: -0.0000017119999999999787, y: -0.010374656275300837 },\n { x: -0.0000017109999999999786, y: 0.03092700293256923 },\n { x: -0.0000017099999999999785, y: -0.018237460571863425 },\n { x: -0.0000017089999999999785, y: 0.017185053715860495 },\n { x: -0.0000017079999999999784, y: -0.013665421833832443 },\n { x: -0.0000017069999999999783, y: 0.007695845787504048 },\n { x: -0.0000017059999999999782, y: -0.01826986965854103 },\n { x: -0.0000017049999999999782, y: -0.03568570786873319 },\n { x: -0.000001703999999999978, y: 0.017205170628042856 },\n { x: -0.000001702999999999978, y: -0.02766296350511127 },\n { x: -0.000001701999999999978, y: 0.006249663368645423 },\n { x: -0.0000017009999999999779, y: 0.026237862328107483 },\n { x: -0.0000016999999999999778, y: -0.0006922538726388271 },\n { x: -0.0000016989999999999777, y: -0.01157977691779717 },\n { x: -0.0000016979999999999776, y: -0.006116621163963813 },\n { x: -0.0000016969999999999776, y: -0.01826167999463326 },\n { x: -0.0000016959999999999775, y: -0.0202664714611218 },\n { x: -0.0000016949999999999774, y: 0.019580936889153466 },\n { x: -0.0000016939999999999773, y: 0.036516020922498144 },\n { x: -0.0000016929999999999773, y: 0.006726740477367732 },\n { x: -0.0000016919999999999772, y: 0.037557247726196515 },\n { x: -0.0000016909999999999771, y: 0.002067814002438272 },\n { x: -0.000001689999999999977, y: 0.037599406847097165 },\n { x: -0.000001688999999999977, y: -0.0017070734718797657 },\n { x: -0.0000016879999999999769, y: -0.023570591476728377 },\n { x: -0.0000016869999999999768, y: -0.0077551906537367205 },\n { x: -0.0000016859999999999767, y: -0.029287936482090843 },\n { x: -0.0000016849999999999767, y: 0.006663992282813844 },\n { x: -0.0000016839999999999766, y: -0.005548332476572741 },\n { x: -0.0000016829999999999765, y: -0.023951053384545097 },\n { x: -0.0000016819999999999764, y: -0.03291321066508165 },\n { x: -0.0000016809999999999764, y: -0.019960586070344042 },\n { x: -0.0000016799999999999763, y: -0.007054054584606562 },\n { x: -0.0000016789999999999762, y: 0.0028747173734658613 },\n { x: -0.0000016779999999999761, y: -0.00045323748266656204 },\n { x: -0.000001676999999999976, y: 0.02470966737147559 },\n { x: -0.000001675999999999976, y: 0.02555662047756956 },\n { x: -0.000001674999999999976, y: 0.001403952338910754 },\n { x: -0.0000016739999999999758, y: 0.010690444473446312 },\n { x: -0.0000016729999999999758, y: -0.03754330222745358 },\n { x: -0.0000016719999999999757, y: 0.024041042260192626 },\n { x: -0.0000016709999999999756, y: 0.01822540019455112 },\n { x: -0.0000016699999999999755, y: -0.0353528108635974 },\n { x: -0.0000016689999999999755, y: 0.022709725473962775 },\n { x: -0.0000016679999999999754, y: 0.013263211725082578 },\n { x: -0.0000016669999999999753, y: -0.036001865944095844 },\n { x: -0.0000016659999999999752, y: -0.021589626479641633 },\n { x: -0.0000016649999999999752, y: -0.0009457269156792226 },\n { x: -0.000001663999999999975, y: -0.03526730551618745 },\n { x: -0.000001662999999999975, y: -0.031139949355087664 },\n { x: -0.000001661999999999975, y: 0.004528737376877672 },\n { x: -0.0000016609999999999749, y: -0.03827465514571537 },\n { x: -0.0000016599999999999748, y: -0.02503998889103173 },\n { x: -0.0000016589999999999747, y: -0.010169102639365898 },\n { x: -0.0000016579999999999746, y: -0.01001446525404002 },\n { x: -0.0000016569999999999746, y: 0.016680736485168293 },\n { x: -0.0000016559999999999745, y: -0.013732467310046926 },\n { x: -0.0000016549999999999744, y: -0.017721649992474872 },\n { x: -0.0000016539999999999743, y: -0.0019302643202449875 },\n { x: -0.0000016529999999999743, y: -0.0081300397611309 },\n { x: -0.0000016519999999999742, y: 0.011309441104275324 },\n { x: -0.0000016509999999999741, y: -0.0069967222102437845 },\n { x: -0.000001649999999999974, y: 0.027687391042178315 },\n { x: -0.000001648999999999974, y: 0.038273352069532154 },\n { x: -0.0000016479999999999739, y: -0.02129943201691494 },\n { x: -0.0000016469999999999738, y: 0.02732918341023124 },\n { x: -0.0000016459999999999737, y: 0.03498099852687302 },\n { x: -0.0000016449999999999737, y: 0.032307917109769727 },\n { x: -0.0000016439999999999736, y: 0.005823496283235522 },\n { x: -0.0000016429999999999735, y: 0.010325729735277123 },\n { x: -0.0000016419999999999734, y: -0.017081451782887343 },\n { x: -0.0000016409999999999734, y: -0.016511195560129546 },\n { x: -0.0000016399999999999733, y: 0.028076988497025952 },\n { x: -0.0000016389999999999732, y: 0.025124124947821923 },\n { x: -0.0000016379999999999731, y: 0.003913201123204757 },\n { x: -0.000001636999999999973, y: 0.016040005116074802 },\n { x: -0.000001635999999999973, y: -0.0058825529035995035 },\n { x: -0.000001634999999999973, y: 0.027711083464403975 },\n { x: -0.0000016339999999999728, y: -0.03637297933871895 },\n { x: -0.0000016329999999999728, y: 0.02417521122398841 },\n { x: -0.0000016319999999999727, y: -0.025972328826643874 },\n { x: -0.0000016309999999999726, y: 0.026150542055262474 },\n { x: -0.0000016299999999999725, y: 0.010180716162685193 },\n { x: -0.0000016289999999999725, y: -0.03420629545303245 },\n { x: -0.0000016279999999999724, y: 0.009302769603414154 },\n { x: -0.0000016269999999999723, y: -0.03513708423837472 },\n { x: -0.0000016259999999999722, y: 0.001002193988481779 },\n { x: -0.0000016249999999999722, y: -0.02176335991314274 },\n { x: -0.000001623999999999972, y: -0.007806508307155519 },\n { x: -0.000001622999999999972, y: -0.030911213821737196 },\n { x: -0.000001621999999999972, y: -0.027088600574083705 },\n { x: -0.0000016209999999999719, y: 0.03267522902742575 },\n { x: -0.0000016199999999999718, y: -0.0011230303124528781 },\n { x: -0.0000016189999999999717, y: 0.02264220548172921 },\n { x: -0.0000016179999999999716, y: 0.019222764186777923 },\n { x: -0.0000016169999999999716, y: 0.014582739267587812 },\n { x: -0.0000016159999999999715, y: 0.023712052179536054 },\n { x: -0.0000016149999999999714, y: 0.03793832988011892 },\n { x: -0.0000016139999999999713, y: 0.029776525394076048 },\n { x: -0.0000016129999999999713, y: -0.02656036550095476 },\n { x: -0.0000016119999999999712, y: -0.03710389085820699 },\n { x: -0.0000016109999999999711, y: 0.003956991603219941 },\n { x: -0.000001609999999999971, y: -0.015159294164777766 },\n { x: -0.000001608999999999971, y: 0.02878750291330663 },\n { x: -0.0000016079999999999709, y: 0.0306487879720793 },\n { x: -0.0000016069999999999708, y: 0.006111693429665233 },\n { x: -0.0000016059999999999707, y: -0.018419938506552807 },\n { x: -0.0000016049999999999707, y: 0.022337135627419805 },\n { x: -0.0000016039999999999706, y: 0.0038467144798397346 },\n { x: -0.0000016029999999999705, y: 0.02397815606698168 },\n { x: -0.0000016019999999999704, y: -0.018691207063099256 },\n { x: -0.0000016009999999999704, y: -0.004247287342880034 },\n { x: -0.0000015999999999999703, y: -0.013588836507485508 },\n { x: -0.0000015989999999999702, y: -0.02234393890864792 },\n { x: -0.0000015979999999999701, y: 0.02763686603284322 },\n { x: -0.00000159699999999997, y: 0.01830383168190865 },\n { x: -0.00000159599999999997, y: 0.030411638585228492 },\n { x: -0.00000159499999999997, y: 0.028976314214250697 },\n { x: -0.0000015939999999999698, y: 0.032471366429675075 },\n { x: -0.0000015929999999999698, y: 0.005275984619956652 },\n { x: -0.0000015919999999999697, y: 0.01202838566774187 },\n { x: -0.0000015909999999999696, y: -0.030463302243678353 },\n { x: -0.0000015899999999999695, y: -0.027903637871968798 },\n { x: -0.0000015889999999999695, y: -0.01564286546158084 },\n { x: -0.0000015879999999999694, y: -0.026594371449461626 },\n { x: -0.0000015869999999999693, y: -0.004368804744709417 },\n { x: -0.0000015859999999999692, y: -0.029326479185961565 },\n { x: -0.0000015849999999999692, y: -0.03692357810548272 },\n { x: -0.000001583999999999969, y: -0.009035109854370968 },\n { x: -0.000001582999999999969, y: 0.027295175150539256 },\n { x: -0.000001581999999999969, y: -0.016117249239187812 },\n { x: -0.0000015809999999999689, y: -0.024946630431160816 },\n { x: -0.0000015799999999999688, y: -0.022865028495272093 },\n { x: -0.0000015789999999999687, y: 0.028965465589157326 },\n { x: -0.0000015779999999999686, y: -0.004570467627980707 },\n { x: -0.0000015769999999999686, y: 0.03629402789384118 },\n { x: -0.0000015759999999999685, y: 0.01682744387323598 },\n { x: -0.0000015749999999999684, y: 0.007814712769640611 },\n { x: -0.0000015739999999999683, y: 0.0019249147715995946 },\n { x: -0.0000015729999999999683, y: -0.021704365266979865 },\n { x: -0.0000015719999999999682, y: -0.023673888940024205 },\n { x: -0.000001570999999999968, y: -0.004677381551044262 },\n { x: -0.000001569999999999968, y: -0.006068617237826557 },\n { x: -0.000001568999999999968, y: -0.017918076789667885 },\n { x: -0.0000015679999999999679, y: 0.026551550390859543 },\n { x: -0.0000015669999999999678, y: 0.014500599778608384 },\n { x: -0.0000015659999999999677, y: -0.03642499249327356 },\n { x: -0.0000015649999999999677, y: -0.0037760651011045864 },\n { x: -0.0000015639999999999676, y: 0.023517454573185794 },\n { x: -0.0000015629999999999675, y: 0.016814922373429277 },\n { x: -0.0000015619999999999674, y: -0.014137761182278887 },\n { x: -0.0000015609999999999674, y: -0.01732752047890942 },\n { x: -0.0000015599999999999673, y: 0.03369900701162833 },\n { x: -0.0000015589999999999672, y: 0.025786809907088922 },\n { x: -0.0000015579999999999671, y: 0.03494285565327627 },\n { x: -0.000001556999999999967, y: -0.020796040081896092 },\n { x: -0.000001555999999999967, y: -0.0358237436655389 },\n { x: -0.000001554999999999967, y: -0.022319507433199957 },\n { x: -0.0000015539999999999668, y: 0.004650034718501579 },\n { x: -0.0000015529999999999668, y: -0.007666410808605413 },\n { x: -0.0000015519999999999667, y: 0.009137852540213638 },\n { x: -0.0000015509999999999666, y: -0.010767696400769713 },\n { x: -0.0000015499999999999665, y: -0.005587811745368615 },\n { x: -0.0000015489999999999664, y: 0.008415642214975446 },\n { x: -0.0000015479999999999664, y: -0.01081446284084006 },\n { x: -0.0000015469999999999663, y: 0.015314461815086179 },\n { x: -0.0000015459999999999662, y: 0.008450995041305025 },\n { x: -0.0000015449999999999661, y: 0.004444324412883591 },\n { x: -0.000001543999999999966, y: -0.018955883210844692 },\n { x: -0.000001542999999999966, y: 0.037255692656265195 },\n { x: -0.000001541999999999966, y: 0.03688475931060501 },\n { x: -0.0000015409999999999658, y: 0.050730434673620324 },\n { x: -0.0000015399999999999658, y: -0.01758099399889343 },\n { x: -0.0000015389999999999657, y: 0.001879036494873778 },\n { x: -0.0000015379999999999656, y: 0.025673340786925784 },\n { x: -0.0000015369999999999655, y: -0.007330310913538365 },\n { x: -0.0000015359999999999655, y: 0.022629615096798922 },\n { x: -0.0000015349999999999654, y: 0.015213991925625812 },\n { x: -0.0000015339999999999653, y: -0.009524043428847741 },\n { x: -0.0000015329999999999652, y: 0.02007465671903068 },\n { x: -0.0000015319999999999652, y: 0.004227700939355161 },\n { x: -0.000001530999999999965, y: -0.004024839587506067 },\n { x: -0.000001529999999999965, y: 0.01047966241120587 },\n { x: -0.000001528999999999965, y: -0.030366590788430216 },\n { x: -0.0000015279999999999649, y: -0.008926299594305263 },\n { x: -0.0000015269999999999648, y: -0.020224092451015124 },\n { x: -0.0000015259999999999647, y: 0.006585604801753251 },\n { x: -0.0000015249999999999646, y: 0.010846671749648913 },\n { x: -0.0000015239999999999646, y: 0.016093650543890038 },\n { x: -0.0000015229999999999645, y: 0.0018563985150977886 },\n { x: -0.0000015219999999999644, y: 0.033758821423495164 },\n { x: -0.0000015209999999999643, y: -0.003168435574904403 },\n { x: -0.0000015199999999999643, y: -0.01132088989622624 },\n { x: -0.0000015189999999999642, y: 0.0007549758022283582 },\n { x: -0.0000015179999999999641, y: -0.030825787058457187 },\n { x: -0.000001516999999999964, y: -0.006838645511243576 },\n { x: -0.000001515999999999964, y: 0.02906803026576124 },\n { x: -0.000001514999999999964, y: 0.02742744909956504 },\n { x: -0.0000015139999999999638, y: 0.00665307937926437 },\n { x: -0.0000015129999999999637, y: 0.03316412891553206 },\n { x: -0.0000015119999999999637, y: 0.017803996184510625 },\n { x: -0.0000015109999999999636, y: -0.06589171996638397 },\n { x: -0.0000015099999999999635, y: -0.027603144614221763 },\n { x: -0.0000015089999999999634, y: 0.019489043192729257 },\n { x: -0.0000015079999999999634, y: -0.015630527648990342 },\n { x: -0.0000015069999999999633, y: 0.016025860611987738 },\n { x: -0.0000015059999999999632, y: -0.025830766306315766 },\n { x: -0.0000015049999999999631, y: 0.02135637176769207 },\n { x: -0.000001503999999999963, y: 0.005467210366994031 },\n { x: -0.000001502999999999963, y: 0.02870958963462975 },\n { x: -0.000001501999999999963, y: 0.0197343222335618 },\n { x: -0.0000015009999999999628, y: 0.0215108445606027 },\n { x: -0.0000014999999999999628, y: -0.024554000625190378 },\n { x: -0.0000014989999999999627, y: 0.009766405377519948 },\n { x: -0.0000014979999999999626, y: 0.016604303734639708 },\n { x: -0.0000014969999999999625, y: 0.02614364488390815 },\n { x: -0.0000014959999999999625, y: 0.026593595972571396 },\n { x: -0.0000014949999999999624, y: -0.02508773158101463 },\n { x: -0.0000014939999999999623, y: 0.0004217851630237949 },\n { x: -0.0000014929999999999622, y: 0.00038824184760433394 },\n { x: -0.0000014919999999999622, y: 0.036018010076732346 },\n { x: -0.000001490999999999962, y: -0.001845705278515307 },\n { x: -0.000001489999999999962, y: 0.014418936547289547 },\n { x: -0.000001488999999999962, y: -0.006413652163800691 },\n { x: -0.0000014879999999999619, y: 0.013614132507233676 },\n { x: -0.0000014869999999999618, y: 0.022888423992930774 },\n { x: -0.0000014859999999999617, y: 0.02630156526696778 },\n { x: -0.0000014849999999999616, y: -0.014683265916556519 },\n { x: -0.0000014839999999999616, y: 0.0172981856994561 },\n { x: -0.0000014829999999999615, y: -0.03130213155004245 },\n { x: -0.0000014819999999999614, y: -0.025848845474759317 },\n { x: -0.0000014809999999999613, y: -0.02689770555208866 },\n { x: -0.0000014799999999999613, y: -0.03250423235521302 },\n { x: -0.0000014789999999999612, y: -0.02961638681474093 },\n { x: -0.0000014779999999999611, y: 0.0035325217924576874 },\n { x: -0.000001476999999999961, y: -0.013338067664116765 },\n { x: -0.000001475999999999961, y: 0.014103781002583669 },\n { x: -0.0000014749999999999609, y: 0.028160161100842664 },\n { x: -0.0000014739999999999608, y: -0.02072358885035968 },\n { x: -0.0000014729999999999607, y: -0.012258872740382778 },\n { x: -0.0000014719999999999607, y: 0.014327771077939696 },\n { x: -0.0000014709999999999606, y: -0.027036068482999054 },\n { x: -0.0000014699999999999605, y: 0.0009617176485291096 },\n { x: -0.0000014689999999999604, y: -0.023944562341732315 },\n { x: -0.0000014679999999999604, y: 0.03647736441639213 },\n { x: -0.0000014669999999999603, y: -0.014188368551879518 },\n { x: -0.0000014659999999999602, y: -0.03425407275374076 },\n { x: -0.0000014649999999999601, y: 0.025517563902703894 },\n { x: -0.00000146399999999996, y: -0.0190038712386199 },\n { x: -0.00000146299999999996, y: -0.024506638363246853 },\n { x: -0.00000146199999999996, y: 0.017470478791539557 },\n { x: -0.0000014609999999999598, y: -0.006897958537798765 },\n { x: -0.0000014599999999999598, y: -0.01669165739633163 },\n { x: -0.0000014589999999999597, y: 0.027771923211038208 },\n { x: -0.0000014579999999999596, y: -0.020640591294015694 },\n { x: -0.0000014569999999999595, y: -0.03354556150560368 },\n { x: -0.0000014559999999999595, y: -0.008066856315532563 },\n { x: -0.0000014549999999999594, y: -0.011634281946335177 },\n { x: -0.0000014539999999999593, y: -0.016139012079545993 },\n { x: -0.0000014529999999999592, y: 0.02079255450068453 },\n { x: -0.0000014519999999999592, y: -0.03102102969393635 },\n { x: -0.000001450999999999959, y: 0.03298856541824959 },\n { x: -0.000001449999999999959, y: -0.033427019696285185 },\n { x: -0.000001448999999999959, y: 0.00873626851594936 },\n { x: -0.0000014479999999999589, y: 0.02217444921260821 },\n { x: -0.0000014469999999999588, y: -0.004222592004454241 },\n { x: -0.0000014459999999999587, y: 0.03730086149836957 },\n { x: -0.0000014449999999999586, y: 0.027257368075554504 },\n { x: -0.0000014439999999999586, y: -0.021994380891192402 },\n { x: -0.0000014429999999999585, y: -0.03126856116532146 },\n { x: -0.0000014419999999999584, y: 0.02099266098659368 },\n { x: -0.0000014409999999999583, y: 0.025370337615773637 },\n { x: -0.0000014399999999999583, y: 0.016631860054068946 },\n { x: -0.0000014389999999999582, y: 0.006766847350362779 },\n { x: -0.0000014379999999999581, y: -0.02368053448071696 },\n { x: -0.000001436999999999958, y: -0.017758267849415872 },\n { x: -0.000001435999999999958, y: -0.019362471611339353 },\n { x: -0.0000014349999999999579, y: -0.0048261114143355755 },\n { x: -0.0000014339999999999578, y: -0.02102853079381428 },\n { x: -0.0000014329999999999577, y: 0.008041901856350753 },\n { x: -0.0000014319999999999577, y: -0.024787299935330426 },\n { x: -0.0000014309999999999576, y: -0.02423241432973991 },\n { x: -0.0000014299999999999575, y: 0.023303220028534934 },\n { x: -0.0000014289999999999574, y: 0.037840472733514756 },\n { x: -0.0000014279999999999574, y: -0.007968713344726411 },\n { x: -0.0000014269999999999573, y: -0.008809174412449917 },\n { x: -0.0000014259999999999572, y: -0.03195646202096297 },\n { x: -0.0000014249999999999571, y: -0.01473277825690707 },\n { x: -0.000001423999999999957, y: -0.02206267118100727 },\n { x: -0.000001422999999999957, y: -0.018795395858838607 },\n { x: -0.000001421999999999957, y: -0.027940301585861842 },\n { x: -0.0000014209999999999568, y: -0.031309593314700845 },\n { x: -0.0000014199999999999568, y: 0.01862387801971263 },\n { x: -0.0000014189999999999567, y: -0.03542090674731725 },\n { x: -0.0000014179999999999566, y: 0.02058439907191344 },\n { x: -0.0000014169999999999565, y: -0.01633204340256826 },\n { x: -0.0000014159999999999565, y: -0.031036347474314906 },\n { x: -0.0000014149999999999564, y: 0.01928568032215615 },\n { x: -0.0000014139999999999563, y: -0.02714607627138527 },\n { x: -0.0000014129999999999562, y: -0.005910351368508948 },\n { x: -0.0000014119999999999562, y: -0.02774298660313753 },\n { x: -0.000001410999999999956, y: 0.0009198631014646014 },\n { x: -0.000001409999999999956, y: 0.029804040231150082 },\n { x: -0.000001408999999999956, y: 0.011243413063037647 },\n { x: -0.0000014079999999999559, y: 0.027073847634409037 },\n { x: -0.0000014069999999999558, y: -0.01757282472291928 },\n { x: -0.0000014059999999999557, y: 0.03584189654124867 },\n { x: -0.0000014049999999999556, y: 0.01656371343174638 },\n { x: -0.0000014039999999999556, y: 0.03401034753412705 },\n { x: -0.0000014029999999999555, y: 0.0364293610113262 },\n { x: -0.0000014019999999999554, y: -0.02968634132781467 },\n { x: -0.0000014009999999999553, y: 0.027729709084621565 },\n { x: -0.0000013999999999999553, y: -0.02027414339986988 },\n { x: -0.0000013989999999999552, y: -0.00220875464444255 },\n { x: -0.000001397999999999955, y: 0.036945016665614956 },\n { x: -0.000001396999999999955, y: -0.008306285425409227 },\n { x: -0.000001395999999999955, y: -0.016219089825118223 },\n { x: -0.0000013949999999999549, y: -0.020878229946553497 },\n { x: -0.0000013939999999999548, y: -0.025520979896904446 },\n { x: -0.0000013929999999999547, y: 0.027965267967334048 },\n { x: -0.0000013919999999999547, y: -0.028858358680431264 },\n { x: -0.0000013909999999999546, y: 0.007782789129562599 },\n { x: -0.0000013899999999999545, y: 0.015960109216097515 },\n { x: -0.0000013889999999999544, y: -0.002155913809696033 },\n { x: -0.0000013879999999999544, y: 0.030975181037093333 },\n { x: -0.0000013869999999999543, y: -0.018141006674456533 },\n { x: -0.0000013859999999999542, y: 0.03562673423170332 },\n { x: -0.0000013849999999999541, y: -0.037739831727478385 },\n { x: -0.000001383999999999954, y: -0.0013266178060266228 },\n { x: -0.000001382999999999954, y: 0.01874756023284197 },\n { x: -0.000001381999999999954, y: -0.02081164189724986 },\n { x: -0.0000013809999999999538, y: 0.0025335327434042737 },\n { x: -0.0000013799999999999538, y: 0.005810873518892579 },\n { x: -0.0000013789999999999537, y: -0.01844005482900577 },\n { x: -0.0000013779999999999536, y: 0.037123125325068465 },\n { x: -0.0000013769999999999535, y: 0.02899341595126094 },\n { x: -0.0000013759999999999535, y: 0.02616715237173488 },\n { x: -0.0000013749999999999534, y: -0.007589744321646553 },\n { x: -0.0000013739999999999533, y: -0.005437628901102876 },\n { x: -0.0000013729999999999532, y: -0.03662846529186486 },\n { x: -0.0000013719999999999532, y: -0.011762585503595716 },\n { x: -0.000001370999999999953, y: 0.06286309776804452 },\n { x: -0.000001369999999999953, y: 0.017374807844783857 },\n { x: -0.000001368999999999953, y: 0.030432815929757783 },\n { x: -0.0000013679999999999529, y: -0.008555864397219106 },\n { x: -0.0000013669999999999528, y: 0.017639338599923494 },\n { x: -0.0000013659999999999527, y: 0.004460666964426813 },\n { x: -0.0000013649999999999526, y: -0.02777409992300708 },\n { x: -0.0000013639999999999526, y: 0.019314864238587408 },\n { x: -0.0000013629999999999525, y: 0.034423155361312796 },\n { x: -0.0000013619999999999524, y: 0.013670550074769848 },\n { x: -0.0000013609999999999523, y: 0.01286211671995814 },\n { x: -0.0000013599999999999523, y: 0.025982457056539607 },\n { x: -0.0000013589999999999522, y: -0.0006805076262024958 },\n { x: -0.000001357999999999952, y: -0.014287006133468717 },\n { x: -0.000001356999999999952, y: -0.023866647688169883 },\n { x: -0.000001355999999999952, y: -0.025408245960811048 },\n { x: -0.0000013549999999999519, y: 0.03648168320753453 },\n { x: -0.0000013539999999999518, y: -0.018586982139929514 },\n { x: -0.0000013529999999999517, y: -0.03780791096963317 },\n { x: -0.0000013519999999999516, y: -0.01992709429516638 },\n { x: -0.0000013509999999999516, y: 0.03044672460535575 },\n { x: -0.0000013499999999999515, y: 0.028312860988091743 },\n { x: -0.0000013489999999999514, y: -0.02360258441424135 },\n { x: -0.0000013479999999999513, y: 0.005104407322331412 },\n { x: -0.0000013469999999999513, y: -0.0013732143304002328 },\n { x: -0.0000013459999999999512, y: -0.03616337965323662 },\n { x: -0.0000013449999999999511, y: 0.028618774148557295 },\n { x: -0.000001343999999999951, y: 0.026626077203680727 },\n { x: -0.000001342999999999951, y: -0.005746513963225127 },\n { x: -0.000001341999999999951, y: 0.024456610884775846 },\n { x: -0.0000013409999999999508, y: 0.019485149141960104 },\n { x: -0.0000013399999999999507, y: 0.014656760221359241 },\n { x: -0.0000013389999999999507, y: -0.01997743551050904 },\n { x: -0.0000013379999999999506, y: -0.013548665746939657 },\n { x: -0.0000013369999999999505, y: -0.0036552052674584633 },\n { x: -0.0000013359999999999504, y: -0.018932411367259486 },\n { x: -0.0000013349999999999504, y: -0.03741410646605812 },\n { x: -0.0000013339999999999503, y: 0.032019779185694985 },\n { x: -0.0000013329999999999502, y: -0.0028150237733198503 },\n { x: -0.0000013319999999999501, y: 0.009477877439243262 },\n { x: -0.00000133099999999995, y: 0.005887737824228874 },\n { x: -0.00000132999999999995, y: 0.019774612076245292 },\n { x: -0.00000132899999999995, y: -0.035933311534152815 },\n { x: -0.0000013279999999999498, y: 0.034815576349307376 },\n { x: -0.0000013269999999999498, y: 0.03655103430116427 },\n { x: -0.0000013259999999999497, y: -0.036044950277673 },\n { x: -0.0000013249999999999496, y: -0.009356938082272528 },\n { x: -0.0000013239999999999495, y: 0.02442691225993598 },\n { x: -0.0000013229999999999495, y: 0.008282935748187056 },\n { x: -0.0000013219999999999494, y: 0.005064254039896118 },\n { x: -0.0000013209999999999493, y: 0.0235699108346049 },\n { x: -0.0000013199999999999492, y: -0.04617893873673727 },\n { x: -0.0000013189999999999492, y: -0.011162166306264498 },\n { x: -0.000001317999999999949, y: -0.009361849936235084 },\n { x: -0.000001316999999999949, y: 0.022795588980644012 },\n { x: -0.000001315999999999949, y: -0.0014943328086852324 },\n { x: -0.0000013149999999999489, y: -0.033120288884205956 },\n { x: -0.0000013139999999999488, y: 0.01859106848316777 },\n { x: -0.0000013129999999999487, y: -0.0024396261992518605 },\n { x: -0.0000013119999999999486, y: -0.027445842851692256 },\n { x: -0.0000013109999999999486, y: 0.03404726174315386 },\n { x: -0.0000013099999999999485, y: 0.010251967963258278 },\n { x: -0.0000013089999999999484, y: 0.03284361874163441 },\n { x: -0.0000013079999999999483, y: 0.03134195974897309 },\n { x: -0.0000013069999999999483, y: 0.010239920041759318 },\n { x: -0.0000013059999999999482, y: 0.028121737219261846 },\n { x: -0.0000013049999999999481, y: 0.0014161994123639496 },\n { x: -0.000001303999999999948, y: 0.03637248741087605 },\n { x: -0.000001302999999999948, y: -0.006204972979383949 },\n { x: -0.0000013019999999999479, y: -0.00881814563619294 },\n { x: -0.0000013009999999999478, y: 0.018521032100143175 },\n { x: -0.0000012999999999999477, y: -0.0047163464225027235 },\n { x: -0.0000012989999999999477, y: 0.03363485059648552 },\n { x: -0.0000012979999999999476, y: -0.024161607685016687 },\n { x: -0.0000012969999999999475, y: 0.029114929725366882 },\n { x: -0.0000012959999999999474, y: -0.025863237617867726 },\n { x: -0.0000012949999999999474, y: -0.017998947531199096 },\n { x: -0.0000012939999999999473, y: 0.03730941296377263 },\n { x: -0.0000012929999999999472, y: 0.03223350002485523 },\n { x: -0.0000012919999999999471, y: 0.005801365357315892 },\n { x: -0.000001290999999999947, y: 0.03118217852562385 },\n { x: -0.000001289999999999947, y: -0.007603797320247494 },\n { x: -0.000001288999999999947, y: 0.03205654683499334 },\n { x: -0.0000012879999999999468, y: -0.010087561332330443 },\n { x: -0.0000012869999999999468, y: 0.03711386191878725 },\n { x: -0.0000012859999999999467, y: -0.007799062638556878 },\n { x: -0.0000012849999999999466, y: 0.005915187077683867 },\n { x: -0.0000012839999999999465, y: 0.004579354099010703 },\n { x: -0.0000012829999999999465, y: -0.013683392856120895 },\n { x: -0.0000012819999999999464, y: 0.03306877387370842 },\n { x: -0.0000012809999999999463, y: 0.011685586104961562 },\n { x: -0.0000012799999999999462, y: -0.020144757712756374 },\n { x: -0.0000012789999999999462, y: -0.01358075540878098 },\n { x: -0.000001277999999999946, y: 0.0068746744586625 },\n { x: -0.000001276999999999946, y: 0.007024254864453059 },\n { x: -0.000001275999999999946, y: 0.02951019196221618 },\n { x: -0.0000012749999999999459, y: 0.015535352894516028 },\n { x: -0.0000012739999999999458, y: -0.029617879810418878 },\n { x: -0.0000012729999999999457, y: -0.00425323946021398 },\n { x: -0.0000012719999999999456, y: 0.025894830440814948 },\n { x: -0.0000012709999999999456, y: 0.028364549700151526 },\n { x: -0.0000012699999999999455, y: -0.028199789147076767 },\n { x: -0.0000012689999999999454, y: -0.013671232673688924 },\n { x: -0.0000012679999999999453, y: 0.007897044966350478 },\n { x: -0.0000012669999999999453, y: 0.019850639022674994 },\n { x: -0.0000012659999999999452, y: 0.029443024368187375 },\n { x: -0.0000012649999999999451, y: -0.00937584901174294 },\n { x: -0.000001263999999999945, y: 0.02179092381177665 },\n { x: -0.000001262999999999945, y: 0.01774416205007989 },\n { x: -0.0000012619999999999449, y: -0.0021933726320993063 },\n { x: -0.0000012609999999999448, y: -0.01834146257690179 },\n { x: -0.0000012599999999999447, y: 0.019439364222801892 },\n { x: -0.0000012589999999999447, y: 0.008017386099868653 },\n { x: -0.0000012579999999999446, y: -0.03586449881813231 },\n { x: -0.0000012569999999999445, y: 0.007185050135984963 },\n { x: -0.0000012559999999999444, y: -0.030730811413055156 },\n { x: -0.0000012549999999999444, y: 0.008644592364709804 },\n { x: -0.0000012539999999999443, y: 0.0102304563720502 },\n { x: -0.0000012529999999999442, y: 0.028884913512254543 },\n { x: -0.0000012519999999999441, y: 0.015338485402996616 },\n { x: -0.000001250999999999944, y: -0.0104235832161865 },\n { x: -0.000001249999999999944, y: -0.020514628153497923 },\n { x: -0.000001248999999999944, y: -0.012156381546816692 },\n { x: -0.0000012479999999999438, y: -0.016113308749681667 },\n { x: -0.0000012469999999999438, y: 0.0017151575253081595 },\n { x: -0.0000012459999999999437, y: -0.007157636286032977 },\n { x: -0.0000012449999999999436, y: -0.001641976471777978 },\n { x: -0.0000012439999999999435, y: 0.018566303676046263 },\n { x: -0.0000012429999999999435, y: 0.03082408999166559 },\n { x: -0.0000012419999999999434, y: -0.01493515644534032 },\n { x: -0.0000012409999999999433, y: -0.015812006269594517 },\n { x: -0.0000012399999999999432, y: -0.022805096447225483 },\n { x: -0.0000012389999999999432, y: -0.027537114808600598 },\n { x: -0.000001237999999999943, y: -0.034518255251211744 },\n { x: -0.000001236999999999943, y: 0.03174907307353538 },\n { x: -0.000001235999999999943, y: 0.021058651306083913 },\n { x: -0.0000012349999999999429, y: -0.004635419679502099 },\n { x: -0.0000012339999999999428, y: -0.026757517061456695 },\n { x: -0.0000012329999999999427, y: -0.002293382377237708 },\n { x: -0.0000012319999999999426, y: 0.019623032089150106 },\n { x: -0.0000012309999999999426, y: -0.012288924464331864 },\n { x: -0.0000012299999999999425, y: 0.030772999410255755 },\n { x: -0.0000012289999999999424, y: -0.009273576569640733 },\n { x: -0.0000012279999999999423, y: -0.030587757774173056 },\n { x: -0.0000012269999999999423, y: -0.03215111515224133 },\n { x: -0.0000012259999999999422, y: -0.03320947717726895 },\n { x: -0.0000012249999999999421, y: -0.011155697785155561 },\n { x: -0.000001223999999999942, y: -0.026845066426036037 },\n { x: -0.000001222999999999942, y: -0.03689477791929767 },\n { x: -0.0000012219999999999419, y: -0.024216088196057476 },\n { x: -0.0000012209999999999418, y: 0.017544737255589533 },\n { x: -0.0000012199999999999417, y: -0.020802088219794256 },\n { x: -0.0000012189999999999417, y: 0.008822600155463755 },\n { x: -0.0000012179999999999416, y: 0.026247273956979372 },\n { x: -0.0000012169999999999415, y: -0.008371982878929776 },\n { x: -0.0000012159999999999414, y: -0.0348727238259723 },\n { x: -0.0000012149999999999414, y: 0.012299691201663781 },\n { x: -0.0000012139999999999413, y: 0.014552503889707434 },\n { x: -0.0000012129999999999412, y: -0.00823722377047333 },\n { x: -0.0000012119999999999411, y: 0.01788099085164421 },\n { x: -0.000001210999999999941, y: -0.008074005131419797 },\n { x: -0.000001209999999999941, y: -0.03488463040546863 },\n { x: -0.000001208999999999941, y: 0.034636102940360444 },\n { x: -0.0000012079999999999408, y: 0.030681428735635348 },\n { x: -0.0000012069999999999408, y: -0.014932768446193855 },\n { x: -0.0000012059999999999407, y: 0.012736113577859752 },\n { x: -0.0000012049999999999406, y: 0.0075820715681490765 },\n { x: -0.0000012039999999999405, y: -0.016605500190554016 },\n { x: -0.0000012029999999999405, y: 0.03313652856750357 },\n { x: -0.0000012019999999999404, y: -0.007737942808828586 },\n { x: -0.0000012009999999999403, y: 0.029052595418595353 },\n { x: -0.0000011999999999999402, y: -0.005073178892875431 },\n { x: -0.0000011989999999999402, y: -0.007235926980898817 },\n { x: -0.00000119799999999994, y: 0.01872074038773509 },\n { x: -0.00000119699999999994, y: -0.01916236301447569 },\n { x: -0.00000119599999999994, y: -0.008216718930977264 },\n { x: -0.0000011949999999999399, y: 0.03268756095182446 },\n { x: -0.0000011939999999999398, y: 0.025861855378969848 },\n { x: -0.0000011929999999999397, y: 0.0066621093639115695 },\n { x: -0.0000011919999999999396, y: 0.006482817862923509 },\n { x: -0.0000011909999999999396, y: -0.03378980010517232 },\n { x: -0.0000011899999999999395, y: 0.021504581809908704 },\n { x: -0.0000011889999999999394, y: -0.030769314102892447 },\n { x: -0.0000011879999999999393, y: 0.018917972511959865 },\n { x: -0.0000011869999999999393, y: -0.018172063914816412 },\n { x: -0.0000011859999999999392, y: -0.03643418211886705 },\n { x: -0.000001184999999999939, y: -0.013731021747616598 },\n { x: -0.000001183999999999939, y: -0.024402609716972348 },\n { x: -0.000001182999999999939, y: 0.014289190277567811 },\n { x: -0.0000011819999999999389, y: 0.023712522014093095 },\n { x: -0.0000011809999999999388, y: 0.010132832023869852 },\n { x: -0.0000011799999999999387, y: -0.034396425459355014 },\n { x: -0.0000011789999999999387, y: -0.007143348111840217 },\n { x: -0.0000011779999999999386, y: -0.00222291755992494 },\n { x: -0.0000011769999999999385, y: 0.030700736756949655 },\n { x: -0.0000011759999999999384, y: 0.014428658644920446 },\n { x: -0.0000011749999999999384, y: 0.019863924063457356 },\n { x: -0.0000011739999999999383, y: -0.001136499481345822 },\n { x: -0.0000011729999999999382, y: 0.00810338383197685 },\n { x: -0.0000011719999999999381, y: 0.034890309761107956 },\n { x: -0.000001170999999999938, y: -0.027952431251810975 },\n { x: -0.000001169999999999938, y: -0.0014555206594062775 },\n { x: -0.000001168999999999938, y: -0.027500093515103533 },\n { x: -0.0000011679999999999378, y: 0.005500823812076657 },\n { x: -0.0000011669999999999378, y: 0.029184779830460816 },\n { x: -0.0000011659999999999377, y: -0.014165107011783012 },\n { x: -0.0000011649999999999376, y: 0.035402758809883736 },\n { x: -0.0000011639999999999375, y: 0.016363496671050266 },\n { x: -0.0000011629999999999375, y: -0.031025846704796516 },\n { x: -0.0000011619999999999374, y: -0.03747833024534651 },\n { x: -0.0000011609999999999373, y: -0.005035256521069069 },\n { x: -0.0000011599999999999372, y: 0.02413880708042607 },\n { x: -0.0000011589999999999371, y: 0.004719068383673508 },\n { x: -0.000001157999999999937, y: -0.0025649311128587626 },\n { x: -0.000001156999999999937, y: -0.019335144661670807 },\n { x: -0.000001155999999999937, y: -0.001634621142771009 },\n { x: -0.0000011549999999999368, y: 0.012206046410135455 },\n { x: -0.0000011539999999999368, y: -0.004380262713739856 },\n { x: -0.0000011529999999999367, y: -0.01245147030213906 },\n { x: -0.0000011519999999999366, y: -0.02771703108888614 },\n { x: -0.0000011509999999999365, y: 0.012324873689169817 },\n { x: -0.0000011499999999999365, y: 0.01574336709266946 },\n { x: -0.0000011489999999999364, y: -0.01944584047564326 },\n { x: -0.0000011479999999999363, y: -0.02678272920210347 },\n { x: -0.0000011469999999999362, y: 0.012685345922256688 },\n { x: -0.0000011459999999999362, y: -0.02428445810144817 },\n { x: -0.000001144999999999936, y: 0.02122352192123725 },\n { x: -0.000001143999999999936, y: 0.0017545082389184192 },\n { x: -0.000001142999999999936, y: -0.021247768259625866 },\n { x: -0.0000011419999999999359, y: 0.03736356225080036 },\n { x: -0.0000011409999999999358, y: 0.030465802167615554 },\n { x: -0.0000011399999999999357, y: -0.031203956066424173 },\n { x: -0.0000011389999999999356, y: 0.0038869599827814224 },\n { x: -0.0000011379999999999356, y: -0.03348223608578976 },\n { x: -0.0000011369999999999355, y: 0.021964493943004156 },\n { x: -0.0000011359999999999354, y: 0.012798542237557615 },\n { x: -0.0000011349999999999353, y: 0.018715784823801925 },\n { x: -0.0000011339999999999353, y: 0.02911308278467085 },\n { x: -0.0000011329999999999352, y: 0.0002547274517661491 },\n { x: -0.0000011319999999999351, y: -0.025504043656042204 },\n { x: -0.000001130999999999935, y: 0.020439604106804486 },\n { x: -0.000001129999999999935, y: 0.02636843840864873 },\n { x: -0.000001128999999999935, y: -0.026980297555334716 },\n { x: -0.0000011279999999999348, y: 0.008654209126966602 },\n { x: -0.0000011269999999999347, y: 0.031538000694273774 },\n { x: -0.0000011259999999999347, y: 0.00400299781692588 },\n { x: -0.0000011249999999999346, y: -0.008943049648801386 },\n { x: -0.0000011239999999999345, y: 0.019178196468100817 },\n { x: -0.0000011229999999999344, y: -0.005747326204190344 },\n { x: -0.0000011219999999999344, y: -0.010263411797626174 },\n { x: -0.0000011209999999999343, y: 0.02867837017720057 },\n { x: -0.0000011199999999999342, y: 0.0027619235635548737 },\n { x: -0.0000011189999999999341, y: -0.015116003010013963 },\n { x: -0.000001117999999999934, y: -0.00771187159990163 },\n { x: -0.000001116999999999934, y: 0.02309551474744334 },\n { x: -0.000001115999999999934, y: -0.0259479902773751 },\n { x: -0.0000011149999999999338, y: -0.004191424901319933 },\n { x: -0.0000011139999999999338, y: 0.027423036206542795 },\n { x: -0.0000011129999999999337, y: -0.024195477079481435 },\n { x: -0.0000011119999999999336, y: 0.022663346268164693 },\n { x: -0.0000011109999999999335, y: -0.031191669723367565 },\n { x: -0.0000011099999999999335, y: 0.0043902313725442945 },\n { x: -0.0000011089999999999334, y: 0.02454228906199415 },\n { x: -0.0000011079999999999333, y: 0.03594899636322201 },\n { x: -0.0000011069999999999332, y: -0.03334823887604813 },\n { x: -0.0000011059999999999332, y: -0.01192216245943053 },\n { x: -0.000001104999999999933, y: -0.024783298620515634 },\n { x: -0.000001103999999999933, y: -0.010266033052852314 },\n { x: -0.000001102999999999933, y: 0.023674140547620636 },\n { x: -0.0000011019999999999329, y: 0.01827937875802166 },\n { x: -0.0000011009999999999328, y: -0.026909958677049588 },\n { x: -0.0000010999999999999327, y: 0.035732974549398916 },\n { x: -0.0000010989999999999326, y: 0.0010450278744009746 },\n { x: -0.0000010979999999999326, y: 0.003638863189738167 },\n { x: -0.0000010969999999999325, y: 0.0027361635177537763 },\n { x: -0.0000010959999999999324, y: -0.027114865369770574 },\n { x: -0.0000010949999999999323, y: 0.02913405318551783 },\n { x: -0.0000010939999999999323, y: 0.007090545628145007 },\n { x: -0.0000010929999999999322, y: 0.027538877894034114 },\n { x: -0.0000010919999999999321, y: -0.01575434959194481 },\n { x: -0.000001090999999999932, y: 0.032863695659606305 },\n { x: -0.000001089999999999932, y: -0.020261719076848456 },\n { x: -0.0000010889999999999319, y: 0.008469352679284621 },\n { x: -0.0000010879999999999318, y: 0.010466286310564185 },\n { x: -0.0000010869999999999317, y: -0.03459042154622281 },\n { x: -0.0000010859999999999317, y: -0.002810323145193646 },\n { x: -0.0000010849999999999316, y: -0.029217576094209104 },\n { x: -0.0000010839999999999315, y: 0.021369005236969527 },\n { x: -0.0000010829999999999314, y: 0.020813655397698836 },\n { x: -0.0000010819999999999314, y: -0.016423285385148347 },\n { x: -0.0000010809999999999313, y: -0.03386282677843306 },\n { x: -0.0000010799999999999312, y: -0.025608240521285474 },\n { x: -0.0000010789999999999311, y: 0.021248693139306617 },\n { x: -0.000001077999999999931, y: 0.03587467773171921 },\n { x: -0.000001076999999999931, y: 0.021280586346494452 },\n { x: -0.000001075999999999931, y: 0.018332354420720676 },\n { x: -0.0000010749999999999308, y: 0.036953034432805454 },\n { x: -0.0000010739999999999308, y: -0.03175288541158352 },\n { x: -0.0000010729999999999307, y: -0.024115902675706843 },\n { x: -0.0000010719999999999306, y: 0.02241743611713118 },\n { x: -0.0000010709999999999305, y: 0.015558634002765784 },\n { x: -0.0000010699999999999305, y: 0.01939475490196981 },\n { x: -0.0000010689999999999304, y: 0.02754116596456491 },\n { x: -0.0000010679999999999303, y: 0.03254483574621475 },\n { x: -0.0000010669999999999302, y: 0.00893452209558641 },\n { x: -0.0000010659999999999302, y: 0.021550111633410727 },\n { x: -0.00000106499999999993, y: -0.031364612833633836 },\n { x: -0.00000106399999999993, y: 0.013283452263456794 },\n { x: -0.00000106299999999993, y: -0.00846544250977491 },\n { x: -0.0000010619999999999299, y: 0.0017269260942929937 },\n { x: -0.0000010609999999999298, y: -0.03240923250750345 },\n { x: -0.0000010599999999999297, y: 0.041192342820768335 },\n { x: -0.0000010589999999999296, y: -0.018813376825745184 },\n { x: -0.0000010579999999999296, y: 0.003531927496042505 },\n { x: -0.0000010569999999999295, y: -0.002288720072742805 },\n { x: -0.0000010559999999999294, y: -0.028137635527813357 },\n { x: -0.0000010549999999999293, y: -0.02881793611498535 },\n { x: -0.0000010539999999999293, y: 0.025259562537388088 },\n { x: -0.0000010529999999999292, y: -0.025572479807885126 },\n { x: -0.0000010519999999999291, y: -0.0014499665297990482 },\n { x: -0.000001050999999999929, y: -0.0115115976979226 },\n { x: -0.000001049999999999929, y: 0.006651690670723217 },\n { x: -0.0000010489999999999289, y: 0.03037450323603628 },\n { x: -0.0000010479999999999288, y: 0.024677442332279864 },\n { x: -0.0000010469999999999287, y: -0.009369965111682128 },\n { x: -0.0000010459999999999287, y: 0.004209415111918935 },\n { x: -0.0000010449999999999286, y: -0.025816695328456124 },\n { x: -0.0000010439999999999285, y: 0.008866012270379968 },\n { x: -0.0000010429999999999284, y: 0.02761903092956218 },\n { x: -0.0000010419999999999284, y: 0.013762888673287118 },\n { x: -0.0000010409999999999283, y: -0.015251553265029747 },\n { x: -0.0000010399999999999282, y: 0.019570828173988548 },\n { x: -0.0000010389999999999281, y: 0.061684518220025124 },\n { x: -0.000001037999999999928, y: -0.033167859404168776 },\n { x: -0.000001036999999999928, y: 0.004124457998327737 },\n { x: -0.000001035999999999928, y: 0.022013215600257412 },\n { x: -0.0000010349999999999278, y: 0.03402128738709914 },\n { x: -0.0000010339999999999278, y: 0.01046723658597477 },\n { x: -0.0000010329999999999277, y: 0.021283802624609043 },\n { x: -0.0000010319999999999276, y: 0.0016237554482543739 },\n { x: -0.0000010309999999999275, y: -0.034329811073198775 },\n { x: -0.0000010299999999999275, y: -0.034747120232068246 },\n { x: -0.0000010289999999999274, y: 0.03423877024130284 },\n { x: -0.0000010279999999999273, y: -0.026951904313977565 },\n { x: -0.0000010269999999999272, y: 0.0038978301759391727 },\n { x: -0.0000010259999999999272, y: -0.02396276827687291 },\n { x: -0.000001024999999999927, y: -0.025638382162598967 },\n { x: -0.000001023999999999927, y: 0.036710342459218066 },\n { x: -0.000001022999999999927, y: 0.009563173632159055 },\n { x: -0.0000010219999999999269, y: 0.010339560805856218 },\n { x: -0.0000010209999999999268, y: 0.031520575280031556 },\n { x: -0.0000010199999999999267, y: 0.03110916196871425 },\n { x: -0.0000010189999999999266, y: -0.037235307915742165 },\n { x: -0.0000010179999999999266, y: 0.00943802691845677 },\n { x: -0.0000010169999999999265, y: 0.007666987916140973 },\n { x: -0.0000010159999999999264, y: -0.0305969910471173 },\n { x: -0.0000010149999999999263, y: 0.012445863137599555 },\n { x: -0.0000010139999999999263, y: 0.005710821204960515 },\n { x: -0.0000010129999999999262, y: -0.02326312736145247 },\n { x: -0.000001011999999999926, y: 0.03382934309132999 },\n { x: -0.000001010999999999926, y: -0.028883360855502322 },\n { x: -0.000001009999999999926, y: -0.005793566845652853 },\n { x: -0.0000010089999999999259, y: -0.028267929755766138 },\n { x: -0.0000010079999999999258, y: -0.032621688283622705 },\n { x: -0.0000010069999999999257, y: 0.009374042237734392 },\n { x: -0.0000010059999999999257, y: 0.001868892436261659 },\n { x: -0.0000010049999999999256, y: -0.009269096605986411 },\n { x: -0.0000010039999999999255, y: -0.018993851685004056 },\n { x: -0.0000010029999999999254, y: -0.031847186921473786 },\n { x: -0.0000010019999999999254, y: -0.008046662113942058 },\n { x: -0.0000010009999999999253, y: -0.0023422432857707442 },\n { x: -9.999999999999252e-7, y: 0.010840177491379973 },\n { x: -9.989999999999251e-7, y: 0.01776890612243266 },\n { x: -9.97999999999925e-7, y: 0.01032583214398838 },\n { x: -9.96999999999925e-7, y: -0.01982299283221205 },\n { x: -9.95999999999925e-7, y: -0.019103894919064782 },\n { x: -9.949999999999248e-7, y: -0.0032049332452009963 },\n { x: -9.939999999999248e-7, y: 0.026076522829219777 },\n { x: -9.929999999999247e-7, y: 0.024496783405623928 },\n { x: -9.919999999999246e-7, y: 0.016499846534152162 },\n { x: -9.909999999999245e-7, y: 0.017914212922616624 },\n { x: -9.899999999999245e-7, y: -0.019726952265923206 },\n { x: -9.889999999999244e-7, y: 0.01626033562506649 },\n { x: -9.879999999999243e-7, y: -0.008220705259891027 },\n { x: -9.869999999999242e-7, y: -0.025279691047465153 },\n { x: -9.859999999999242e-7, y: -0.025676415690392144 },\n { x: -9.84999999999924e-7, y: -0.011696763660427259 },\n { x: -9.83999999999924e-7, y: -0.017438070915119865 },\n { x: -9.82999999999924e-7, y: 0.03720750652934234 },\n { x: -9.819999999999239e-7, y: -0.016835484579148588 },\n { x: -9.809999999999238e-7, y: 0.01815980303573615 },\n { x: -9.799999999999237e-7, y: 0.020463557693487008 },\n { x: -9.789999999999236e-7, y: -0.0011654171902938863 },\n { x: -9.779999999999236e-7, y: 0.00606826267542394 },\n { x: -9.769999999999235e-7, y: -0.034513818005990786 },\n { x: -9.759999999999234e-7, y: -0.01991109534464455 },\n { x: -9.749999999999233e-7, y: 0.034712304696758005 },\n { x: -9.739999999999233e-7, y: 0.007774178902658733 },\n { x: -9.729999999999232e-7, y: -0.011368318633134067 },\n { x: -9.71999999999923e-7, y: -0.006061573388917357 },\n { x: -9.70999999999923e-7, y: 0.018126978921157475 },\n { x: -9.69999999999923e-7, y: 0.02726576056209315 },\n { x: -9.689999999999229e-7, y: 0.0003232067519156386 },\n { x: -9.679999999999228e-7, y: 0.01608865369829126 },\n { x: -9.669999999999227e-7, y: 0.0014128747967245428 },\n { x: -9.659999999999226e-7, y: -0.011696456066122221 },\n { x: -9.649999999999226e-7, y: -0.021704958095040052 },\n { x: -9.639999999999225e-7, y: 0.030275711156899327 },\n { x: -9.629999999999224e-7, y: -0.02292842572541188 },\n { x: -9.619999999999223e-7, y: -0.02399627756791023 },\n { x: -9.609999999999223e-7, y: -0.012030959177578095 },\n { x: -9.599999999999222e-7, y: -0.024437055201715352 },\n { x: -9.589999999999221e-7, y: -0.03108969507226391 },\n { x: -9.57999999999922e-7, y: -0.017568398400468543 },\n { x: -9.56999999999922e-7, y: -0.01745744248197696 },\n { x: -9.55999999999922e-7, y: 0.004451029610863574 },\n { x: -9.549999999999218e-7, y: -0.016267207476140206 },\n { x: -9.539999999999217e-7, y: 0.00972251185358209 },\n { x: -9.529999999999218e-7, y: 0.03293065025421619 },\n { x: -9.519999999999218e-7, y: -0.02086997208853251 },\n { x: -9.509999999999218e-7, y: 0.004639619025641843 },\n { x: -9.499999999999219e-7, y: 0.015618224567289337 },\n { x: -9.489999999999219e-7, y: 0.007112025027805449 },\n { x: -9.479999999999219e-7, y: -0.022636518950092655 },\n { x: -9.46999999999922e-7, y: -0.000761372920605377 },\n { x: -9.45999999999922e-7, y: -0.030646906336262093 },\n { x: -9.44999999999922e-7, y: -0.027083786628553968 },\n { x: -9.439999999999221e-7, y: -0.023501480527126164 },\n { x: -9.429999999999221e-7, y: -0.006513222852341783 },\n { x: -9.419999999999221e-7, y: 0.010237058491952876 },\n { x: -9.409999999999221e-7, y: 0.01575903531229099 },\n { x: -9.399999999999222e-7, y: 0.031951775070964465 },\n { x: -9.389999999999222e-7, y: -0.016383227145744337 },\n { x: -9.379999999999222e-7, y: 0.018446823915629015 },\n { x: -9.369999999999223e-7, y: 0.018553872617230658 },\n { x: -9.359999999999223e-7, y: 0.0005302119633774194 },\n { x: -9.349999999999223e-7, y: 0.015342896360415465 },\n { x: -9.339999999999224e-7, y: -0.0013742958150124026 },\n { x: -9.329999999999224e-7, y: 0.024571183233800593 },\n { x: -9.319999999999224e-7, y: -0.02605755800136759 },\n { x: -9.309999999999225e-7, y: 0.022409530383174267 },\n { x: -9.299999999999225e-7, y: -0.012515358070418951 },\n { x: -9.289999999999225e-7, y: 0.021047540449883086 },\n { x: -9.279999999999225e-7, y: 0.02479222693293069 },\n { x: -9.269999999999226e-7, y: 0.03653090770216841 },\n { x: -9.259999999999226e-7, y: -0.017107653369539816 },\n { x: -9.249999999999226e-7, y: -0.011020852861469248 },\n { x: -9.239999999999227e-7, y: -0.025709429149308512 },\n { x: -9.229999999999227e-7, y: -0.015079420700132181 },\n { x: -9.219999999999227e-7, y: 0.03168000868920515 },\n { x: -9.209999999999228e-7, y: -0.00210274362938009 },\n { x: -9.199999999999228e-7, y: -0.025200653167084697 },\n { x: -9.189999999999228e-7, y: -0.01060610960450694 },\n { x: -9.179999999999229e-7, y: -0.02973874410019535 },\n { x: -9.169999999999229e-7, y: -0.030965299051822385 },\n { x: -9.159999999999229e-7, y: 0.0038148260825874476 },\n { x: -9.14999999999923e-7, y: -0.033241250227991105 },\n { x: -9.13999999999923e-7, y: 0.00604867636928691 },\n { x: -9.12999999999923e-7, y: -0.008588997593963985 },\n { x: -9.11999999999923e-7, y: 0.015923611463657814 },\n { x: -9.109999999999231e-7, y: -0.008414811523850744 },\n { x: -9.099999999999231e-7, y: -0.019673634057138158 },\n { x: -9.089999999999231e-7, y: -0.03753147139612505 },\n { x: -9.079999999999232e-7, y: 0.026749614364787684 },\n { x: -9.069999999999232e-7, y: 0.009179864277816011 },\n { x: -9.059999999999232e-7, y: 0.009232479754932152 },\n { x: -9.049999999999233e-7, y: -0.022850441249536425 },\n { x: -9.039999999999233e-7, y: 0.022761860920378196 },\n { x: -9.029999999999233e-7, y: 0.032577228843712 },\n { x: -9.019999999999233e-7, y: -0.009230010340456217 },\n { x: -9.009999999999234e-7, y: 0.014381541869451474 },\n { x: -8.999999999999234e-7, y: 0.007362602069615492 },\n { x: -8.989999999999234e-7, y: 0.019415573503208126 },\n { x: -8.979999999999235e-7, y: -0.038299510323579214 },\n { x: -8.969999999999235e-7, y: 0.0011299450978933597 },\n { x: -8.959999999999235e-7, y: -0.023952376639287416 },\n { x: -8.949999999999236e-7, y: -0.01610169256085411 },\n { x: -8.939999999999236e-7, y: 0.026222417450439836 },\n { x: -8.929999999999236e-7, y: -0.03190218689902641 },\n { x: -8.919999999999237e-7, y: -0.03432020352969162 },\n { x: -8.909999999999237e-7, y: 0.019366613973656507 },\n { x: -8.899999999999237e-7, y: -0.031391386639058196 },\n { x: -8.889999999999237e-7, y: 0.00837424583650163 },\n { x: -8.879999999999238e-7, y: 0.03186906605800279 },\n { x: -8.869999999999238e-7, y: -0.010212834431228921 },\n { x: -8.859999999999238e-7, y: 0.03704848495388489 },\n { x: -8.849999999999239e-7, y: -0.0115572101672419 },\n { x: -8.839999999999239e-7, y: 0.025468208071106894 },\n { x: -8.829999999999239e-7, y: -0.008762272659908157 },\n { x: -8.81999999999924e-7, y: 0.02277877149048695 },\n { x: -8.80999999999924e-7, y: 0.005213360801620121 },\n { x: -8.79999999999924e-7, y: 0.006916896105190616 },\n { x: -8.789999999999241e-7, y: 0.025234732726755055 },\n { x: -8.779999999999241e-7, y: -0.025004339226081897 },\n { x: -8.769999999999241e-7, y: -0.016738614383466303 },\n { x: -8.759999999999241e-7, y: 0.02612479041190105 },\n { x: -8.749999999999242e-7, y: 0.036423903004606774 },\n { x: -8.739999999999242e-7, y: -0.012611155929767593 },\n { x: -8.729999999999242e-7, y: 0.01401632460396602 },\n { x: -8.719999999999243e-7, y: 0.015372814707230552 },\n { x: -8.709999999999243e-7, y: 0.017538893864949563 },\n { x: -8.699999999999243e-7, y: 0.0008130989563025555 },\n { x: -8.689999999999244e-7, y: 0.025128427465391335 },\n { x: -8.679999999999244e-7, y: -0.004526735353483471 },\n { x: -8.669999999999244e-7, y: 0.01800688399974372 },\n { x: -8.659999999999245e-7, y: 0.007805066435189868 },\n { x: -8.649999999999245e-7, y: -0.014885647013308584 },\n { x: -8.639999999999245e-7, y: 0.002873344691174549 },\n { x: -8.629999999999245e-7, y: -0.03127102117251237 },\n { x: -8.619999999999246e-7, y: 0.0034664535817309017 },\n { x: -8.609999999999246e-7, y: -0.030146099359308627 },\n { x: -8.599999999999246e-7, y: 0.0004909610998169021 },\n { x: -8.589999999999247e-7, y: -0.029732361714219932 },\n { x: -8.579999999999247e-7, y: 0.056371423662391125 },\n { x: -8.569999999999247e-7, y: 0.019675474866204128 },\n { x: -8.559999999999248e-7, y: 0.0037055367390445154 },\n { x: -8.549999999999248e-7, y: 0.007958642944636343 },\n { x: -8.539999999999248e-7, y: 0.031170667440981757 },\n { x: -8.529999999999249e-7, y: 0.027922335680716087 },\n { x: -8.519999999999249e-7, y: -0.001310272524085223 },\n { x: -8.509999999999249e-7, y: 0.012618017037633572 },\n { x: -8.499999999999249e-7, y: 0.03093013741614123 },\n { x: -8.48999999999925e-7, y: 0.020968705025750354 },\n { x: -8.47999999999925e-7, y: 0.027369280124057586 },\n { x: -8.46999999999925e-7, y: -0.004806688605153115 },\n { x: -8.459999999999251e-7, y: -0.016249759172511084 },\n { x: -8.449999999999251e-7, y: -0.0006271442121735175 },\n { x: -8.439999999999251e-7, y: -0.019353815379646647 },\n { x: -8.429999999999252e-7, y: -0.017163157879402955 },\n { x: -8.419999999999252e-7, y: -0.03548059904646963 },\n { x: -8.409999999999252e-7, y: 0.02313611703472965 },\n { x: -8.399999999999253e-7, y: -0.014865699271734622 },\n { x: -8.389999999999253e-7, y: 0.01101855729171213 },\n { x: -8.379999999999253e-7, y: -0.005466523368602546 },\n { x: -8.369999999999253e-7, y: -0.03115650717574829 },\n { x: -8.359999999999254e-7, y: -0.01172148758910005 },\n { x: -8.349999999999254e-7, y: 0.027530258103700123 },\n { x: -8.339999999999254e-7, y: -0.013361953130406124 },\n { x: -8.329999999999255e-7, y: -0.02933385697333347 },\n { x: -8.319999999999255e-7, y: 0.02103474064153297 },\n { x: -8.309999999999255e-7, y: 0.02176334224505846 },\n { x: -8.299999999999256e-7, y: 0.018757817803187415 },\n { x: -8.289999999999256e-7, y: -0.03742232055682836 },\n { x: -8.279999999999256e-7, y: -0.013942852796325267 },\n { x: -8.269999999999257e-7, y: 0.0075531746020012416 },\n { x: -8.259999999999257e-7, y: -0.005235030960910617 },\n { x: -8.249999999999257e-7, y: -0.013455942474942653 },\n { x: -8.239999999999257e-7, y: -0.009079405981755651 },\n { x: -8.229999999999258e-7, y: 0.02687889796141142 },\n { x: -8.219999999999258e-7, y: -0.015451987514716829 },\n { x: -8.209999999999258e-7, y: 0.008853814081119179 },\n { x: -8.199999999999259e-7, y: -0.031614768404355904 },\n { x: -8.189999999999259e-7, y: -0.020684353901576812 },\n { x: -8.179999999999259e-7, y: -0.004349344659097599 },\n { x: -8.16999999999926e-7, y: -0.032351128450080244 },\n { x: -8.15999999999926e-7, y: 0.027413184736922346 },\n { x: -8.14999999999926e-7, y: -0.022718398124329027 },\n { x: -8.139999999999261e-7, y: -0.028341448868181796 },\n { x: -8.129999999999261e-7, y: 0.02876741543842008 },\n { x: -8.119999999999261e-7, y: -0.018289808674868468 },\n { x: -8.109999999999261e-7, y: -0.004398059592769029 },\n { x: -8.099999999999262e-7, y: -0.01074398307502024 },\n { x: -8.089999999999262e-7, y: -0.0020476478124832388 },\n { x: -8.079999999999262e-7, y: 0.025789086878987757 },\n { x: -8.069999999999263e-7, y: 0.024251322047085938 },\n { x: -8.059999999999263e-7, y: 0.03721585312378391 },\n { x: -8.049999999999263e-7, y: -0.03155777317318277 },\n { x: -8.039999999999264e-7, y: 0.01957189033880305 },\n { x: -8.029999999999264e-7, y: 0.03195250359530248 },\n { x: -8.019999999999264e-7, y: -0.012501327258465434 },\n { x: -8.009999999999265e-7, y: 0.016875009596899037 },\n { x: -7.999999999999265e-7, y: 0.011342440420052615 },\n { x: -7.989999999999265e-7, y: 0.008386090664766642 },\n { x: -7.979999999999265e-7, y: -0.024106276452187894 },\n { x: -7.969999999999266e-7, y: 0.012117934964467303 },\n { x: -7.959999999999266e-7, y: -0.0007889897266229575 },\n { x: -7.949999999999266e-7, y: 0.02466338985768519 },\n { x: -7.939999999999267e-7, y: 0.03741483224157911 },\n { x: -7.929999999999267e-7, y: -0.008963205404156115 },\n { x: -7.919999999999267e-7, y: 0.015379366724403962 },\n { x: -7.909999999999268e-7, y: 0.018422982108190922 },\n { x: -7.899999999999268e-7, y: 0.00010225846965020577 },\n { x: -7.889999999999268e-7, y: 0.026282972640043624 },\n { x: -7.879999999999269e-7, y: -0.021756984097635636 },\n { x: -7.869999999999269e-7, y: 0.00573016684523125 },\n { x: -7.859999999999269e-7, y: 0.02082208391069466 },\n { x: -7.849999999999269e-7, y: 0.002389662031938346 },\n { x: -7.83999999999927e-7, y: 0.02792645443235875 },\n { x: -7.82999999999927e-7, y: -0.02041865694859452 },\n { x: -7.81999999999927e-7, y: -0.01552050734037055 },\n { x: -7.809999999999271e-7, y: 0.023244930983702793 },\n { x: -7.799999999999271e-7, y: -0.022546177670539725 },\n { x: -7.789999999999271e-7, y: -0.03592121624714324 },\n { x: -7.779999999999272e-7, y: 0.013371666999888565 },\n { x: -7.769999999999272e-7, y: -0.012284709451055982 },\n { x: -7.759999999999272e-7, y: -0.01561671470706963 },\n { x: -7.749999999999273e-7, y: -0.018682672226740367 },\n { x: -7.739999999999273e-7, y: -0.01793498292829704 },\n { x: -7.729999999999273e-7, y: 0.006400554041425754 },\n { x: -7.719999999999273e-7, y: 0.01780707558471629 },\n { x: -7.709999999999274e-7, y: -0.01837198272349219 },\n { x: -7.699999999999274e-7, y: -0.034309745822137847 },\n { x: -7.689999999999274e-7, y: 0.020360037092311094 },\n { x: -7.679999999999275e-7, y: -0.007870483107975617 },\n { x: -7.669999999999275e-7, y: -0.021094785205537498 },\n { x: -7.659999999999275e-7, y: -0.00017115015938054512 },\n { x: -7.649999999999276e-7, y: 0.00720112255388403 },\n { x: -7.639999999999276e-7, y: 0.06171488126204357 },\n { x: -7.629999999999276e-7, y: 0.01897792763743236 },\n { x: -7.619999999999277e-7, y: -0.03500035295518957 },\n { x: -7.609999999999277e-7, y: 0.01792267857458254 },\n { x: -7.599999999999277e-7, y: -0.016264377661825903 },\n { x: -7.589999999999277e-7, y: -0.0021172887541361708 },\n { x: -7.579999999999278e-7, y: 0.028350062222667744 },\n { x: -7.569999999999278e-7, y: 0.00026353928096412764 },\n { x: -7.559999999999278e-7, y: 0.023161104680252013 },\n { x: -7.549999999999279e-7, y: -0.0147413738368382 },\n { x: -7.539999999999279e-7, y: 0.030660190800139427 },\n { x: -7.529999999999279e-7, y: 0.00831821668538952 },\n { x: -7.51999999999928e-7, y: 0.014295025150173776 },\n { x: -7.50999999999928e-7, y: 0.03738171839841807 },\n { x: -7.49999999999928e-7, y: -0.002281660602468275 },\n { x: -7.48999999999928e-7, y: 0.011471266269029789 },\n { x: -7.479999999999281e-7, y: 0.0216577255196688 },\n { x: -7.469999999999281e-7, y: 0.005750570569288274 },\n { x: -7.459999999999281e-7, y: -0.032587461927133576 },\n { x: -7.449999999999282e-7, y: -0.01681796218369945 },\n { x: -7.439999999999282e-7, y: 0.03304170188676783 },\n { x: -7.429999999999282e-7, y: -0.003692451658323054 },\n { x: -7.419999999999283e-7, y: -0.0030563850883970054 },\n { x: -7.409999999999283e-7, y: 0.0016895485700962553 },\n { x: -7.399999999999283e-7, y: -0.018213769450676563 },\n { x: -7.389999999999284e-7, y: 0.0251583969150544 },\n { x: -7.379999999999284e-7, y: 0.03721906823525033 },\n { x: -7.369999999999284e-7, y: 0.014332750958438532 },\n { x: -7.359999999999285e-7, y: 0.004018506071974108 },\n { x: -7.349999999999285e-7, y: -0.009328895241614005 },\n { x: -7.339999999999285e-7, y: -0.017935786289793258 },\n { x: -7.329999999999285e-7, y: 0.03735106821200738 },\n { x: -7.319999999999286e-7, y: -0.010786065959145113 },\n { x: -7.309999999999286e-7, y: -0.02883254651910972 },\n { x: -7.299999999999286e-7, y: 0.00428667254889503 },\n { x: -7.289999999999287e-7, y: -0.03773908537930853 },\n { x: -7.279999999999287e-7, y: -0.0002931725709218301 },\n { x: -7.269999999999287e-7, y: 0.036716197921170875 },\n { x: -7.259999999999288e-7, y: -0.026457202804986164 },\n { x: -7.249999999999288e-7, y: 0.02423487257642817 },\n { x: -7.239999999999288e-7, y: -0.02343398583763106 },\n { x: -7.229999999999289e-7, y: -0.013925319635537338 },\n { x: -7.219999999999289e-7, y: 0.03538221489266571 },\n { x: -7.209999999999289e-7, y: -0.0008697835998210185 },\n { x: -7.199999999999289e-7, y: -0.022260767783963985 },\n { x: -7.18999999999929e-7, y: 0.012419595388602241 },\n { x: -7.17999999999929e-7, y: -0.03196548593981394 },\n { x: -7.16999999999929e-7, y: 0.024714985836480807 },\n { x: -7.159999999999291e-7, y: -0.018956228122529246 },\n { x: -7.149999999999291e-7, y: -0.031300745054078455 },\n { x: -7.139999999999291e-7, y: -0.0348782747532691 },\n { x: -7.129999999999292e-7, y: -0.013674107136283187 },\n { x: -7.119999999999292e-7, y: 0.005432015098493471 },\n { x: -7.109999999999292e-7, y: -0.00887826641364437 },\n { x: -7.099999999999293e-7, y: 0.02747122902020626 },\n { x: -7.089999999999293e-7, y: 0.005285957009757245 },\n { x: -7.079999999999293e-7, y: -0.0304346099279643 },\n { x: -7.069999999999293e-7, y: -0.033989737617403454 },\n { x: -7.059999999999294e-7, y: 0.02928696213333436 },\n { x: -7.049999999999294e-7, y: 0.03092709313677574 },\n { x: -7.039999999999294e-7, y: 0.0220907100004837 },\n { x: -7.029999999999295e-7, y: 0.002097081022607098 },\n { x: -7.019999999999295e-7, y: 0.02927584963188477 },\n { x: -7.009999999999295e-7, y: -0.026563025053022403 },\n { x: -6.999999999999296e-7, y: 0.027955356506882835 },\n { x: -6.989999999999296e-7, y: 0.011717749159196785 },\n { x: -6.979999999999296e-7, y: -0.01844583797651137 },\n { x: -6.969999999999297e-7, y: -0.03279512571645914 },\n { x: -6.959999999999297e-7, y: 0.030106953551930746 },\n { x: -6.949999999999297e-7, y: -0.020434368749354236 },\n { x: -6.939999999999297e-7, y: 0.027718405028198636 },\n { x: -6.929999999999298e-7, y: -0.023812127065734236 },\n { x: -6.919999999999298e-7, y: -0.016961517011275684 },\n { x: -6.909999999999298e-7, y: 0.007860640128169193 },\n { x: -6.899999999999299e-7, y: 0.0072246231204643584 },\n { x: -6.889999999999299e-7, y: -0.026809990666068734 },\n { x: -6.879999999999299e-7, y: 0.019094685110403936 },\n { x: -6.8699999999993e-7, y: 0.01910260361407817 },\n { x: -6.8599999999993e-7, y: -0.021892264193136907 },\n { x: -6.8499999999993e-7, y: -0.0015051666720148052 },\n { x: -6.8399999999993e-7, y: 0.001677891907363871 },\n { x: -6.829999999999301e-7, y: 0.006121967768864928 },\n { x: -6.819999999999301e-7, y: -0.01641753794052324 },\n { x: -6.809999999999301e-7, y: -0.026200855304732047 },\n { x: -6.799999999999302e-7, y: 0.014921284988103039 },\n { x: -6.789999999999302e-7, y: -0.02802718187016387 },\n { x: -6.779999999999302e-7, y: 0.0270094861069588 },\n { x: -6.769999999999303e-7, y: -0.03280403880906488 },\n { x: -6.759999999999303e-7, y: -0.006654548789746699 },\n { x: -6.749999999999303e-7, y: 0.01059287602364014 },\n { x: -6.739999999999304e-7, y: 0.00459015733253834 },\n { x: -6.729999999999304e-7, y: 0.03210706378427855 },\n { x: -6.719999999999304e-7, y: -0.027332589509352783 },\n { x: -6.709999999999305e-7, y: -0.03638117773089946 },\n { x: -6.699999999999305e-7, y: -0.0313984494673226 },\n { x: -6.689999999999305e-7, y: 0.022509852690589686 },\n { x: -6.679999999999305e-7, y: -0.011222849987818764 },\n { x: -6.669999999999306e-7, y: 0.0354456902138389 },\n { x: -6.659999999999306e-7, y: -0.035355338381689735 },\n { x: -6.649999999999306e-7, y: -0.03273456372042448 },\n { x: -6.639999999999307e-7, y: 0.037632377993272195 },\n { x: -6.629999999999307e-7, y: -0.0032497165509312045 },\n { x: -6.619999999999307e-7, y: -0.00525812192844277 },\n { x: -6.609999999999308e-7, y: 0.026082411463927743 },\n { x: -6.599999999999308e-7, y: 0.0005371650287673598 },\n { x: -6.589999999999308e-7, y: -0.005402311725754774 },\n { x: -6.579999999999309e-7, y: 0.029669042177349808 },\n { x: -6.569999999999309e-7, y: -0.0165022373391947 },\n { x: -6.559999999999309e-7, y: 0.03393076455731495 },\n { x: -6.549999999999309e-7, y: 0.007333906715309948 },\n { x: -6.53999999999931e-7, y: -0.028745892897458113 },\n { x: -6.52999999999931e-7, y: 0.02323790254517157 },\n { x: -6.51999999999931e-7, y: 0.0023720779857305777 },\n { x: -6.509999999999311e-7, y: 0.013015333281979458 },\n { x: -6.499999999999311e-7, y: 0.026857012226457568 },\n { x: -6.489999999999311e-7, y: -0.01897999950646951 },\n { x: -6.479999999999312e-7, y: 0.027275525359059215 },\n { x: -6.469999999999312e-7, y: -0.006744561827243408 },\n { x: -6.459999999999312e-7, y: -0.02128910714976712 },\n { x: -6.449999999999312e-7, y: 0.036536987158046264 },\n { x: -6.439999999999313e-7, y: -0.03262356204871867 },\n { x: -6.429999999999313e-7, y: -0.02302919180005553 },\n { x: -6.419999999999313e-7, y: -0.02513408612064682 },\n { x: -6.409999999999314e-7, y: -0.03649315076213799 },\n { x: -6.399999999999314e-7, y: 0.004837253568413848 },\n { x: -6.389999999999314e-7, y: -0.01987630083704264 },\n { x: -6.379999999999315e-7, y: 0.0182994090764373 },\n { x: -6.369999999999315e-7, y: 0.0037682857458279867 },\n { x: -6.359999999999315e-7, y: -0.025857645157095616 },\n { x: -6.349999999999316e-7, y: -0.002547405148933613 },\n { x: -6.339999999999316e-7, y: 0.0012864483880417716 },\n { x: -6.329999999999316e-7, y: 0.01656586953278925 },\n { x: -6.319999999999316e-7, y: 0.005633296789070536 },\n { x: -6.309999999999317e-7, y: -0.02692909228518187 },\n { x: -6.299999999999317e-7, y: 0.033034091430707326 },\n { x: -6.289999999999317e-7, y: 0.000841324146058516 },\n { x: -6.279999999999318e-7, y: 0.02117952105833375 },\n { x: -6.269999999999318e-7, y: -0.021910890070447463 },\n { x: -6.259999999999318e-7, y: -0.0012603429754274448 },\n { x: -6.249999999999319e-7, y: -0.000029963623049062668 },\n { x: -6.239999999999319e-7, y: 0.011504326854161978 },\n { x: -6.229999999999319e-7, y: 0.013443213956065443 },\n { x: -6.21999999999932e-7, y: 0.03423905325494616 },\n { x: -6.20999999999932e-7, y: -0.0012014379203648814 },\n { x: -6.19999999999932e-7, y: -0.03681681489040827 },\n { x: -6.18999999999932e-7, y: -0.011696922483330499 },\n { x: -6.179999999999321e-7, y: 0.004064106555042659 },\n { x: -6.169999999999321e-7, y: 0.026522292233923304 },\n { x: -6.159999999999321e-7, y: 0.026303978180255268 },\n { x: -6.149999999999322e-7, y: -0.012059156570144934 },\n { x: -6.139999999999322e-7, y: 0.021788653083909853 },\n { x: -6.129999999999322e-7, y: -0.022208000100723588 },\n { x: -6.119999999999323e-7, y: 0.013426097878221969 },\n { x: -6.109999999999323e-7, y: -0.019190120926348413 },\n { x: -6.099999999999323e-7, y: 0.029542252697688398 },\n { x: -6.089999999999324e-7, y: -0.021229043465104694 },\n { x: -6.079999999999324e-7, y: -0.02678096061500068 },\n { x: -6.069999999999324e-7, y: 0.018500261386440443 },\n { x: -6.059999999999324e-7, y: -0.03259508777224578 },\n { x: -6.049999999999325e-7, y: 0.021742044288600153 },\n { x: -6.039999999999325e-7, y: 0.02200122800120708 },\n { x: -6.029999999999325e-7, y: -0.00714686327800051 },\n { x: -6.019999999999326e-7, y: -0.01693199206884209 },\n { x: -6.009999999999326e-7, y: -0.024062566092241555 },\n { x: -5.999999999999326e-7, y: -0.0012649725384623466 },\n { x: -5.989999999999327e-7, y: 0.006787035066740783 },\n { x: -5.979999999999327e-7, y: -0.028662918760442524 },\n { x: -5.969999999999327e-7, y: 0.03292025923605793 },\n { x: -5.959999999999328e-7, y: -0.028248750005335662 },\n { x: -5.949999999999328e-7, y: 0.005911788375894198 },\n { x: -5.939999999999328e-7, y: 0.013617901199125624 },\n { x: -5.929999999999328e-7, y: -0.009851667093976588 },\n { x: -5.919999999999329e-7, y: 0.006991583991121393 },\n { x: -5.909999999999329e-7, y: 0.037391102216933494 },\n { x: -5.899999999999329e-7, y: -0.00425707469207949 },\n { x: -5.88999999999933e-7, y: -0.016339341319091674 },\n { x: -5.87999999999933e-7, y: 0.038167253730834946 },\n { x: -5.86999999999933e-7, y: 0.020894697876456935 },\n { x: -5.859999999999331e-7, y: -0.01918880894873754 },\n { x: -5.849999999999331e-7, y: -0.023041720730246493 },\n { x: -5.839999999999331e-7, y: -0.030218680197106256 },\n { x: -5.829999999999332e-7, y: 0.027228109860258032 },\n { x: -5.819999999999332e-7, y: -0.02895668994770278 },\n { x: -5.809999999999332e-7, y: -0.020615890258674288 },\n { x: -5.799999999999332e-7, y: -0.03677379199836666 },\n { x: -5.789999999999333e-7, y: 0.03065222249411227 },\n { x: -5.779999999999333e-7, y: -0.02692351686015201 },\n { x: -5.769999999999333e-7, y: -0.03347121552609948 },\n { x: -5.759999999999334e-7, y: -0.018436815949925033 },\n { x: -5.749999999999334e-7, y: -0.020711923304145244 },\n { x: -5.739999999999334e-7, y: 0.015515264813902845 },\n { x: -5.729999999999335e-7, y: 0.020797217592234296 },\n { x: -5.719999999999335e-7, y: 0.03688947463017097 },\n { x: -5.709999999999335e-7, y: 0.004346529244960781 },\n { x: -5.699999999999336e-7, y: -0.02980132424030097 },\n { x: -5.689999999999336e-7, y: -0.0208207401988313 },\n { x: -5.679999999999336e-7, y: -0.0153339790885583 },\n { x: -5.669999999999336e-7, y: 0.037197042598921974 },\n { x: -5.659999999999337e-7, y: -0.020771203342421902 },\n { x: -5.649999999999337e-7, y: 0.038048546092983825 },\n { x: -5.639999999999337e-7, y: 0.021681075659839816 },\n { x: -5.629999999999338e-7, y: 0.038013314656745845 },\n { x: -5.619999999999338e-7, y: 0.007790282935868771 },\n { x: -5.609999999999338e-7, y: 0.0319063573956932 },\n { x: -5.599999999999339e-7, y: 0.010494676054734347 },\n { x: -5.589999999999339e-7, y: -0.03301383949974486 },\n { x: -5.579999999999339e-7, y: -0.003371837164825826 },\n { x: -5.56999999999934e-7, y: 0.037796564074388445 },\n { x: -5.55999999999934e-7, y: -0.0068843456160199165 },\n { x: -5.54999999999934e-7, y: -0.0016397799921726867 },\n { x: -5.53999999999934e-7, y: -0.027033925958003562 },\n { x: -5.529999999999341e-7, y: 0.030837625712965895 },\n { x: -5.519999999999341e-7, y: 0.02402482696409352 },\n { x: -5.509999999999341e-7, y: 0.005365150378940554 },\n { x: -5.499999999999342e-7, y: -0.002699016971069865 },\n { x: -5.489999999999342e-7, y: -0.01689677285149041 },\n { x: -5.479999999999342e-7, y: 0.034945223123161194 },\n { x: -5.469999999999343e-7, y: -0.02477631221755628 },\n { x: -5.459999999999343e-7, y: 0.002752120716507772 },\n { x: -5.449999999999343e-7, y: -0.01280693354681033 },\n { x: -5.439999999999344e-7, y: -0.018987931888737316 },\n { x: -5.429999999999344e-7, y: 0.03623666664093101 },\n { x: -5.419999999999344e-7, y: -0.02048956128127825 },\n { x: -5.409999999999344e-7, y: -0.013620046993659209 },\n { x: -5.399999999999345e-7, y: 0.0323835954094382 },\n { x: -5.389999999999345e-7, y: -0.009018041646379121 },\n { x: -5.379999999999345e-7, y: -0.010114627595053187 },\n { x: -5.369999999999346e-7, y: -0.038318943615224664 },\n { x: -5.359999999999346e-7, y: 0.015759376601194613 },\n { x: -5.349999999999346e-7, y: -0.0215600233422073 },\n { x: -5.339999999999347e-7, y: -0.015502455862315223 },\n { x: -5.329999999999347e-7, y: -0.01637689200293658 },\n { x: -5.319999999999347e-7, y: 0.037296678672567016 },\n { x: -5.309999999999348e-7, y: 0.00016984160083190658 },\n { x: -5.299999999999348e-7, y: 0.020208980877136348 },\n { x: -5.289999999999348e-7, y: 0.02106492574351752 },\n { x: -5.279999999999348e-7, y: 0.010140411074034801 },\n { x: -5.269999999999349e-7, y: 0.012030641892448275 },\n { x: -5.259999999999349e-7, y: -0.0160382673405169 },\n { x: -5.249999999999349e-7, y: -0.008389576091561253 },\n { x: -5.23999999999935e-7, y: -0.024672980475083036 },\n { x: -5.22999999999935e-7, y: 0.019835518594130918 },\n { x: -5.21999999999935e-7, y: 0.01894037634659523 },\n { x: -5.209999999999351e-7, y: -0.0037410433972414328 },\n { x: -5.199999999999351e-7, y: 0.030193826581296927 },\n { x: -5.189999999999351e-7, y: -0.030511069499683647 },\n { x: -5.179999999999352e-7, y: 0.004402151027481887 },\n { x: -5.169999999999352e-7, y: 0.013669149116530884 },\n { x: -5.159999999999352e-7, y: -0.008998797248273235 },\n { x: -5.149999999999352e-7, y: -0.0075357382227624415 },\n { x: -5.139999999999353e-7, y: 0.027307552666633022 },\n { x: -5.129999999999353e-7, y: -0.008714039875602212 },\n { x: -5.119999999999353e-7, y: -0.010654556595364151 },\n { x: -5.109999999999354e-7, y: -0.014094754058061374 },\n { x: -5.099999999999354e-7, y: -0.005923052582552714 },\n { x: -5.089999999999354e-7, y: 0.037126934365119164 },\n { x: -5.079999999999355e-7, y: 0.024855077671973914 },\n { x: -5.069999999999355e-7, y: -0.00899826193442723 },\n { x: -5.059999999999355e-7, y: -0.020175311969571518 },\n { x: -5.049999999999356e-7, y: -0.009670224239580071 },\n { x: -5.039999999999356e-7, y: -0.02449927600855842 },\n { x: -5.029999999999356e-7, y: 0.016877202567956405 },\n { x: -5.019999999999356e-7, y: 0.024015249183921394 },\n { x: -5.009999999999357e-7, y: 0.016692677709990222 },\n { x: -4.999999999999357e-7, y: -0.03061607807128818 },\n { x: -4.989999999999357e-7, y: 0.0328830465502613 },\n { x: -4.979999999999358e-7, y: -0.02536460955878092 },\n { x: -4.969999999999358e-7, y: -0.00701673329043003 },\n { x: -4.959999999999358e-7, y: -0.00009851986595585799 },\n { x: -4.949999999999359e-7, y: 0.00045193160896987353 },\n { x: -4.939999999999359e-7, y: -0.02821931782806969 },\n { x: -4.929999999999359e-7, y: -0.008911267882016611 },\n { x: -4.91999999999936e-7, y: 0.025025915132938267 },\n { x: -4.90999999999936e-7, y: 0.008696595962662378 },\n { x: -4.89999999999936e-7, y: -0.03148170988750545 },\n { x: -4.88999999999936e-7, y: 0.02601655824539923 },\n { x: -4.879999999999361e-7, y: 0.03716094133856492 },\n { x: -4.869999999999361e-7, y: -0.026329335413725733 },\n { x: -4.859999999999361e-7, y: -0.019010987890180363 },\n { x: -4.849999999999362e-7, y: -0.03696500330457485 },\n { x: -4.839999999999362e-7, y: 0.03722147274506833 },\n { x: -4.829999999999362e-7, y: -0.005944847278957255 },\n { x: -4.819999999999363e-7, y: 0.02273284393958523 },\n { x: -4.809999999999363e-7, y: -0.026743775014016584 },\n { x: -4.799999999999363e-7, y: 0.003374896427794901 },\n { x: -4.789999999999364e-7, y: -0.021645314139998945 },\n { x: -4.779999999999364e-7, y: -0.03740958138926493 },\n { x: -4.769999999999364e-7, y: 0.009461506309069632 },\n { x: -4.759999999999364e-7, y: 0.0013674561444570773 },\n { x: -4.7499999999993637e-7, y: 0.016354953110585334 },\n { x: -4.7399999999993635e-7, y: -0.02324457265267391 },\n { x: -4.7299999999993633e-7, y: -0.01673664805640501 },\n { x: -4.719999999999363e-7, y: -0.00015193183769306276 },\n { x: -4.709999999999363e-7, y: 0.0008039217090670105 },\n { x: -4.6999999999993626e-7, y: 0.01597715371487733 },\n { x: -4.6899999999993624e-7, y: 0.0019769652104212818 },\n { x: -4.679999999999362e-7, y: -0.032851011423476704 },\n { x: -4.669999999999362e-7, y: 0.06932641920808683 },\n { x: -4.6599999999993617e-7, y: 0.02656540293626496 },\n { x: -4.6499999999993615e-7, y: 0.007897039000335783 },\n { x: -4.6399999999993613e-7, y: -0.027103847662122805 },\n { x: -4.629999999999361e-7, y: 0.029694558179882837 },\n { x: -4.619999999999361e-7, y: 0.0018248423122610568 },\n { x: -4.6099999999993606e-7, y: 0.009758548707735707 },\n { x: -4.5999999999993604e-7, y: -0.009428239581410956 },\n { x: -4.58999999999936e-7, y: -0.0356313429142074 },\n { x: -4.57999999999936e-7, y: 0.03593672717025784 },\n { x: -4.5699999999993597e-7, y: 0.018531571981076727 },\n { x: -4.5599999999993595e-7, y: 0.016552444396710556 },\n { x: -4.5499999999993593e-7, y: -0.002337247496148302 },\n { x: -4.539999999999359e-7, y: 0.0007785083458110871 },\n { x: -4.529999999999359e-7, y: -0.02905886063018612 },\n { x: -4.5199999999993586e-7, y: 0.036852363387532006 },\n { x: -4.5099999999993584e-7, y: 0.0022927258407498263 },\n { x: -4.499999999999358e-7, y: 0.032606694860042994 },\n { x: -4.489999999999358e-7, y: -0.034456756692891444 },\n { x: -4.4799999999993577e-7, y: -0.01984547778443541 },\n { x: -4.4699999999993575e-7, y: 0.013405428432036856 },\n { x: -4.4599999999993573e-7, y: 0.026208836494072685 },\n { x: -4.449999999999357e-7, y: 0.014176530718128064 },\n { x: -4.439999999999357e-7, y: -0.03456288120110022 },\n { x: -4.4299999999993566e-7, y: 0.016830473615826024 },\n { x: -4.4199999999993564e-7, y: 0.023872773074407688 },\n { x: -4.409999999999356e-7, y: 0.027047005024774126 },\n { x: -4.399999999999356e-7, y: -0.01678895619778788 },\n { x: -4.3899999999993557e-7, y: -0.005711371228984338 },\n { x: -4.3799999999993555e-7, y: 0.03022710868431257 },\n { x: -4.3699999999993553e-7, y: 0.02409226383776998 },\n { x: -4.359999999999355e-7, y: 0.016454030380970534 },\n { x: -4.349999999999355e-7, y: -0.016608148401473802 },\n { x: -4.3399999999993546e-7, y: 0.004617163937858662 },\n { x: -4.3299999999993544e-7, y: 0.03498457738044681 },\n { x: -4.319999999999354e-7, y: 0.006581533175657876 },\n { x: -4.309999999999354e-7, y: 0.01352623392192395 },\n { x: -4.2999999999993537e-7, y: 0.030714274070325457 },\n { x: -4.2899999999993535e-7, y: 0.036538763878164994 },\n { x: -4.2799999999993533e-7, y: 0.03769958720522041 },\n { x: -4.269999999999353e-7, y: -0.0024929375955899074 },\n { x: -4.259999999999353e-7, y: -0.024323310595140344 },\n { x: -4.2499999999993526e-7, y: 0.013076787058204128 },\n { x: -4.2399999999993524e-7, y: -0.013467613220872292 },\n { x: -4.229999999999352e-7, y: -0.027774140084367967 },\n { x: -4.219999999999352e-7, y: 0.004517907339911999 },\n { x: -4.2099999999993517e-7, y: 0.03749945939631262 },\n { x: -4.1999999999993515e-7, y: 0.004443943512421321 },\n { x: -4.1899999999993513e-7, y: 0.004115654475036444 },\n { x: -4.179999999999351e-7, y: -0.014654039306239115 },\n { x: -4.169999999999351e-7, y: 0.038109915541014415 },\n { x: -4.1599999999993506e-7, y: 0.03746261698864426 },\n { x: -4.1499999999993504e-7, y: -0.0008754086945264309 },\n { x: -4.13999999999935e-7, y: -0.028624933767044402 },\n { x: -4.12999999999935e-7, y: -0.016959004475366465 },\n { x: -4.11999999999935e-7, y: 0.0012284875710190423 },\n { x: -4.1099999999993495e-7, y: -0.008583333568278161 },\n { x: -4.0999999999993493e-7, y: 0.029831692307815773 },\n { x: -4.089999999999349e-7, y: -0.00960009174369107 },\n { x: -4.079999999999349e-7, y: -0.023298294635352924 },\n { x: -4.0699999999993486e-7, y: 0.014722499395278248 },\n { x: -4.0599999999993484e-7, y: -0.009409509873052066 },\n { x: -4.049999999999348e-7, y: -0.01877895297827343 },\n { x: -4.039999999999348e-7, y: 0.035607385872300674 },\n { x: -4.029999999999348e-7, y: 0.027544753079410875 },\n { x: -4.0199999999993475e-7, y: -0.02656906620890856 },\n { x: -4.0099999999993473e-7, y: 0.015627276790128958 },\n { x: -3.999999999999347e-7, y: 0.02218681102676791 },\n { x: -3.989999999999347e-7, y: -0.005376876812212225 },\n { x: -3.9799999999993466e-7, y: -0.007886995843671056 },\n { x: -3.9699999999993464e-7, y: 0.02142751399413668 },\n { x: -3.959999999999346e-7, y: -0.016887140215574064 },\n { x: -3.949999999999346e-7, y: 0.03624855923128197 },\n { x: -3.939999999999346e-7, y: 0.008104464425445997 },\n { x: -3.9299999999993455e-7, y: -0.0032750014970892396 },\n { x: -3.9199999999993453e-7, y: -0.030805592590375037 },\n { x: -3.909999999999345e-7, y: -0.014122601108262673 },\n { x: -3.899999999999345e-7, y: 0.021798765767953858 },\n { x: -3.8899999999993446e-7, y: 0.03829533478050582 },\n { x: -3.8799999999993444e-7, y: 0.02837964532950979 },\n { x: -3.869999999999344e-7, y: -0.027123323515050545 },\n { x: -3.859999999999344e-7, y: -0.019015802863131825 },\n { x: -3.849999999999344e-7, y: -0.033897898380783 },\n { x: -3.8399999999993435e-7, y: -0.02608445807495351 },\n { x: -3.8299999999993433e-7, y: -0.02037540262438684 },\n { x: -3.819999999999343e-7, y: 0.0131079444841664 },\n { x: -3.809999999999343e-7, y: 0.011345953738193281 },\n { x: -3.7999999999993426e-7, y: 0.023746785693104424 },\n { x: -3.7899999999993424e-7, y: -0.0012674335369404627 },\n { x: -3.779999999999342e-7, y: -0.016961371118575243 },\n { x: -3.769999999999342e-7, y: -0.01947993499109862 },\n { x: -3.759999999999342e-7, y: 0.029100593786119774 },\n { x: -3.7499999999993415e-7, y: 0.005747579368175604 },\n { x: -3.7399999999993413e-7, y: -0.023783933782955895 },\n { x: -3.729999999999341e-7, y: -0.016567949412315493 },\n { x: -3.719999999999341e-7, y: 0.00915024742486819 },\n { x: -3.7099999999993406e-7, y: 0.029849594553970314 },\n { x: -3.6999999999993404e-7, y: 0.0045325909916444935 },\n { x: -3.68999999999934e-7, y: -0.0015042669569214448 },\n { x: -3.67999999999934e-7, y: -0.025004458755548447 },\n { x: -3.66999999999934e-7, y: -0.010508426559348936 },\n { x: -3.6599999999993395e-7, y: -0.02697610737889414 },\n { x: -3.6499999999993393e-7, y: -0.011352360485399827 },\n { x: -3.639999999999339e-7, y: -0.038020789012463425 },\n { x: -3.629999999999339e-7, y: -0.0205532335505078 },\n { x: -3.6199999999993386e-7, y: 0.012163200088658266 },\n { x: -3.6099999999993384e-7, y: 0.015273909929938252 },\n { x: -3.599999999999338e-7, y: -0.02235492756287762 },\n { x: -3.589999999999338e-7, y: -0.01866605465802742 },\n { x: -3.579999999999338e-7, y: 0.0014292383924288492 },\n { x: -3.5699999999993375e-7, y: 0.035948995274460625 },\n { x: -3.5599999999993373e-7, y: -0.03370134007133872 },\n { x: -3.549999999999337e-7, y: 0.03023431426334664 },\n { x: -3.539999999999337e-7, y: -0.034331327176150415 },\n { x: -3.5299999999993366e-7, y: -0.03444831481803883 },\n { x: -3.5199999999993364e-7, y: 0.01063462228947142 },\n { x: -3.509999999999336e-7, y: -0.01489766898439868 },\n { x: -3.499999999999336e-7, y: 0.03586754690355203 },\n { x: -3.489999999999336e-7, y: 0.016184357479110553 },\n { x: -3.4799999999993355e-7, y: 0.010408493799289202 },\n { x: -3.4699999999993353e-7, y: 0.016522189266849552 },\n { x: -3.459999999999335e-7, y: -0.023448213183515292 },\n { x: -3.449999999999335e-7, y: 0.0033972943416049907 },\n { x: -3.4399999999993346e-7, y: -0.01972712801423758 },\n { x: -3.4299999999993344e-7, y: -0.016491964007021458 },\n { x: -3.419999999999334e-7, y: -0.007382138015212052 },\n { x: -3.409999999999334e-7, y: -0.035121234567728046 },\n { x: -3.399999999999334e-7, y: 0.03821428153002842 },\n { x: -3.3899999999993335e-7, y: -0.011472240052964676 },\n { x: -3.3799999999993333e-7, y: 0.0183845167764827 },\n { x: -3.369999999999333e-7, y: 0.005725350498037771 },\n { x: -3.359999999999333e-7, y: -0.03470912388654533 },\n { x: -3.3499999999993327e-7, y: -0.00705656191395721 },\n { x: -3.3399999999993324e-7, y: 0.027291201799425978 },\n { x: -3.329999999999332e-7, y: -0.021202866600286814 },\n { x: -3.319999999999332e-7, y: -0.011889542799743299 },\n { x: -3.309999999999332e-7, y: 0.02741262776875824 },\n { x: -3.2999999999993315e-7, y: 0.03524542654188016 },\n { x: -3.2899999999993313e-7, y: -0.029743333395877255 },\n { x: -3.279999999999331e-7, y: -0.03545871693571225 },\n { x: -3.269999999999331e-7, y: 0.037481238634134634 },\n { x: -3.2599999999993307e-7, y: 0.000868038712042484 },\n { x: -3.2499999999993304e-7, y: 0.008138191252355896 },\n { x: -3.23999999999933e-7, y: 0.03028047238881504 },\n { x: -3.22999999999933e-7, y: -0.00847797058562639 },\n { x: -3.21999999999933e-7, y: 0.03775654659760015 },\n { x: -3.2099999999993295e-7, y: -0.013823588073563604 },\n { x: -3.1999999999993293e-7, y: -0.02254704395135032 },\n { x: -3.189999999999329e-7, y: 0.009525372189035595 },\n { x: -3.179999999999329e-7, y: 0.0023775445960528977 },\n { x: -3.1699999999993287e-7, y: 0.027114001841603126 },\n { x: -3.1599999999993284e-7, y: 0.0020019980896420577 },\n { x: -3.149999999999328e-7, y: -0.037692027283707186 },\n { x: -3.139999999999328e-7, y: 0.024365911638839388 },\n { x: -3.129999999999328e-7, y: 0.038036834457867735 },\n { x: -3.1199999999993275e-7, y: 0.026564484320203263 },\n { x: -3.1099999999993273e-7, y: -0.03696169754571912 },\n { x: -3.099999999999327e-7, y: -0.01995828013795558 },\n { x: -3.089999999999327e-7, y: 0.02367356023645286 },\n { x: -3.0799999999993267e-7, y: 0.01140525596555517 },\n { x: -3.0699999999993264e-7, y: 0.0078097665333482 },\n { x: -3.059999999999326e-7, y: -0.0014158938452822933 },\n { x: -3.049999999999326e-7, y: 0.02426850402271181 },\n { x: -3.039999999999326e-7, y: -0.02325227193707388 },\n { x: -3.0299999999993256e-7, y: -0.00566885280125813 },\n { x: -3.0199999999993253e-7, y: -0.03729116676410857 },\n { x: -3.009999999999325e-7, y: 0.015028079439946739 },\n { x: -2.999999999999325e-7, y: 0.009513073411901551 },\n { x: -2.9899999999993247e-7, y: 0.005344653905798962 },\n { x: -2.9799999999993244e-7, y: -0.025153867654681333 },\n { x: -2.969999999999324e-7, y: -0.010104536826985427 },\n { x: -2.959999999999324e-7, y: 0.011694700030693398 },\n { x: -2.949999999999324e-7, y: 0.030316109820884007 },\n { x: -2.9399999999993236e-7, y: -0.018684330958494467 },\n { x: -2.9299999999993233e-7, y: 0.0032932605733379744 },\n { x: -2.919999999999323e-7, y: -0.008830329488269032 },\n { x: -2.909999999999323e-7, y: 0.0028543933230057213 },\n { x: -2.8999999999993227e-7, y: -0.011823972351564719 },\n { x: -2.8899999999993224e-7, y: 0.0292281096060689 },\n { x: -2.879999999999322e-7, y: -0.033097365562273745 },\n { x: -2.869999999999322e-7, y: 0.013075176774745338 },\n { x: -2.859999999999322e-7, y: 0.01916467486574591 },\n { x: -2.8499999999993216e-7, y: -0.0030577751660357017 },\n { x: -2.8399999999993213e-7, y: 0.0024698753505127766 },\n { x: -2.829999999999321e-7, y: 0.006726865754168589 },\n { x: -2.819999999999321e-7, y: -0.03352103444506385 },\n { x: -2.8099999999993207e-7, y: -0.0006328725955294857 },\n { x: -2.7999999999993204e-7, y: -0.022072865557930022 },\n { x: -2.78999999999932e-7, y: -0.015087482287251614 },\n { x: -2.77999999999932e-7, y: 0.021930827610196182 },\n { x: -2.76999999999932e-7, y: 0.036114252942463614 },\n { x: -2.7599999999993196e-7, y: 0.013480463361941978 },\n { x: -2.7499999999993193e-7, y: 0.036119136218706195 },\n { x: -2.739999999999319e-7, y: -0.03737441500639726 },\n { x: -2.729999999999319e-7, y: -0.020643728344049487 },\n { x: -2.7199999999993187e-7, y: -0.011789293940388348 },\n { x: -2.7099999999993184e-7, y: -0.008195787899156506 },\n { x: -2.699999999999318e-7, y: 0.03285209369418967 },\n { x: -2.689999999999318e-7, y: 0.0317778992871913 },\n { x: -2.679999999999318e-7, y: -0.006464683270472996 },\n { x: -2.6699999999993176e-7, y: 0.01824154316645744 },\n { x: -2.6599999999993173e-7, y: -0.015422912801715951 },\n { x: -2.649999999999317e-7, y: -0.025806199554868035 },\n { x: -2.639999999999317e-7, y: 0.035238314439241906 },\n { x: -2.6299999999993167e-7, y: -0.01958904955047636 },\n { x: -2.6199999999993165e-7, y: 0.016304345038460073 },\n { x: -2.609999999999316e-7, y: -0.016831681665570593 },\n { x: -2.599999999999316e-7, y: -0.0006191874808557794 },\n { x: -2.589999999999316e-7, y: -0.036482341947945425 },\n { x: -2.5799999999993156e-7, y: 0.011924383438017048 },\n { x: -2.5699999999993153e-7, y: 0.0034860023883373473 },\n { x: -2.559999999999315e-7, y: 0.01625724854429595 },\n { x: -2.549999999999315e-7, y: -0.0045323255757287965 },\n { x: -2.5399999999993147e-7, y: -0.017418846636385606 },\n { x: -2.5299999999993145e-7, y: -0.008758278674948437 },\n { x: -2.519999999999314e-7, y: 0.028420364197662754 },\n { x: -2.509999999999314e-7, y: 0.006157549009896937 },\n { x: -2.499999999999314e-7, y: 0.03405373137579483 },\n { x: -2.4899999999993136e-7, y: -0.0066285083976237716 },\n { x: -2.4799999999993133e-7, y: 0.011483246916349134 },\n { x: -2.469999999999313e-7, y: -0.001205122467282206 },\n { x: -2.459999999999313e-7, y: 0.03370991547225574 },\n { x: -2.4499999999993127e-7, y: 0.010582462966692649 },\n { x: -2.4399999999993125e-7, y: 0.024981266958621934 },\n { x: -2.429999999999312e-7, y: 0.03202715319183665 },\n { x: -2.419999999999312e-7, y: 0.02166321966569135 },\n { x: -2.409999999999312e-7, y: 0.031510064756146046 },\n { x: -2.3999999999993116e-7, y: -0.02391154825710596 },\n { x: -2.3899999999993113e-7, y: -0.02561748337235069 },\n { x: -2.3799999999993114e-7, y: 0.014928391463372132 },\n { x: -2.3699999999993114e-7, y: 0.023968334923967858 },\n { x: -2.3599999999993115e-7, y: -0.03454698509176921 },\n { x: -2.3499999999993115e-7, y: -0.023742378008478487 },\n { x: -2.3399999999993116e-7, y: 0.034357258293760226 },\n { x: -2.3299999999993116e-7, y: 0.03374519470424609 },\n { x: -2.3199999999993116e-7, y: -0.006905003053431417 },\n { x: -2.3099999999993117e-7, y: 0.024423612260077332 },\n { x: -2.2999999999993117e-7, y: -0.025970144401944215 },\n { x: -2.2899999999993118e-7, y: -0.01585621414527635 },\n { x: -2.2799999999993118e-7, y: 0.03509216437727518 },\n { x: -2.2699999999993119e-7, y: 0.03712317356062595 },\n { x: -2.259999999999312e-7, y: -0.009358822552676121 },\n { x: -2.249999999999312e-7, y: 0.010032357882639687 },\n { x: -2.239999999999312e-7, y: -0.013969217201878607 },\n { x: -2.229999999999312e-7, y: -0.015918118855267355 },\n { x: -2.219999999999312e-7, y: -0.028274321387790412 },\n { x: -2.209999999999312e-7, y: -0.008679952774400862 },\n { x: -2.1999999999993122e-7, y: -0.02564963975030458 },\n { x: -2.1899999999993122e-7, y: 0.017650334243266022 },\n { x: -2.1799999999993122e-7, y: 0.03530758531792346 },\n { x: -2.1699999999993123e-7, y: -0.035911236547750434 },\n { x: -2.1599999999993123e-7, y: 0.0013507887723224893 },\n { x: -2.1499999999993124e-7, y: -0.015565648369075752 },\n { x: -2.1399999999993124e-7, y: -0.016685393487460874 },\n { x: -2.1299999999993125e-7, y: 0.015871369742837826 },\n { x: -2.1199999999993125e-7, y: 0.006046204205466943 },\n { x: -2.1099999999993125e-7, y: -0.0030431216017367565 },\n { x: -2.0999999999993126e-7, y: -0.01044507942983039 },\n { x: -2.0899999999993126e-7, y: 0.03573833959618011 },\n { x: -2.0799999999993127e-7, y: -0.008992997756426781 },\n { x: -2.0699999999993127e-7, y: 0.03696604719411287 },\n { x: -2.0599999999993128e-7, y: -0.015073568321485027 },\n { x: -2.0499999999993128e-7, y: -0.010086736856374245 },\n { x: -2.0399999999993128e-7, y: 0.01410181977929076 },\n { x: -2.029999999999313e-7, y: -0.0058330353626653095 },\n { x: -2.019999999999313e-7, y: 0.015457357583510503 },\n { x: -2.009999999999313e-7, y: -0.017534530556566702 },\n { x: -1.999999999999313e-7, y: -0.035601992619162304 },\n { x: -1.989999999999313e-7, y: 0.007904988832166492 },\n { x: -1.979999999999313e-7, y: 0.02569858165953012 },\n { x: -1.9699999999993131e-7, y: -0.01268522374900902 },\n { x: -1.9599999999993132e-7, y: -0.018121155957264667 },\n { x: -1.9499999999993132e-7, y: 0.02061041143055766 },\n { x: -1.9399999999993133e-7, y: -0.008840215099175694 },\n { x: -1.9299999999993133e-7, y: -0.03652112925199514 },\n { x: -1.9199999999993134e-7, y: 0.008174779623938448 },\n { x: -1.9099999999993134e-7, y: 0.03529952154612975 },\n { x: -1.8999999999993134e-7, y: 0.030368375593192113 },\n { x: -1.8899999999993135e-7, y: -0.02123428780928653 },\n { x: -1.8799999999993135e-7, y: -0.003718508242115864 },\n { x: -1.8699999999993136e-7, y: -0.03468025752054715 },\n { x: -1.8599999999993136e-7, y: 0.026036616409071837 },\n { x: -1.8499999999993137e-7, y: 0.0016423104189708143 },\n { x: -1.8399999999993137e-7, y: 0.03171428469100279 },\n { x: -1.8299999999993137e-7, y: -0.016478522450779937 },\n { x: -1.8199999999993138e-7, y: -0.05789074385915425 },\n { x: -1.8099999999993138e-7, y: -0.0013360377763962552 },\n { x: -1.799999999999314e-7, y: 0.028311933648685825 },\n { x: -1.789999999999314e-7, y: -0.0058701852382468155 },\n { x: -1.779999999999314e-7, y: -0.029190174689918993 },\n { x: -1.769999999999314e-7, y: 0.023188948448225954 },\n { x: -1.759999999999314e-7, y: 0.021815855809314097 },\n { x: -1.749999999999314e-7, y: -0.018607974271348544 },\n { x: -1.739999999999314e-7, y: 0.02214004297327952 },\n { x: -1.7299999999993142e-7, y: -0.023827175966968095 },\n { x: -1.7199999999993142e-7, y: 0.03094264608713723 },\n { x: -1.7099999999993143e-7, y: -0.026174971744903165 },\n { x: -1.6999999999993143e-7, y: -0.025051348319339358 },\n { x: -1.6899999999993143e-7, y: -0.004768120114201645 },\n { x: -1.6799999999993144e-7, y: 0.014081549002571461 },\n { x: -1.6699999999993144e-7, y: 0.03180882132651888 },\n { x: -1.6599999999993145e-7, y: 0.002173689560844717 },\n { x: -1.6499999999993145e-7, y: -0.018737405976084285 },\n { x: -1.6399999999993146e-7, y: -0.014585301650330921 },\n { x: -1.6299999999993146e-7, y: 0.015602049999032364 },\n { x: -1.6199999999993146e-7, y: -0.005610621161915424 },\n { x: -1.6099999999993147e-7, y: 0.02108857916150817 },\n { x: -1.5999999999993147e-7, y: 0.033522554651299344 },\n { x: -1.5899999999993148e-7, y: -0.010920379919065323 },\n { x: -1.5799999999993148e-7, y: 0.033474036356441875 },\n { x: -1.5699999999993149e-7, y: 0.01717633656792932 },\n { x: -1.559999999999315e-7, y: 0.022830139011231158 },\n { x: -1.549999999999315e-7, y: -0.017148088912630352 },\n { x: -1.539999999999315e-7, y: 0.03829531639159738 },\n { x: -1.529999999999315e-7, y: 0.02810785137351485 },\n { x: -1.519999999999315e-7, y: -0.025030886157620027 },\n { x: -1.509999999999315e-7, y: -0.0213331455598955 },\n { x: -1.4999999999993152e-7, y: -0.020643267095945356 },\n { x: -1.4899999999993152e-7, y: -0.003781962323834834 },\n { x: -1.4799999999993152e-7, y: -0.026162796302254283 },\n { x: -1.4699999999993153e-7, y: 0.019724970582389686 },\n { x: -1.4599999999993153e-7, y: -0.0329234572410268 },\n { x: -1.4499999999993154e-7, y: 0.03775546980293661 },\n { x: -1.4399999999993154e-7, y: 0.021949333584469356 },\n { x: -1.4299999999993155e-7, y: 0.009438960886899462 },\n { x: -1.4199999999993155e-7, y: 0.03057407723189284 },\n { x: -1.4099999999993155e-7, y: -0.02842148326974319 },\n { x: -1.3999999999993156e-7, y: -0.007090221090106025 },\n { x: -1.3899999999993156e-7, y: 0.025399609643791343 },\n { x: -1.3799999999993157e-7, y: -0.0006261656652823926 },\n { x: -1.3699999999993157e-7, y: -0.007803680692520011 },\n { x: -1.3599999999993158e-7, y: -0.04110827863463731 },\n { x: -1.3499999999993158e-7, y: -0.011652926734824228 },\n { x: -1.3399999999993158e-7, y: 0.023820436088801238 },\n { x: -1.329999999999316e-7, y: 0.02747139092627198 },\n { x: -1.319999999999316e-7, y: -0.011828710152233303 },\n { x: -1.309999999999316e-7, y: 0.005724307255565378 },\n { x: -1.299999999999316e-7, y: 0.02862619109093727 },\n { x: -1.289999999999316e-7, y: -0.01763804545071117 },\n { x: -1.279999999999316e-7, y: -0.019805710036850794 },\n { x: -1.2699999999993161e-7, y: -0.01812581522641391 },\n { x: -1.2599999999993162e-7, y: -0.021096575063561857 },\n { x: -1.2499999999993162e-7, y: -0.027593275461981093 },\n { x: -1.2399999999993163e-7, y: -0.033034066193210705 },\n { x: -1.2299999999993163e-7, y: -0.012518718767353441 },\n { x: -1.2199999999993164e-7, y: 0.011012397330959425 },\n { x: -1.2099999999993164e-7, y: 0.011997956155848555 },\n { x: -1.1999999999993164e-7, y: -0.030361769753763264 },\n { x: -1.1899999999993165e-7, y: 0.021154731927001322 },\n { x: -1.1799999999993165e-7, y: -0.033016626390005445 },\n { x: -1.1699999999993166e-7, y: 0.007023761187189891 },\n { x: -1.1599999999993166e-7, y: -0.015657603659062783 },\n { x: -1.1499999999993167e-7, y: -0.037535162530381194 },\n { x: -1.1399999999993167e-7, y: 0.005816603778038893 },\n { x: -1.1299999999993167e-7, y: -0.0318834856995062 },\n { x: -1.1199999999993168e-7, y: 0.004925105638142008 },\n { x: -1.1099999999993168e-7, y: 0.02074974287381789 },\n { x: -1.0999999999993169e-7, y: -0.016944896010134457 },\n { x: -1.0899999999993169e-7, y: -0.008617973767884124 },\n { x: -1.079999999999317e-7, y: -0.018525156681826603 },\n { x: -1.069999999999317e-7, y: 0.007908411955996222 },\n { x: -1.059999999999317e-7, y: 0.03729322793984474 },\n { x: -1.0499999999993171e-7, y: -0.01346242076499064 },\n { x: -1.0399999999993171e-7, y: 0.006947684777811931 },\n { x: -1.0299999999993172e-7, y: 0.008749554301109953 },\n { x: -1.0199999999993172e-7, y: 0.017559706810042038 },\n { x: -1.0099999999993173e-7, y: 0.013201622720842262 },\n { x: -9.999999999993173e-8, y: 0.007939822487957665 },\n { x: -9.899999999993173e-8, y: 0.020645714036264678 },\n { x: -9.799999999993174e-8, y: 0.030429070581637557 },\n { x: -9.699999999993174e-8, y: 0.03376194431178459 },\n { x: -9.599999999993175e-8, y: 0.0232257086733735 },\n { x: -9.499999999993175e-8, y: -0.03139777375041945 },\n { x: -9.399999999993176e-8, y: 0.02033376722589085 },\n { x: -9.299999999993176e-8, y: -0.012684972635188892 },\n { x: -9.199999999993176e-8, y: -0.03588213688497629 },\n { x: -9.099999999993177e-8, y: -0.012792930557675138 },\n { x: -8.999999999993177e-8, y: 0.015615604456984228 },\n { x: -8.899999999993178e-8, y: 0.0015307169341800284 },\n { x: -8.799999999993178e-8, y: -0.02452090851465648 },\n { x: -8.699999999993179e-8, y: -0.03773641795367768 },\n { x: -8.599999999993179e-8, y: 0.009388755814108864 },\n { x: -8.49999999999318e-8, y: 0.0016201154022474277 },\n { x: -8.39999999999318e-8, y: 0.010165783731247937 },\n { x: -8.29999999999318e-8, y: -0.028809041808999857 },\n { x: -8.199999999993181e-8, y: -0.003391666369490668 },\n { x: -8.099999999993181e-8, y: 0.02016547688372482 },\n { x: -7.999999999993182e-8, y: 0.002560789204738185 },\n { x: -7.899999999993182e-8, y: 0.022667494756726025 },\n { x: -7.799999999993182e-8, y: -0.01729434894963864 },\n { x: -7.699999999993183e-8, y: 0.028777562098739305 },\n { x: -7.599999999993183e-8, y: 0.020257948289324333 },\n { x: -7.499999999993184e-8, y: -0.018642515354927593 },\n { x: -7.399999999993184e-8, y: -0.03126405831135507 },\n { x: -7.299999999993185e-8, y: -0.026329298740948335 },\n { x: -7.199999999993185e-8, y: 0.03460164939196195 },\n { x: -7.099999999993185e-8, y: 0.02878533358994842 },\n { x: -6.999999999993186e-8, y: 0.014592186664435796 },\n { x: -6.899999999993186e-8, y: -0.0013858611920607236 },\n { x: -6.799999999993187e-8, y: -0.020120241255477653 },\n { x: -6.699999999993187e-8, y: -0.01003516551571638 },\n { x: -6.599999999993188e-8, y: -0.009058619050661975 },\n { x: -6.499999999993188e-8, y: -0.004035245246231536 },\n { x: -6.399999999993188e-8, y: -0.014408928178812366 },\n { x: -6.299999999993189e-8, y: -0.03560678758186685 },\n { x: -6.199999999993189e-8, y: 0.02067392336292016 },\n { x: -6.09999999999319e-8, y: 0.037428992761616674 },\n { x: -5.99999999999319e-8, y: 0.007892352658770075 },\n { x: -5.89999999999319e-8, y: 0.02480034325562441 },\n { x: -5.7999999999931896e-8, y: -0.02561903890440075 },\n { x: -5.6999999999931894e-8, y: 0.007284029639539098 },\n { x: -5.599999999993189e-8, y: -0.006864914235189989 },\n { x: -5.499999999993189e-8, y: -0.017201528539497104 },\n { x: -5.399999999993189e-8, y: -0.03524246528429231 },\n { x: -5.2999999999931885e-8, y: 0.009212736585220583 },\n { x: -5.199999999993188e-8, y: 0.009936157695429387 },\n { x: -5.099999999993188e-8, y: -0.007880647660088674 },\n { x: -4.999999999993188e-8, y: -0.025925770229924334 },\n { x: -4.8999999999931875e-8, y: -0.016957676607607546 },\n { x: -4.799999999993187e-8, y: 0.010393739727449123 },\n { x: -4.699999999993187e-8, y: 0.01956307915249106 },\n { x: -4.599999999993187e-8, y: -0.04220906710971705 },\n { x: -4.4999999999931866e-8, y: -0.027667116945156348 },\n { x: -4.3999999999931864e-8, y: 0.014351862013379695 },\n { x: -4.299999999993186e-8, y: -0.01688050788669551 },\n { x: -4.199999999993186e-8, y: -0.021630213879493904 },\n { x: -4.099999999993186e-8, y: -0.03200662645269142 },\n { x: -3.9999999999931854e-8, y: 0.023918160189289488 },\n { x: -3.899999999993185e-8, y: 0.005884799273377132 },\n { x: -3.799999999993185e-8, y: 0.016028694625617252 },\n { x: -3.699999999993185e-8, y: 0.0074307327352187745 },\n { x: -3.5999999999931845e-8, y: 0.03290753689617773 },\n { x: -3.499999999993184e-8, y: -0.03783530876787333 },\n { x: -3.399999999993184e-8, y: -0.006709617522464693 },\n { x: -3.299999999993184e-8, y: -0.022905817596163565 },\n { x: -3.1999999999931836e-8, y: 0.0017145074007711698 },\n { x: -3.0999999999931833e-8, y: 0.012569166818043574 },\n { x: -2.999999999993183e-8, y: -0.03705526937061218 },\n { x: -2.8999999999931832e-8, y: -0.02869520746628896 },\n { x: -2.7999999999931833e-8, y: 0.025051957716505462 },\n { x: -2.6999999999931834e-8, y: 0.03271439109663386 },\n { x: -2.5999999999931835e-8, y: -0.008136759742715093 },\n { x: -2.4999999999931836e-8, y: -0.029999686307618574 },\n { x: -2.3999999999931837e-8, y: -0.009457858210204485 },\n { x: -2.2999999999931838e-8, y: -0.0235020022911492 },\n { x: -2.199999999993184e-8, y: 0.03545363699212244 },\n { x: -2.099999999993184e-8, y: -0.006624506349505804 },\n { x: -1.999999999993184e-8, y: 0.01972195983930522 },\n { x: -1.8999999999931842e-8, y: -0.018019588446823876 },\n { x: -1.7999999999931843e-8, y: 0.0279022326001525 },\n { x: -1.6999999999931844e-8, y: -0.037293869406612314 },\n { x: -1.5999999999931845e-8, y: 0.009912776034081342 },\n { x: -1.4999999999931846e-8, y: 0.03815086120980311 },\n { x: -1.3999999999931845e-8, y: 0.008300979552872052 },\n { x: -1.2999999999931844e-8, y: -0.006407387111170447 },\n { x: -1.1999999999931844e-8, y: -0.017236049532798867 },\n { x: -1.0999999999931843e-8, y: 0.004689459841539606 },\n { x: -9.999999999931842e-9, y: -0.00749374198766731 },\n { x: -8.999999999931841e-9, y: 0.02315467385521088 },\n { x: -7.99999999993184e-9, y: 0.017589298190448827 },\n { x: -6.999999999931841e-9, y: 0.03694156690958018 },\n { x: -5.999999999931841e-9, y: -0.00829628567179409 },\n { x: -4.999999999931841e-9, y: 0.020706206748506047 },\n { x: -3.999999999931841e-9, y: 0.010400605441179715 },\n { x: -2.9999999999318415e-9, y: 0.03244565863444435 },\n { x: -1.9999999999318417e-9, y: 0.0012047810277106509 },\n { x: -9.999999999318416e-10, y: -0.009529131808379759 },\n { x: 6.815844170345065e-20, y: 0.01733527160847571 },\n { x: 1.0000000000681585e-9, y: 0.04559779598351585 },\n { x: 2.0000000000681586e-9, y: 0.07160349371878574 },\n { x: 3.0000000000681584e-9, y: 0.08783108046973723 },\n { x: 4.000000000068158e-9, y: 0.12773950891731287 },\n { x: 5.000000000068158e-9, y: 0.10750473966362442 },\n { x: 6.000000000068158e-9, y: 0.1722172973853457 },\n { x: 7.000000000068158e-9, y: 0.2135957587464344 },\n { x: 8.000000000068159e-9, y: 0.2103006601275897 },\n { x: 9.00000000006816e-9, y: 0.24630267195398617 },\n { x: 1.000000000006816e-8, y: 0.25065479028254706 },\n { x: 1.100000000006816e-8, y: 0.32035371641487903 },\n { x: 1.2000000000068161e-8, y: 0.3144781070037487 },\n { x: 1.3000000000068162e-8, y: 0.36139572474206805 },\n { x: 1.4000000000068163e-8, y: 0.3579372088176165 },\n { x: 1.500000000006816e-8, y: 0.45230220028344786 },\n { x: 1.600000000006816e-8, y: 0.43409103373716157 },\n { x: 1.700000000006816e-8, y: 0.4693962636422275 },\n { x: 1.800000000006816e-8, y: 0.5051756485755463 },\n { x: 1.9000000000068158e-8, y: 0.5015876821813501 },\n { x: 2.0000000000068157e-8, y: 0.5773399887160102 },\n { x: 2.1000000000068156e-8, y: 0.5505828032595532 },\n { x: 2.2000000000068155e-8, y: 0.6178273493035895 },\n { x: 2.3000000000068154e-8, y: 0.6063375438950314 },\n { x: 2.4000000000068153e-8, y: 0.6836732895519223 },\n { x: 2.5000000000068152e-8, y: 0.71682672975598 },\n { x: 2.600000000006815e-8, y: 0.7418943000641285 },\n { x: 2.700000000006815e-8, y: 0.766764121927301 },\n { x: 2.800000000006815e-8, y: 0.748865600751028 },\n { x: 2.9000000000068148e-8, y: 0.8251459140947702 },\n { x: 3.000000000006815e-8, y: 0.8514758165924826 },\n { x: 3.100000000006815e-8, y: 0.8187773980832613 },\n { x: 3.2000000000068155e-8, y: 0.8678758840682784 },\n { x: 3.300000000006816e-8, y: 0.8833530966585573 },\n { x: 3.400000000006816e-8, y: 0.9132849864999247 },\n { x: 3.500000000006816e-8, y: 0.937231636904131 },\n { x: 3.6000000000068164e-8, y: 0.9819798072620206 },\n { x: 3.700000000006817e-8, y: 0.9816061146525373 },\n { x: 3.800000000006817e-8, y: 1.02431354480628 },\n { x: 3.900000000006817e-8, y: 1.1044911279668201 },\n { x: 4.0000000000068174e-8, y: 1.0902850601756604 },\n { x: 4.1000000000068176e-8, y: 1.1188857310355398 },\n { x: 4.200000000006818e-8, y: 1.1415582396103667 },\n { x: 4.300000000006818e-8, y: 1.1379388093453044 },\n { x: 4.400000000006818e-8, y: 1.1837722641169446 },\n { x: 4.5000000000068185e-8, y: 1.2283087278238718 },\n { x: 4.600000000006819e-8, y: 1.26508414596951 },\n { x: 4.700000000006819e-8, y: 1.295395440120118 },\n { x: 4.800000000006819e-8, y: 1.2696579825237537 },\n { x: 4.9000000000068195e-8, y: 1.3015144149145235 },\n { x: 5.00000000000682e-8, y: 1.3560999715462076 },\n { x: 5.10000000000682e-8, y: 1.364164677490993 },\n { x: 5.20000000000682e-8, y: 1.3696749179165426 },\n { x: 5.3000000000068204e-8, y: 1.4089949774653385 },\n { x: 5.4000000000068206e-8, y: 1.4440924489317122 },\n { x: 5.500000000006821e-8, y: 1.4584075769806717 },\n { x: 5.600000000006821e-8, y: 1.4930348030829683 },\n { x: 5.7000000000068213e-8, y: 1.4985596149910585 },\n { x: 5.8000000000068216e-8, y: 1.591644532032781 },\n { x: 5.900000000006822e-8, y: 1.6160661196984427 },\n { x: 6.000000000006822e-8, y: 1.6106429345108517 },\n { x: 6.100000000006822e-8, y: 1.6637378369996971 },\n { x: 6.200000000006821e-8, y: 1.6672039097753912 },\n { x: 6.300000000006821e-8, y: 1.6470164020386875 },\n { x: 6.40000000000682e-8, y: 1.72132886315127 },\n { x: 6.50000000000682e-8, y: 1.7175402711043017 },\n { x: 6.60000000000682e-8, y: 1.7396728078334815 },\n { x: 6.700000000006819e-8, y: 1.7672959364169838 },\n { x: 6.800000000006819e-8, y: 1.7713485346857474 },\n { x: 6.900000000006818e-8, y: 1.8057475417541893 },\n { x: 7.000000000006818e-8, y: 1.829469247402354 },\n { x: 7.100000000006817e-8, y: 1.8948911634912913 },\n { x: 7.200000000006817e-8, y: 1.8758493486494703 },\n { x: 7.300000000006816e-8, y: 1.9107897405746515 },\n { x: 7.400000000006816e-8, y: 1.950558126840004 },\n { x: 7.500000000006816e-8, y: 1.9775282740936975 },\n { x: 7.600000000006815e-8, y: 1.977213291981942 },\n { x: 7.700000000006815e-8, y: 2.023886490405293 },\n { x: 7.800000000006814e-8, y: 2.02239293082928 },\n { x: 7.900000000006814e-8, y: 2.0568489989045116 },\n { x: 8.000000000006813e-8, y: 2.0594832900906193 },\n { x: 8.100000000006813e-8, y: 2.12995351765209 },\n { x: 8.200000000006813e-8, y: 2.110904136924468 },\n { x: 8.300000000006812e-8, y: 2.1435001039992634 },\n { x: 8.400000000006812e-8, y: 2.1778976676693125 },\n { x: 8.500000000006811e-8, y: 2.185303937256203 },\n { x: 8.600000000006811e-8, y: 2.242847130351982 },\n { x: 8.70000000000681e-8, y: 2.268605430543055 },\n { x: 8.80000000000681e-8, y: 2.2643002847738183 },\n { x: 8.90000000000681e-8, y: 2.3221929151728995 },\n { x: 9.000000000006809e-8, y: 2.2995425440227586 },\n { x: 9.100000000006809e-8, y: 2.32819446156372 },\n { x: 9.200000000006808e-8, y: 2.3452879585157373 },\n { x: 9.300000000006808e-8, y: 2.3610164356770995 },\n { x: 9.400000000006807e-8, y: 2.413197406158945 },\n { x: 9.500000000006807e-8, y: 2.393253590720542 },\n { x: 9.600000000006807e-8, y: 2.447849826529251 },\n { x: 9.700000000006806e-8, y: 2.4767496840634893 },\n { x: 9.800000000006806e-8, y: 2.4742261324523263 },\n { x: 9.900000000006805e-8, y: 2.536938591755043 },\n { x: 1.0000000000006805e-7, y: 2.5200833348640637 },\n { x: 1.0100000000006804e-7, y: 2.5770250763161555 },\n { x: 1.0200000000006804e-7, y: 2.584950731375103 },\n { x: 1.0300000000006804e-7, y: 2.5838073872358875 },\n { x: 1.0400000000006803e-7, y: 2.631667929575248 },\n { x: 1.0500000000006803e-7, y: 2.6596649401494776 },\n { x: 1.0600000000006802e-7, y: 2.6329103424297156 },\n { x: 1.0700000000006802e-7, y: 2.7037087518923246 },\n { x: 1.0800000000006802e-7, y: 2.6670775070358506 },\n { x: 1.0900000000006801e-7, y: 2.6978313303605006 },\n { x: 1.10000000000068e-7, y: 2.755059710709874 },\n { x: 1.11000000000068e-7, y: 2.749202262835823 },\n { x: 1.12000000000068e-7, y: 2.79299475047997 },\n { x: 1.13000000000068e-7, y: 2.810230530294098 },\n { x: 1.1400000000006799e-7, y: 2.78880922503226 },\n { x: 1.1500000000006799e-7, y: 2.869807109944928 },\n { x: 1.1600000000006798e-7, y: 2.8777572803802594 },\n { x: 1.1700000000006798e-7, y: 2.8815018452559027 },\n { x: 1.1800000000006797e-7, y: 2.8755325151686555 },\n { x: 1.1900000000006797e-7, y: 2.905830323739118 },\n { x: 1.2000000000006796e-7, y: 2.9464738357158993 },\n { x: 1.2100000000006796e-7, y: 2.991581446645457 },\n { x: 1.2200000000006796e-7, y: 2.997052562083296 },\n { x: 1.2300000000006795e-7, y: 2.990961315281238 },\n { x: 1.2400000000006795e-7, y: 2.9845821077934853 },\n { x: 1.2500000000006794e-7, y: 3.013058560956058 },\n { x: 1.2600000000006794e-7, y: 3.0622430283652866 },\n { x: 1.2700000000006793e-7, y: 3.087426605521453 },\n { x: 1.2800000000006793e-7, y: 3.1095111383396206 },\n { x: 1.2900000000006793e-7, y: 3.084199975107459 },\n { x: 1.3000000000006792e-7, y: 3.127488116008965 },\n { x: 1.3100000000006792e-7, y: 3.150094382413969 },\n { x: 1.320000000000679e-7, y: 3.200017873088237 },\n { x: 1.330000000000679e-7, y: 3.2002378626863903 },\n { x: 1.340000000000679e-7, y: 3.221058355750686 },\n { x: 1.350000000000679e-7, y: 3.227614462711025 },\n { x: 1.360000000000679e-7, y: 3.2076376102360236 },\n { x: 1.370000000000679e-7, y: 3.269517899136106 },\n { x: 1.3800000000006789e-7, y: 3.277164485394785 },\n { x: 1.3900000000006788e-7, y: 3.32826518878089 },\n { x: 1.4000000000006788e-7, y: 3.3361230887439772 },\n { x: 1.4100000000006787e-7, y: 3.313932217343184 },\n { x: 1.4200000000006787e-7, y: 3.3379642854568816 },\n { x: 1.4300000000006787e-7, y: 3.3498041292968948 },\n { x: 1.4400000000006786e-7, y: 3.357219369672882 },\n { x: 1.4500000000006786e-7, y: 3.366706851551192 },\n { x: 1.4600000000006785e-7, y: 3.4199459421136247 },\n { x: 1.4700000000006785e-7, y: 3.416238405816887 },\n { x: 1.4800000000006784e-7, y: 3.407013009385149 },\n { x: 1.4900000000006784e-7, y: 3.4838754265193366 },\n { x: 1.5000000000006784e-7, y: 3.462493910181964 },\n { x: 1.5100000000006783e-7, y: 3.483945611319306 },\n { x: 1.5200000000006783e-7, y: 3.499965621261913 },\n { x: 1.5300000000006782e-7, y: 3.4942477146424538 },\n { x: 1.5400000000006782e-7, y: 3.564038317450229 },\n { x: 1.5500000000006781e-7, y: 3.527672795149435 },\n { x: 1.560000000000678e-7, y: 3.555876692335328 },\n { x: 1.570000000000678e-7, y: 3.6155525405815965 },\n { x: 1.580000000000678e-7, y: 3.601332369892053 },\n { x: 1.590000000000678e-7, y: 3.609442316303733 },\n { x: 1.600000000000678e-7, y: 3.6623500322214233 },\n { x: 1.610000000000678e-7, y: 3.684711964642669 },\n { x: 1.6200000000006778e-7, y: 3.6576976052199712 },\n { x: 1.6300000000006778e-7, y: 3.701532475303213 },\n { x: 1.6400000000006778e-7, y: 3.7109676530026414 },\n { x: 1.6500000000006777e-7, y: 3.725759508917418 },\n { x: 1.6600000000006777e-7, y: 3.7382593186558357 },\n { x: 1.6700000000006776e-7, y: 3.748891416720497 },\n { x: 1.6800000000006776e-7, y: 3.7423834296591307 },\n { x: 1.6900000000006775e-7, y: 3.784364177583826 },\n { x: 1.7000000000006775e-7, y: 3.7616413400291258 },\n { x: 1.7100000000006775e-7, y: 3.793011270865848 },\n { x: 1.7200000000006774e-7, y: 3.838271565864922 },\n { x: 1.7300000000006774e-7, y: 3.851660110036995 },\n { x: 1.7400000000006773e-7, y: 3.815896300368144 },\n { x: 1.7500000000006773e-7, y: 3.8712332263154465 },\n { x: 1.7600000000006772e-7, y: 3.8486642851532094 },\n { x: 1.7700000000006772e-7, y: 3.8622944630539453 },\n { x: 1.7800000000006772e-7, y: 3.9097680939520854 },\n { x: 1.790000000000677e-7, y: 3.9220439981314525 },\n { x: 1.800000000000677e-7, y: 3.945422097301458 },\n { x: 1.810000000000677e-7, y: 3.933796332138385 },\n { x: 1.820000000000677e-7, y: 3.970555841381823 },\n { x: 1.830000000000677e-7, y: 3.977434457774043 },\n { x: 1.840000000000677e-7, y: 3.9658959198982853 },\n { x: 1.8500000000006769e-7, y: 3.960452556347271 },\n { x: 1.8600000000006768e-7, y: 3.9984282659377 },\n { x: 1.8700000000006768e-7, y: 3.98660350661974 },\n { x: 1.8800000000006767e-7, y: 3.990519773055625 },\n { x: 1.8900000000006767e-7, y: 4.052249465615307 },\n { x: 1.9000000000006766e-7, y: 4.059364855404962 },\n { x: 1.9100000000006766e-7, y: 4.043962297468011 },\n { x: 1.9200000000006766e-7, y: 4.049092079453735 },\n { x: 1.9300000000006765e-7, y: 4.055881644700879 },\n { x: 1.9400000000006765e-7, y: 4.072328771627681 },\n { x: 1.9500000000006764e-7, y: 4.080507278351291 },\n { x: 1.9600000000006764e-7, y: 4.084051306875356 },\n { x: 1.9700000000006763e-7, y: 4.129206282534105 },\n { x: 1.9800000000006763e-7, y: 4.096340213513475 },\n { x: 1.9900000000006763e-7, y: 4.156542968671335 },\n { x: 2.0000000000006762e-7, y: 4.119429775233858 },\n { x: 2.0100000000006762e-7, y: 4.149390260909627 },\n { x: 2.020000000000676e-7, y: 4.144120499048146 },\n { x: 2.030000000000676e-7, y: 4.139791259105984 },\n { x: 2.040000000000676e-7, y: 4.196807481401228 },\n { x: 2.050000000000676e-7, y: 4.174475109243049 },\n { x: 2.060000000000676e-7, y: 4.187160718830028 },\n { x: 2.070000000000676e-7, y: 4.179711712649196 },\n { x: 2.080000000000676e-7, y: 4.201433196022256 },\n { x: 2.0900000000006758e-7, y: 4.26586933037637 },\n { x: 2.1000000000006758e-7, y: 4.253835518428927 },\n { x: 2.1100000000006757e-7, y: 4.218429863190106 },\n { x: 2.1200000000006757e-7, y: 4.26095358447011 },\n { x: 2.1300000000006757e-7, y: 4.2590443592689855 },\n { x: 2.1400000000006756e-7, y: 4.289996517255768 },\n { x: 2.1500000000006756e-7, y: 4.313056616043523 },\n { x: 2.1600000000006755e-7, y: 4.331979158283773 },\n { x: 2.1700000000006755e-7, y: 4.313387615221893 },\n { x: 2.1800000000006754e-7, y: 4.3445667568279625 },\n { x: 2.1900000000006754e-7, y: 4.293674920656978 },\n { x: 2.2000000000006754e-7, y: 4.3363937326020405 },\n { x: 2.2100000000006753e-7, y: 4.311975176686082 },\n { x: 2.2200000000006753e-7, y: 4.309277146105408 },\n { x: 2.2300000000006752e-7, y: 4.35379944540888 },\n { x: 2.2400000000006752e-7, y: 4.3575946258253335 },\n { x: 2.2500000000006751e-7, y: 4.402927128316672 },\n { x: 2.260000000000675e-7, y: 4.393840760035625 },\n { x: 2.270000000000675e-7, y: 4.4054221787463295 },\n { x: 2.280000000000675e-7, y: 4.365009812805271 },\n { x: 2.290000000000675e-7, y: 4.408350038096867 },\n { x: 2.300000000000675e-7, y: 4.3939073030095095 },\n { x: 2.310000000000675e-7, y: 4.374668327817958 },\n { x: 2.3200000000006748e-7, y: 4.377810381545066 },\n { x: 2.3300000000006748e-7, y: 4.432589162622251 },\n { x: 2.3400000000006748e-7, y: 4.4537937245520975 },\n { x: 2.3500000000006747e-7, y: 4.434739702125108 },\n { x: 2.3600000000006747e-7, y: 4.421869611511303 },\n { x: 2.3700000000006746e-7, y: 4.395968401989458 },\n { x: 2.3800000000006746e-7, y: 4.418283482201154 },\n { x: 2.3900000000006745e-7, y: 4.429114120101884 },\n { x: 2.400000000000675e-7, y: 4.475924250691162 },\n { x: 2.410000000000675e-7, y: 4.480597405421405 },\n { x: 2.420000000000675e-7, y: 4.471725459771187 },\n { x: 2.4300000000006754e-7, y: 4.4759920662868025 },\n { x: 2.4400000000006757e-7, y: 4.457466027302085 },\n { x: 2.450000000000676e-7, y: 4.51327554148812 },\n { x: 2.460000000000676e-7, y: 4.492173663035807 },\n { x: 2.4700000000006763e-7, y: 4.46175544488327 },\n { x: 2.4800000000006765e-7, y: 4.483580913840163 },\n { x: 2.490000000000677e-7, y: 4.4818737078426265 },\n { x: 2.500000000000677e-7, y: 4.483930252722769 },\n { x: 2.510000000000677e-7, y: 4.495049555509013 },\n { x: 2.5200000000006774e-7, y: 4.500884472325458 },\n { x: 2.5300000000006776e-7, y: 4.5449816917745265 },\n { x: 2.540000000000678e-7, y: 4.541621982329801 },\n { x: 2.550000000000678e-7, y: 4.568307805363606 },\n { x: 2.5600000000006783e-7, y: 4.5204329412829845 },\n { x: 2.5700000000006785e-7, y: 4.570754147203238 },\n { x: 2.580000000000679e-7, y: 4.524549336955163 },\n { x: 2.590000000000679e-7, y: 4.540395397127683 },\n { x: 2.600000000000679e-7, y: 4.518404095772062 },\n { x: 2.6100000000006794e-7, y: 4.5558226992527 },\n { x: 2.6200000000006796e-7, y: 4.587201244489122 },\n { x: 2.63000000000068e-7, y: 4.5364775317235715 },\n { x: 2.64000000000068e-7, y: 4.537434301357686 },\n { x: 2.6500000000006803e-7, y: 4.554480991663611 },\n { x: 2.6600000000006805e-7, y: 4.551959291547926 },\n { x: 2.670000000000681e-7, y: 4.546175409404218 },\n { x: 2.680000000000681e-7, y: 4.558067767220025 },\n { x: 2.690000000000681e-7, y: 4.562903822013282 },\n { x: 2.7000000000006814e-7, y: 4.593983329432042 },\n { x: 2.7100000000006816e-7, y: 4.6052625278532275 },\n { x: 2.720000000000682e-7, y: 4.545832854247038 },\n { x: 2.730000000000682e-7, y: 4.551427689365389 },\n { x: 2.7400000000006823e-7, y: 4.6168291457039405 },\n { x: 2.7500000000006825e-7, y: 4.5748588256552525 },\n { x: 2.760000000000683e-7, y: 4.611824980830878 },\n { x: 2.770000000000683e-7, y: 4.572758838954031 },\n { x: 2.780000000000683e-7, y: 4.579156007250689 },\n { x: 2.7900000000006834e-7, y: 4.568647565172117 },\n { x: 2.8000000000006836e-7, y: 4.621257394241068 },\n { x: 2.810000000000684e-7, y: 4.593231939640312 },\n { x: 2.820000000000684e-7, y: 4.5994994415856825 },\n { x: 2.8300000000006843e-7, y: 4.637039683269703 },\n { x: 2.8400000000006845e-7, y: 4.594394597053631 },\n { x: 2.850000000000685e-7, y: 4.560818851394454 },\n { x: 2.860000000000685e-7, y: 4.60029704671781 },\n { x: 2.870000000000685e-7, y: 4.553689847030158 },\n { x: 2.8800000000006854e-7, y: 4.5925048540724625 },\n { x: 2.8900000000006856e-7, y: 4.590618080030675 },\n { x: 2.900000000000686e-7, y: 4.576541496690467 },\n { x: 2.910000000000686e-7, y: 4.555565680735937 },\n { x: 2.9200000000006863e-7, y: 4.62188315577281 },\n { x: 2.9300000000006865e-7, y: 4.556238565404815 },\n { x: 2.940000000000687e-7, y: 4.570057311239993 },\n { x: 2.950000000000687e-7, y: 4.607741729428422 },\n { x: 2.960000000000687e-7, y: 4.6240193896352215 },\n { x: 2.9700000000006874e-7, y: 4.559360181850518 },\n { x: 2.9800000000006876e-7, y: 4.603544270929363 },\n { x: 2.990000000000688e-7, y: 4.572578516232343 },\n { x: 3.000000000000688e-7, y: 4.54867999290276 },\n { x: 3.0100000000006883e-7, y: 4.553428161610771 },\n { x: 3.0200000000006885e-7, y: 4.614163167171206 },\n { x: 3.030000000000689e-7, y: 4.546188708872833 },\n { x: 3.040000000000689e-7, y: 4.60454532264954 },\n { x: 3.050000000000689e-7, y: 4.5366359764470765 },\n { x: 3.0600000000006894e-7, y: 4.5647069396754 },\n { x: 3.0700000000006896e-7, y: 4.578690013699633 },\n { x: 3.08000000000069e-7, y: 4.588222764226879 },\n { x: 3.09000000000069e-7, y: 4.579926647975305 },\n { x: 3.1000000000006903e-7, y: 4.576679529258076 },\n { x: 3.1100000000006905e-7, y: 4.525714215195552 },\n { x: 3.120000000000691e-7, y: 4.548322182573998 },\n { x: 3.130000000000691e-7, y: 4.532768010071163 },\n { x: 3.140000000000691e-7, y: 4.568846728047218 },\n { x: 3.1500000000006914e-7, y: 4.525509620709712 },\n { x: 3.1600000000006916e-7, y: 4.550931577579017 },\n { x: 3.170000000000692e-7, y: 4.540242891548967 },\n { x: 3.180000000000692e-7, y: 4.5521983862480315 },\n { x: 3.1900000000006923e-7, y: 4.497398701261551 },\n { x: 3.2000000000006925e-7, y: 4.5359335018999305 },\n { x: 3.210000000000693e-7, y: 4.537962182929126 },\n { x: 3.220000000000693e-7, y: 4.5241014561161474 },\n { x: 3.230000000000693e-7, y: 4.551489858748293 },\n { x: 3.2400000000006934e-7, y: 4.536010243465154 },\n { x: 3.2500000000006936e-7, y: 4.5386710687092195 },\n { x: 3.260000000000694e-7, y: 4.478118828533177 },\n { x: 3.270000000000694e-7, y: 4.521792084800384 },\n { x: 3.2800000000006943e-7, y: 4.501049680494854 },\n { x: 3.2900000000006945e-7, y: 4.498592547630318 },\n { x: 3.300000000000695e-7, y: 4.488482842532222 },\n { x: 3.310000000000695e-7, y: 4.441156767896616 },\n { x: 3.320000000000695e-7, y: 4.444054134394553 },\n { x: 3.3300000000006954e-7, y: 4.466584416902529 },\n { x: 3.3400000000006956e-7, y: 4.463800509045774 },\n { x: 3.350000000000696e-7, y: 4.464058505028582 },\n { x: 3.360000000000696e-7, y: 4.41443460783856 },\n { x: 3.3700000000006963e-7, y: 4.4398327174313685 },\n { x: 3.3800000000006965e-7, y: 4.468418072799661 },\n { x: 3.3900000000006967e-7, y: 4.458678231500451 },\n { x: 3.400000000000697e-7, y: 4.411121228444063 },\n { x: 3.410000000000697e-7, y: 4.454837914375734 },\n { x: 3.4200000000006974e-7, y: 4.381677695269781 },\n { x: 3.4300000000006976e-7, y: 4.389204344577293 },\n { x: 3.440000000000698e-7, y: 4.398818597503304 },\n { x: 3.450000000000698e-7, y: 4.400713260814368 },\n { x: 3.4600000000006983e-7, y: 4.352153293845595 },\n { x: 3.4700000000006985e-7, y: 4.392654280211924 },\n { x: 3.4800000000006987e-7, y: 4.3659850342792375 },\n { x: 3.490000000000699e-7, y: 4.36736284837299 },\n { x: 3.500000000000699e-7, y: 4.36500353689255 },\n { x: 3.5100000000006994e-7, y: 4.350601346933341 },\n { x: 3.5200000000006996e-7, y: 4.3552665070237815 },\n { x: 3.5300000000007e-7, y: 4.37314943151817 },\n { x: 3.5400000000007e-7, y: 4.344213285069556 },\n { x: 3.5500000000007003e-7, y: 4.357570821997053 },\n { x: 3.5600000000007005e-7, y: 4.3280910112104705 },\n { x: 3.5700000000007007e-7, y: 4.296926124294212 },\n { x: 3.580000000000701e-7, y: 4.283150978167562 },\n { x: 3.590000000000701e-7, y: 4.269804944259307 },\n { x: 3.6000000000007014e-7, y: 4.286035855681393 },\n { x: 3.6100000000007016e-7, y: 4.297874020004684 },\n { x: 3.620000000000702e-7, y: 4.235710208198241 },\n { x: 3.630000000000702e-7, y: 4.268885191015169 },\n { x: 3.6400000000007023e-7, y: 4.2224875113344105 },\n { x: 3.6500000000007025e-7, y: 4.270277524606534 },\n { x: 3.6600000000007027e-7, y: 4.239989002206763 },\n { x: 3.670000000000703e-7, y: 4.226840189057081 },\n { x: 3.680000000000703e-7, y: 4.1940128726361445 },\n { x: 3.6900000000007034e-7, y: 4.181086371816021 },\n { x: 3.7000000000007036e-7, y: 4.238774199152604 },\n { x: 3.710000000000704e-7, y: 4.1978816035202255 },\n { x: 3.720000000000704e-7, y: 4.185784719111473 },\n { x: 3.7300000000007043e-7, y: 4.197477154050938 },\n { x: 3.7400000000007045e-7, y: 4.1578642609820795 },\n { x: 3.7500000000007047e-7, y: 4.187135262137642 },\n { x: 3.760000000000705e-7, y: 4.1628653672803235 },\n { x: 3.770000000000705e-7, y: 4.146487976908809 },\n { x: 3.7800000000007054e-7, y: 4.118683294656924 },\n { x: 3.7900000000007056e-7, y: 4.080779770378712 },\n { x: 3.800000000000706e-7, y: 4.13584263344365 },\n { x: 3.810000000000706e-7, y: 4.0746549723826915 },\n { x: 3.8200000000007063e-7, y: 4.1198208873236375 },\n { x: 3.8300000000007065e-7, y: 4.110721578932751 },\n { x: 3.8400000000007067e-7, y: 4.061832412772853 },\n { x: 3.850000000000707e-7, y: 4.077033118807877 },\n { x: 3.860000000000707e-7, y: 4.021584327166643 },\n { x: 3.8700000000007074e-7, y: 4.052643137409191 },\n { x: 3.8800000000007076e-7, y: 4.053730696000853 },\n { x: 3.890000000000708e-7, y: 3.98329033004593 },\n { x: 3.900000000000708e-7, y: 3.989220939647749 },\n { x: 3.9100000000007083e-7, y: 4.011669525237745 },\n { x: 3.9200000000007085e-7, y: 3.9593185686549672 },\n { x: 3.9300000000007087e-7, y: 3.95800337748763 },\n { x: 3.940000000000709e-7, y: 3.9733521729232164 },\n { x: 3.950000000000709e-7, y: 3.9290226207454073 },\n { x: 3.9600000000007094e-7, y: 3.950804485092987 },\n { x: 3.9700000000007096e-7, y: 3.946347337740705 },\n { x: 3.98000000000071e-7, y: 3.89513188893136 },\n { x: 3.99000000000071e-7, y: 3.9041663835218716 },\n { x: 4.0000000000007103e-7, y: 3.9054122513054814 },\n { x: 4.0100000000007105e-7, y: 3.878006800142969 },\n { x: 4.0200000000007107e-7, y: 3.8422361087703996 },\n { x: 4.030000000000711e-7, y: 3.8250752024171355 },\n { x: 4.040000000000711e-7, y: 3.8076853470895156 },\n { x: 4.0500000000007114e-7, y: 3.801939608916005 },\n { x: 4.0600000000007116e-7, y: 3.8506114375860516 },\n { x: 4.070000000000712e-7, y: 3.8210576203255022 },\n { x: 4.080000000000712e-7, y: 3.7931229622809077 },\n { x: 4.0900000000007123e-7, y: 3.790331101077256 },\n { x: 4.1000000000007125e-7, y: 3.767494508124199 },\n { x: 4.1100000000007127e-7, y: 3.745255681923489 },\n { x: 4.120000000000713e-7, y: 3.7692888995718996 },\n { x: 4.130000000000713e-7, y: 3.728659757584573 },\n { x: 4.1400000000007134e-7, y: 3.705062353961188 },\n { x: 4.1500000000007136e-7, y: 3.7412144824398537 },\n { x: 4.160000000000714e-7, y: 3.7044552069575523 },\n { x: 4.170000000000714e-7, y: 3.6543403228267097 },\n { x: 4.180000000000714e-7, y: 3.681118348886848 },\n { x: 4.1900000000007145e-7, y: 3.638090164167694 },\n { x: 4.2000000000007147e-7, y: 3.6096363651985537 },\n { x: 4.210000000000715e-7, y: 3.6313689690619024 },\n { x: 4.220000000000715e-7, y: 3.589192689298439 },\n { x: 4.2300000000007154e-7, y: 3.5708728299880823 },\n { x: 4.2400000000007156e-7, y: 3.61689610554449 },\n { x: 4.250000000000716e-7, y: 3.575472827657053 },\n { x: 4.260000000000716e-7, y: 3.55766854710107 },\n { x: 4.270000000000716e-7, y: 3.5741776711902866 },\n { x: 4.2800000000007165e-7, y: 3.538132833582119 },\n { x: 4.2900000000007167e-7, y: 3.4871676961370395 },\n { x: 4.300000000000717e-7, y: 3.5452386959853306 },\n { x: 4.310000000000717e-7, y: 3.4743088019091375 },\n { x: 4.3200000000007174e-7, y: 3.453869113849182 },\n { x: 4.3300000000007176e-7, y: 3.463199173447619 },\n { x: 4.340000000000718e-7, y: 3.460409975132845 },\n { x: 4.350000000000718e-7, y: 3.405961091318614 },\n { x: 4.360000000000718e-7, y: 3.415897137420462 },\n { x: 4.3700000000007185e-7, y: 3.3720287059449463 },\n { x: 4.3800000000007187e-7, y: 3.3587167637655786 },\n { x: 4.390000000000719e-7, y: 3.3850777860967054 },\n { x: 4.400000000000719e-7, y: 3.3695773790239647 },\n { x: 4.4100000000007194e-7, y: 3.350720204294603 },\n { x: 4.4200000000007196e-7, y: 3.346654006398577 },\n { x: 4.43000000000072e-7, y: 3.3469779959293007 },\n { x: 4.44000000000072e-7, y: 3.297302666062012 },\n { x: 4.45000000000072e-7, y: 3.3120016274359982 },\n { x: 4.4600000000007205e-7, y: 3.25090454348141 },\n { x: 4.4700000000007207e-7, y: 3.2301864599922174 },\n { x: 4.480000000000721e-7, y: 3.256211785796371 },\n { x: 4.490000000000721e-7, y: 3.214903914002878 },\n { x: 4.5000000000007214e-7, y: 3.2426371661344584 },\n { x: 4.5100000000007216e-7, y: 3.2317129221506007 },\n { x: 4.520000000000722e-7, y: 3.1851992692344497 },\n { x: 4.530000000000722e-7, y: 3.1422962816825724 },\n { x: 4.540000000000722e-7, y: 3.1743721048385365 },\n { x: 4.5500000000007225e-7, y: 3.123842337997481 },\n { x: 4.5600000000007227e-7, y: 3.1153628840015464 },\n { x: 4.570000000000723e-7, y: 3.0738754084491346 },\n { x: 4.580000000000723e-7, y: 3.0889875023203968 },\n { x: 4.5900000000007234e-7, y: 3.0403022408972413 },\n { x: 4.6000000000007236e-7, y: 3.084524623874236 },\n { x: 4.610000000000724e-7, y: 3.0593402484204013 },\n { x: 4.620000000000724e-7, y: 3.0035225259672442 },\n { x: 4.630000000000724e-7, y: 3.021796815788875 },\n { x: 4.6400000000007245e-7, y: 3.017220968937486 },\n { x: 4.6500000000007247e-7, y: 3.0092150035518004 },\n { x: 4.660000000000725e-7, y: 2.9827318146842674 },\n { x: 4.670000000000725e-7, y: 2.9540128382751765 },\n { x: 4.6800000000007254e-7, y: 2.9545588348991147 },\n { x: 4.6900000000007256e-7, y: 2.9109049445043733 },\n { x: 4.700000000000726e-7, y: 2.9045013973097187 },\n { x: 4.710000000000726e-7, y: 2.9185712173653084 },\n { x: 4.720000000000726e-7, y: 2.8916238018535836 },\n { x: 4.7300000000007265e-7, y: 2.8823619788153008 },\n { x: 4.7400000000007267e-7, y: 2.8266556570333594 },\n { x: 4.750000000000727e-7, y: 2.833761091547332 },\n { x: 4.760000000000727e-7, y: 2.782888997643641 },\n { x: 4.770000000000727e-7, y: 2.7993782354906847 },\n { x: 4.780000000000727e-7, y: 2.7866835281460696 },\n { x: 4.790000000000726e-7, y: 2.72659697091339 },\n { x: 4.800000000000726e-7, y: 2.7174193433800875 },\n { x: 4.810000000000726e-7, y: 2.6800611691037917 },\n { x: 4.820000000000725e-7, y: 2.726360246619215 },\n { x: 4.830000000000725e-7, y: 2.6753912973644516 },\n { x: 4.840000000000725e-7, y: 2.664223533398994 },\n { x: 4.850000000000724e-7, y: 2.6399974723761503 },\n { x: 4.860000000000724e-7, y: 2.6499838475832704 },\n { x: 4.870000000000724e-7, y: 2.585691517154935 },\n { x: 4.880000000000723e-7, y: 2.5977791165376307 },\n { x: 4.890000000000723e-7, y: 2.573598463798158 },\n { x: 4.900000000000723e-7, y: 2.6021213916319286 },\n { x: 4.910000000000723e-7, y: 2.5413761024074377 },\n { x: 4.920000000000722e-7, y: 2.556022333034545 },\n { x: 4.930000000000722e-7, y: 2.4801506528995945 },\n { x: 4.940000000000722e-7, y: 2.5127444207031444 },\n { x: 4.950000000000721e-7, y: 2.4506561227748533 },\n { x: 4.960000000000721e-7, y: 2.4871722464600383 },\n { x: 4.970000000000721e-7, y: 2.4480153017298587 },\n { x: 4.98000000000072e-7, y: 2.390010024968104 },\n { x: 4.99000000000072e-7, y: 2.3875016166300354 },\n { x: 5.00000000000072e-7, y: 2.3974305433342855 },\n { x: 5.010000000000719e-7, y: 2.3804525797349534 },\n { x: 5.020000000000719e-7, y: 2.319847501668554 },\n { x: 5.030000000000719e-7, y: 2.354606412231442 },\n { x: 5.040000000000719e-7, y: 2.2913726624483135 },\n { x: 5.050000000000718e-7, y: 2.3331341602784237 },\n { x: 5.060000000000718e-7, y: 2.2693402371147453 },\n { x: 5.070000000000718e-7, y: 2.2723088948853416 },\n { x: 5.080000000000717e-7, y: 2.2219370098681503 },\n { x: 5.090000000000717e-7, y: 2.2335900519277834 },\n { x: 5.100000000000717e-7, y: 2.248182551707964 },\n { x: 5.110000000000716e-7, y: 2.1732525739894593 },\n { x: 5.120000000000716e-7, y: 2.1713339937460554 },\n { x: 5.130000000000716e-7, y: 2.1404041291143674 },\n { x: 5.140000000000715e-7, y: 2.1607497105837776 },\n { x: 5.150000000000715e-7, y: 2.1326878357989525 },\n { x: 5.160000000000715e-7, y: 2.111513448282211 },\n { x: 5.170000000000715e-7, y: 2.0593831863297587 },\n { x: 5.180000000000714e-7, y: 2.0375872722830493 },\n { x: 5.190000000000714e-7, y: 2.0686457446185154 },\n { x: 5.200000000000714e-7, y: 2.0223102152902546 },\n { x: 5.210000000000713e-7, y: 2.032649093071548 },\n { x: 5.220000000000713e-7, y: 2.019768464909469 },\n { x: 5.230000000000713e-7, y: 2.0095400563561614 },\n { x: 5.240000000000712e-7, y: 1.9777441852768034 },\n { x: 5.250000000000712e-7, y: 1.9197327020510637 },\n { x: 5.260000000000712e-7, y: 1.9478427678526091 },\n { x: 5.270000000000711e-7, y: 1.8643096729473774 },\n { x: 5.280000000000711e-7, y: 1.9199884602456652 },\n { x: 5.290000000000711e-7, y: 1.8614442042826362 },\n { x: 5.30000000000071e-7, y: 1.828447341067436 },\n { x: 5.31000000000071e-7, y: 1.83568283443109 },\n { x: 5.32000000000071e-7, y: 1.819083068860657 },\n { x: 5.33000000000071e-7, y: 1.76929210426416 },\n { x: 5.340000000000709e-7, y: 1.8060127684242715 },\n { x: 5.350000000000709e-7, y: 1.7644534399085456 },\n { x: 5.360000000000709e-7, y: 1.7071802357662391 },\n { x: 5.370000000000708e-7, y: 1.729182684014748 },\n { x: 5.380000000000708e-7, y: 1.707822739368085 },\n { x: 5.390000000000708e-7, y: 1.6503470105866342 },\n { x: 5.400000000000707e-7, y: 1.6790513826683995 },\n { x: 5.410000000000707e-7, y: 1.6770004914206622 },\n { x: 5.420000000000707e-7, y: 1.6446221785271975 },\n { x: 5.430000000000707e-7, y: 1.6262076843646684 },\n { x: 5.440000000000706e-7, y: 1.581388679998766 },\n { x: 5.450000000000706e-7, y: 1.572271379606089 },\n { x: 5.460000000000706e-7, y: 1.564148898597291 },\n { x: 5.470000000000705e-7, y: 1.547681152243796 },\n { x: 5.480000000000705e-7, y: 1.47384020638136 },\n { x: 5.490000000000705e-7, y: 1.504440711939198 },\n { x: 5.500000000000704e-7, y: 1.4455278717686377 },\n { x: 5.510000000000704e-7, y: 1.468981363814639 },\n { x: 5.520000000000704e-7, y: 1.4020354328610296 },\n { x: 5.530000000000703e-7, y: 1.4477540019129607 },\n { x: 5.540000000000703e-7, y: 1.4270481405880733 },\n { x: 5.550000000000703e-7, y: 1.3895567898591026 },\n { x: 5.560000000000703e-7, y: 1.3912841713839703 },\n { x: 5.570000000000702e-7, y: 1.3297641154545967 },\n { x: 5.580000000000702e-7, y: 1.3280987817611685 },\n { x: 5.590000000000702e-7, y: 1.2654478156955729 },\n { x: 5.600000000000701e-7, y: 1.2567090185435266 },\n { x: 5.610000000000701e-7, y: 1.2471258939365573 },\n { x: 5.620000000000701e-7, y: 1.2552568807593996 },\n { x: 5.6300000000007e-7, y: 1.1943193467686406 },\n { x: 5.6400000000007e-7, y: 1.2373458429755204 },\n { x: 5.6500000000007e-7, y: 1.2255213327562549 },\n { x: 5.660000000000699e-7, y: 1.1400154666484812 },\n { x: 5.670000000000699e-7, y: 1.1426882597845875 },\n { x: 5.680000000000699e-7, y: 1.1113362896104515 },\n { x: 5.690000000000699e-7, y: 1.080666080249789 },\n { x: 5.700000000000698e-7, y: 1.0568535903500327 },\n { x: 5.710000000000698e-7, y: 1.0879369877265455 },\n { x: 5.720000000000698e-7, y: 1.071060524334522 },\n { x: 5.730000000000697e-7, y: 1.0413648554555746 },\n { x: 5.740000000000697e-7, y: 1.0142338732633065 },\n { x: 5.750000000000697e-7, y: 0.9891672021444043 },\n { x: 5.760000000000696e-7, y: 0.974548560741885 },\n { x: 5.770000000000696e-7, y: 0.9326181249932587 },\n { x: 5.780000000000696e-7, y: 0.9600504528685031 },\n { x: 5.790000000000695e-7, y: 0.9490020824901222 },\n { x: 5.800000000000695e-7, y: 0.9066762958557413 },\n { x: 5.810000000000695e-7, y: 0.8608999029163629 },\n { x: 5.820000000000695e-7, y: 0.8650154914689567 },\n { x: 5.830000000000694e-7, y: 0.8425611266837111 },\n { x: 5.840000000000694e-7, y: 0.8088135816402537 },\n { x: 5.850000000000694e-7, y: 0.8386555368288905 },\n { x: 5.860000000000693e-7, y: 0.7784250875475518 },\n { x: 5.870000000000693e-7, y: 0.8019386259248096 },\n { x: 5.880000000000693e-7, y: 0.7260998002339443 },\n { x: 5.890000000000692e-7, y: 0.7473931078806977 },\n { x: 5.900000000000692e-7, y: 0.71992333530566 },\n { x: 5.910000000000692e-7, y: 0.7302826146038286 },\n { x: 5.920000000000691e-7, y: 0.6944557914381496 },\n { x: 5.930000000000691e-7, y: 0.6275880543972894 },\n { x: 5.940000000000691e-7, y: 0.6274911538691162 },\n { x: 5.950000000000691e-7, y: 0.5825310229623206 },\n { x: 5.96000000000069e-7, y: 0.6263243670700657 },\n { x: 5.97000000000069e-7, y: 0.5602519834168201 },\n { x: 5.98000000000069e-7, y: 0.5420254573767047 },\n { x: 5.990000000000689e-7, y: 0.5642410775914146 },\n { x: 6.000000000000689e-7, y: 0.5233167413466189 },\n { x: 6.010000000000689e-7, y: 0.5414136883192964 },\n { x: 6.020000000000688e-7, y: 0.45289178893868004 },\n { x: 6.030000000000688e-7, y: 0.4426813549638022 },\n { x: 6.040000000000688e-7, y: 0.4310099626745463 },\n { x: 6.050000000000687e-7, y: 0.4692582408978895 },\n { x: 6.060000000000687e-7, y: 0.3901201542415163 },\n { x: 6.070000000000687e-7, y: 0.3606987140700868 },\n { x: 6.080000000000687e-7, y: 0.38664029110287096 },\n { x: 6.090000000000686e-7, y: 0.354170505759941 },\n { x: 6.100000000000686e-7, y: 0.3474385661448188 },\n { x: 6.110000000000686e-7, y: 0.2875469324482121 },\n { x: 6.120000000000685e-7, y: 0.2812112082816194 },\n { x: 6.130000000000685e-7, y: 0.2832842675852578 },\n { x: 6.140000000000685e-7, y: 0.2824878207627931 },\n { x: 6.150000000000684e-7, y: 0.22885822810543843 },\n { x: 6.160000000000684e-7, y: 0.2153431121452024 },\n { x: 6.170000000000684e-7, y: 0.2362758548632193 },\n { x: 6.180000000000683e-7, y: 0.1999284052843285 },\n { x: 6.190000000000683e-7, y: 0.19607407417239414 },\n { x: 6.200000000000683e-7, y: 0.12373481557665877 },\n { x: 6.210000000000683e-7, y: 0.16367069560413128 },\n { x: 6.220000000000682e-7, y: 0.12725656868652202 },\n { x: 6.230000000000682e-7, y: 0.10684690202173974 },\n { x: 6.240000000000682e-7, y: 0.07068768143158324 },\n { x: 6.250000000000681e-7, y: 0.06511404415673 },\n { x: 6.260000000000681e-7, y: 0.026735221709894213 },\n { x: 6.270000000000681e-7, y: 0.024486353925565477 },\n { x: 6.28000000000068e-7, y: -0.015545959623921524 },\n { x: 6.29000000000068e-7, y: 0.000314756325871534 },\n { x: 6.30000000000068e-7, y: 0.000021923407494166963 },\n { x: 6.310000000000679e-7, y: -0.017461737481183043 },\n { x: 6.320000000000679e-7, y: -0.051157078466407366 },\n { x: 6.330000000000679e-7, y: -0.04944341243757768 },\n { x: 6.340000000000679e-7, y: -0.1046030080020188 },\n { x: 6.350000000000678e-7, y: -0.12807686328454046 },\n { x: 6.360000000000678e-7, y: -0.16248484696751042 },\n { x: 6.370000000000678e-7, y: -0.13744640242652906 },\n { x: 6.380000000000677e-7, y: -0.17703964717898313 },\n { x: 6.390000000000677e-7, y: -0.16670634202914192 },\n { x: 6.400000000000677e-7, y: -0.18660880388708884 },\n { x: 6.410000000000676e-7, y: -0.23627716610533803 },\n { x: 6.420000000000676e-7, y: -0.21056096530616258 },\n { x: 6.430000000000676e-7, y: -0.2501752670645122 },\n { x: 6.440000000000675e-7, y: -0.31951595038281894 },\n { x: 6.450000000000675e-7, y: -0.2812287199006149 },\n { x: 6.460000000000675e-7, y: -0.31788768310067755 },\n { x: 6.470000000000675e-7, y: -0.32301869887910484 },\n { x: 6.480000000000674e-7, y: -0.3826876872739434 },\n { x: 6.490000000000674e-7, y: -0.34959191521222666 },\n { x: 6.500000000000674e-7, y: -0.37131893413357375 },\n { x: 6.510000000000673e-7, y: -0.37564253594002406 },\n { x: 6.520000000000673e-7, y: -0.4313685153394282 },\n { x: 6.530000000000673e-7, y: -0.44488903050817347 },\n { x: 6.540000000000672e-7, y: -0.485258748423778 },\n { x: 6.550000000000672e-7, y: -0.4712961112986434 },\n { x: 6.560000000000672e-7, y: -0.46570857363252427 },\n { x: 6.570000000000671e-7, y: -0.4889915086639795 },\n { x: 6.580000000000671e-7, y: -0.543516887596962 },\n { x: 6.590000000000671e-7, y: -0.5497461036875846 },\n { x: 6.600000000000671e-7, y: -0.5721096585783956 },\n { x: 6.61000000000067e-7, y: -0.568278399244334 },\n { x: 6.62000000000067e-7, y: -0.6113755072534441 },\n { x: 6.63000000000067e-7, y: -0.6446515652219412 },\n { x: 6.640000000000669e-7, y: -0.6520441039141067 },\n { x: 6.650000000000669e-7, y: -0.6467486939956133 },\n { x: 6.660000000000669e-7, y: -0.632958574919273 },\n { x: 6.670000000000668e-7, y: -0.7156466009673889 },\n { x: 6.680000000000668e-7, y: -0.6736079815846527 },\n { x: 6.690000000000668e-7, y: -0.7239291866197504 },\n { x: 6.700000000000667e-7, y: -0.7260301243793009 },\n { x: 6.710000000000667e-7, y: -0.7649741962455779 },\n { x: 6.720000000000667e-7, y: -0.7876564131806228 },\n { x: 6.730000000000667e-7, y: -0.791394149235758 },\n { x: 6.740000000000666e-7, y: -0.8197469715588154 },\n { x: 6.750000000000666e-7, y: -0.8477123877921675 },\n { x: 6.760000000000666e-7, y: -0.8303858148050725 },\n { x: 6.770000000000665e-7, y: -0.8323439235252145 },\n { x: 6.780000000000665e-7, y: -0.8334321948323198 },\n { x: 6.790000000000665e-7, y: -0.9003503610127871 },\n { x: 6.800000000000664e-7, y: -0.8995780213795597 },\n { x: 6.810000000000664e-7, y: -0.8954076557687466 },\n { x: 6.820000000000664e-7, y: -0.9240675928928158 },\n { x: 6.830000000000663e-7, y: -0.931662499588955 },\n { x: 6.840000000000663e-7, y: -0.9477081686012161 },\n { x: 6.850000000000663e-7, y: -1.0070930413776746 },\n { x: 6.860000000000663e-7, y: -0.9738117518142747 },\n { x: 6.870000000000662e-7, y: -0.9944927034675656 },\n { x: 6.880000000000662e-7, y: -1.0301441996220406 },\n { x: 6.890000000000662e-7, y: -1.0543073291520935 },\n { x: 6.900000000000661e-7, y: -1.061228226149279 },\n { x: 6.910000000000661e-7, y: -1.0532320129572157 },\n { x: 6.920000000000661e-7, y: -1.1285361100406788 },\n { x: 6.93000000000066e-7, y: -1.121892254856008 },\n { x: 6.94000000000066e-7, y: -1.1254009447679563 },\n { x: 6.95000000000066e-7, y: -1.1474053143088307 },\n { x: 6.96000000000066e-7, y: -1.1819284352207882 },\n { x: 6.970000000000659e-7, y: -1.170375838791766 },\n { x: 6.980000000000659e-7, y: -1.1659376718204282 },\n { x: 6.990000000000659e-7, y: -1.1985586289333732 },\n { x: 7.000000000000658e-7, y: -1.2499434800209763 },\n { x: 7.010000000000658e-7, y: -1.2677655112804196 },\n { x: 7.020000000000658e-7, y: -1.2342547119576157 },\n { x: 7.030000000000657e-7, y: -1.2899872636301766 },\n { x: 7.040000000000657e-7, y: -1.28964351308095 },\n { x: 7.050000000000657e-7, y: -1.328726839544997 },\n { x: 7.060000000000656e-7, y: -1.2762797594448783 },\n { x: 7.070000000000656e-7, y: -1.2951674220098355 },\n { x: 7.080000000000656e-7, y: -1.3201791348232343 },\n { x: 7.090000000000655e-7, y: -1.319972918897219 },\n { x: 7.100000000000655e-7, y: -1.3598193206254197 },\n { x: 7.110000000000655e-7, y: -1.3781355841807592 },\n { x: 7.120000000000655e-7, y: -1.3972533532709528 },\n { x: 7.130000000000654e-7, y: -1.396860697375187 },\n { x: 7.140000000000654e-7, y: -1.410304619824219 },\n { x: 7.150000000000654e-7, y: -1.4141963752649322 },\n { x: 7.160000000000653e-7, y: -1.4842972321676648 },\n { x: 7.170000000000653e-7, y: -1.4494901953244637 },\n { x: 7.180000000000653e-7, y: -1.4521703528655414 },\n { x: 7.190000000000652e-7, y: -1.4850233543540792 },\n { x: 7.200000000000652e-7, y: -1.4866179839955078 },\n { x: 7.210000000000652e-7, y: -1.5353383039505737 },\n { x: 7.220000000000651e-7, y: -1.5717463464532468 },\n { x: 7.230000000000651e-7, y: -1.5362570972320952 },\n { x: 7.240000000000651e-7, y: -1.5725372396688504 },\n { x: 7.250000000000651e-7, y: -1.586537427055434 },\n { x: 7.26000000000065e-7, y: -1.6040476669460735 },\n { x: 7.27000000000065e-7, y: -1.5772373292020172 },\n { x: 7.28000000000065e-7, y: -1.6373771945858209 },\n { x: 7.290000000000649e-7, y: -1.6671523434416033 },\n { x: 7.300000000000649e-7, y: -1.6537152168496216 },\n { x: 7.310000000000649e-7, y: -1.679204260122909 },\n { x: 7.320000000000648e-7, y: -1.644631906347282 },\n { x: 7.330000000000648e-7, y: -1.6979930526048614 },\n { x: 7.340000000000648e-7, y: -1.7412339724948869 },\n { x: 7.350000000000647e-7, y: -1.721147801627306 },\n { x: 7.360000000000647e-7, y: -1.735086720584018 },\n { x: 7.370000000000647e-7, y: -1.7246350604220912 },\n { x: 7.380000000000647e-7, y: -1.787684334708181 },\n { x: 7.390000000000646e-7, y: -1.7878400578387499 },\n { x: 7.400000000000646e-7, y: -1.8011118045587209 },\n { x: 7.410000000000646e-7, y: -1.80514729127611 },\n { x: 7.420000000000645e-7, y: -1.803973588079188 },\n { x: 7.430000000000645e-7, y: -1.8140088435190584 },\n { x: 7.440000000000645e-7, y: -1.8319034814867554 },\n { x: 7.450000000000644e-7, y: -1.8263356145134895 },\n { x: 7.460000000000644e-7, y: -1.9025157358889555 },\n { x: 7.470000000000644e-7, y: -1.9027662637009124 },\n { x: 7.480000000000643e-7, y: -1.8903096975887788 },\n { x: 7.490000000000643e-7, y: -1.9368445605793223 },\n { x: 7.500000000000643e-7, y: -1.9428337523967931 },\n { x: 7.510000000000643e-7, y: -1.936346029040406 },\n { x: 7.520000000000642e-7, y: -1.9660058896932944 },\n { x: 7.530000000000642e-7, y: -1.932559936623179 },\n { x: 7.540000000000642e-7, y: -1.9297911021861553 },\n { x: 7.550000000000641e-7, y: -1.9915597854807727 },\n { x: 7.560000000000641e-7, y: -2.014818577523462 },\n { x: 7.570000000000641e-7, y: -1.9749619284730717 },\n { x: 7.58000000000064e-7, y: -2.03789763369127 },\n { x: 7.59000000000064e-7, y: -2.0606302574813284 },\n { x: 7.60000000000064e-7, y: -2.0183192949514157 },\n { x: 7.61000000000064e-7, y: -2.021015311347985 },\n { x: 7.620000000000639e-7, y: -2.064119354946641 },\n { x: 7.630000000000639e-7, y: -2.055878577480391 },\n { x: 7.640000000000639e-7, y: -2.0962559501724463 },\n { x: 7.650000000000638e-7, y: -2.074018664011004 },\n { x: 7.660000000000638e-7, y: -2.0896436420394227 },\n { x: 7.670000000000638e-7, y: -2.1262724767362506 },\n { x: 7.680000000000637e-7, y: -2.1558803423283965 },\n { x: 7.690000000000637e-7, y: -2.102909108616602 },\n { x: 7.700000000000637e-7, y: -2.1317511337743587 },\n { x: 7.710000000000636e-7, y: -2.1836563851563775 },\n { x: 7.720000000000636e-7, y: -2.1749725226646803 },\n { x: 7.730000000000636e-7, y: -2.1760729330807265 },\n { x: 7.740000000000635e-7, y: -2.190896042494086 },\n { x: 7.750000000000635e-7, y: -2.2001527517103674 },\n { x: 7.760000000000635e-7, y: -2.2130418909331486 },\n { x: 7.770000000000635e-7, y: -2.2063507638943474 },\n { x: 7.780000000000634e-7, y: -2.2138750759696055 },\n { x: 7.790000000000634e-7, y: -2.2805381931239856 },\n { x: 7.800000000000634e-7, y: -2.2475678872158387 },\n { x: 7.810000000000633e-7, y: -2.2911747672325413 },\n { x: 7.820000000000633e-7, y: -2.303093003516833 },\n { x: 7.830000000000633e-7, y: -2.265271656488227 },\n { x: 7.840000000000632e-7, y: -2.2740880148368454 },\n { x: 7.850000000000632e-7, y: -2.297455793799374 },\n { x: 7.860000000000632e-7, y: -2.3071718305399123 },\n { x: 7.870000000000631e-7, y: -2.350588418405074 },\n { x: 7.880000000000631e-7, y: -2.3423590405498755 },\n { x: 7.890000000000631e-7, y: -2.3240151080745206 },\n { x: 7.900000000000631e-7, y: -2.359705796962423 },\n { x: 7.91000000000063e-7, y: -2.354457500939004 },\n { x: 7.92000000000063e-7, y: -2.3478354092748495 },\n { x: 7.93000000000063e-7, y: -2.3639572859735862 },\n { x: 7.940000000000629e-7, y: -2.4226999792401203 },\n { x: 7.950000000000629e-7, y: -2.4340544138076408 },\n { x: 7.960000000000629e-7, y: -2.3780566517382833 },\n { x: 7.970000000000628e-7, y: -2.4401803729827876 },\n { x: 7.980000000000628e-7, y: -2.4416396490411953 },\n { x: 7.990000000000628e-7, y: -2.4150481340956165 },\n { x: 8.000000000000628e-7, y: -2.476867585977726 },\n { x: 8.010000000000627e-7, y: -2.4821380392889196 },\n { x: 8.020000000000627e-7, y: -2.478856400055757 },\n { x: 8.030000000000627e-7, y: -2.4397298613346012 },\n { x: 8.040000000000626e-7, y: -2.476987541618824 },\n { x: 8.050000000000626e-7, y: -2.5020098236123385 },\n { x: 8.060000000000626e-7, y: -2.5023309800132942 },\n { x: 8.070000000000625e-7, y: -2.4829349226243025 },\n { x: 8.080000000000625e-7, y: -2.48777266497422 },\n { x: 8.090000000000625e-7, y: -2.516780384155387 },\n { x: 8.100000000000624e-7, y: -2.5683636204006723 },\n { x: 8.110000000000624e-7, y: -2.5051484995280546 },\n { x: 8.120000000000624e-7, y: -2.536891737016058 },\n { x: 8.130000000000624e-7, y: -2.5821926133444673 },\n { x: 8.140000000000623e-7, y: -2.592726295775674 },\n { x: 8.150000000000623e-7, y: -2.5614830801409627 },\n { x: 8.160000000000623e-7, y: -2.5877184984376673 },\n { x: 8.170000000000622e-7, y: -2.624103466543629 },\n { x: 8.180000000000622e-7, y: -2.6296066009332413 },\n { x: 8.190000000000622e-7, y: -2.6324868648472384 },\n { x: 8.200000000000621e-7, y: -2.5739095207819913 },\n { x: 8.210000000000621e-7, y: -2.6201295189578064 },\n { x: 8.220000000000621e-7, y: -2.6303338441350115 },\n { x: 8.23000000000062e-7, y: -2.6599352916276495 },\n { x: 8.24000000000062e-7, y: -2.626011467845632 },\n { x: 8.25000000000062e-7, y: -2.6313979610589344 },\n { x: 8.26000000000062e-7, y: -2.6629740261037655 },\n { x: 8.270000000000619e-7, y: -2.697810825260525 },\n { x: 8.280000000000619e-7, y: -2.6658295299678554 },\n { x: 8.290000000000619e-7, y: -2.6742804279564716 },\n { x: 8.300000000000618e-7, y: -2.6807843621938443 },\n { x: 8.310000000000618e-7, y: -2.6573315432723406 },\n { x: 8.320000000000618e-7, y: -2.6921605599483027 },\n { x: 8.330000000000617e-7, y: -2.7288213113864463 },\n { x: 8.340000000000617e-7, y: -2.6960210793531414 },\n { x: 8.350000000000617e-7, y: -2.7106273801500063 },\n { x: 8.360000000000616e-7, y: -2.727510157293907 },\n { x: 8.370000000000616e-7, y: -2.7458555303542234 },\n { x: 8.380000000000616e-7, y: -2.7565592316307397 },\n { x: 8.390000000000616e-7, y: -2.7147074559968853 },\n { x: 8.400000000000615e-7, y: -2.7694876935025787 },\n { x: 8.410000000000615e-7, y: -2.7733072099226033 },\n { x: 8.420000000000615e-7, y: -2.765156863431549 },\n { x: 8.430000000000614e-7, y: -2.7935596096657003 },\n { x: 8.440000000000614e-7, y: -2.779273992870829 },\n { x: 8.450000000000614e-7, y: -2.7674261280796415 },\n { x: 8.460000000000613e-7, y: -2.7831101163645715 },\n { x: 8.470000000000613e-7, y: -2.774042874495402 },\n { x: 8.480000000000613e-7, y: -2.803463457161769 },\n { x: 8.490000000000612e-7, y: -2.8076649543308796 },\n { x: 8.500000000000612e-7, y: -2.7694404649729485 },\n { x: 8.510000000000612e-7, y: -2.8296067352378946 },\n { x: 8.520000000000612e-7, y: -2.769812341436803 },\n { x: 8.530000000000611e-7, y: -2.8146911225318347 },\n { x: 8.540000000000611e-7, y: -2.8525571084872783 },\n { x: 8.550000000000611e-7, y: -2.8256074878559265 },\n { x: 8.56000000000061e-7, y: -2.8600933507442807 },\n { x: 8.57000000000061e-7, y: -2.8340954656178448 },\n { x: 8.58000000000061e-7, y: -2.867258517846509 },\n { x: 8.590000000000609e-7, y: -2.8068575537151483 },\n { x: 8.600000000000609e-7, y: -2.844352121689173 },\n { x: 8.610000000000609e-7, y: -2.8103729411780742 },\n { x: 8.620000000000608e-7, y: -2.8303707725193674 },\n { x: 8.630000000000608e-7, y: -2.843702909731462 },\n { x: 8.640000000000608e-7, y: -2.851881329615108 },\n { x: 8.650000000000608e-7, y: -2.898358851690156 },\n { x: 8.660000000000607e-7, y: -2.8313929273326073 },\n { x: 8.670000000000607e-7, y: -2.8619568275718663 },\n { x: 8.680000000000607e-7, y: -2.861704082515166 },\n { x: 8.690000000000606e-7, y: -2.8811073334254798 },\n { x: 8.700000000000606e-7, y: -2.907265338198719 },\n { x: 8.710000000000606e-7, y: -2.917435832811323 },\n { x: 8.720000000000605e-7, y: -2.861558786748291 },\n { x: 8.730000000000605e-7, y: -2.86327001465509 },\n { x: 8.740000000000605e-7, y: -2.884817017631631 },\n { x: 8.750000000000604e-7, y: -2.9298940918946696 },\n { x: 8.760000000000604e-7, y: -2.864957838518482 },\n { x: 8.770000000000604e-7, y: -2.927110684690623 },\n { x: 8.780000000000604e-7, y: -2.8902008230791316 },\n { x: 8.790000000000603e-7, y: -2.893962756214702 },\n { x: 8.800000000000603e-7, y: -2.9198740576200324 },\n { x: 8.810000000000603e-7, y: -2.906364506827804 },\n { x: 8.820000000000602e-7, y: -2.887678919802907 },\n { x: 8.830000000000602e-7, y: -2.9121500491281687 },\n { x: 8.840000000000602e-7, y: -2.8881151683897794 },\n { x: 8.850000000000601e-7, y: -2.936203526782056 },\n { x: 8.860000000000601e-7, y: -2.9487149458330384 },\n { x: 8.870000000000601e-7, y: -2.90595447037774 },\n { x: 8.8800000000006e-7, y: -2.9511577627408454 },\n { x: 8.8900000000006e-7, y: -2.9006731485650006 },\n { x: 8.9000000000006e-7, y: -2.9623864607366417 },\n { x: 8.9100000000006e-7, y: -2.9000158219127186 },\n { x: 8.920000000000599e-7, y: -2.923000395396974 },\n { x: 8.930000000000599e-7, y: -2.902882666001241 },\n { x: 8.940000000000599e-7, y: -2.9324335574470135 },\n { x: 8.950000000000598e-7, y: -2.938467125800375 },\n { x: 8.960000000000598e-7, y: -2.9766601071544376 },\n { x: 8.970000000000598e-7, y: -2.933710734734237 },\n { x: 8.980000000000597e-7, y: -2.9145057164725117 },\n { x: 8.990000000000597e-7, y: -2.9643638343036307 },\n { x: 9.000000000000597e-7, y: -2.9164639646988295 },\n { x: 9.010000000000596e-7, y: -2.9876497192815443 },\n { x: 9.020000000000596e-7, y: -2.9295998551630897 },\n { x: 9.030000000000596e-7, y: -2.916701895305716 },\n { x: 9.040000000000596e-7, y: -2.9828925473422063 },\n { x: 9.050000000000595e-7, y: -2.9667492971059195 },\n { x: 9.060000000000595e-7, y: -2.92511642650399 },\n { x: 9.070000000000595e-7, y: -2.9289609438921507 },\n { x: 9.080000000000594e-7, y: -2.9816225525217552 },\n { x: 9.090000000000594e-7, y: -2.974001745809239 },\n { x: 9.100000000000594e-7, y: -2.9321479890932602 },\n { x: 9.110000000000593e-7, y: -2.950426444382265 },\n { x: 9.120000000000593e-7, y: -2.9634305979357882 },\n { x: 9.130000000000593e-7, y: -2.935744190311045 },\n { x: 9.140000000000592e-7, y: -2.9708324209945234 },\n { x: 9.150000000000592e-7, y: -2.9382075562801813 },\n { x: 9.160000000000592e-7, y: -2.9760690670692176 },\n { x: 9.170000000000592e-7, y: -2.934654682720297 },\n { x: 9.180000000000591e-7, y: -2.962554253049239 },\n { x: 9.190000000000591e-7, y: -2.9491330025216422 },\n { x: 9.200000000000591e-7, y: -2.977843462275971 },\n { x: 9.21000000000059e-7, y: -2.9445779172293016 },\n { x: 9.22000000000059e-7, y: -2.9234494475304182 },\n { x: 9.23000000000059e-7, y: -2.972858739228422 },\n { x: 9.240000000000589e-7, y: -2.958180479195299 },\n { x: 9.250000000000589e-7, y: -2.9779554199935525 },\n { x: 9.260000000000589e-7, y: -2.9386686729792517 },\n { x: 9.270000000000588e-7, y: -2.966382483463096 },\n { x: 9.280000000000588e-7, y: -2.938944489614598 },\n { x: 9.290000000000588e-7, y: -2.9406615434132286 },\n { x: 9.300000000000588e-7, y: -2.9741451418216505 },\n { x: 9.310000000000587e-7, y: -2.91969325268199 },\n { x: 9.320000000000587e-7, y: -2.911391584737342 },\n { x: 9.330000000000587e-7, y: -2.936817823965968 },\n { x: 9.340000000000586e-7, y: -2.9298468914021263 },\n { x: 9.350000000000586e-7, y: -2.9146484371620462 },\n { x: 9.360000000000586e-7, y: -2.9507812555385247 },\n { x: 9.370000000000585e-7, y: -2.9285328472345227 },\n { x: 9.380000000000585e-7, y: -2.936304402803806 },\n { x: 9.390000000000585e-7, y: -2.9406177668531175 },\n { x: 9.400000000000584e-7, y: -2.912230115812706 },\n { x: 9.410000000000584e-7, y: -2.9341140700680257 },\n { x: 9.420000000000584e-7, y: -2.939849444769461 },\n { x: 9.430000000000584e-7, y: -2.91905481188591 },\n { x: 9.440000000000583e-7, y: -2.890618053246819 },\n { x: 9.450000000000583e-7, y: -2.944699657107766 },\n { x: 9.460000000000583e-7, y: -2.918024307776734 },\n { x: 9.470000000000582e-7, y: -2.950891370038067 },\n { x: 9.480000000000582e-7, y: -2.8909417564949136 },\n { x: 9.490000000000582e-7, y: -2.8860180655527716 },\n { x: 9.500000000000581e-7, y: -2.921838871508459 },\n { x: 9.510000000000581e-7, y: -2.93150866038216 },\n { x: 9.520000000000581e-7, y: -2.8965571678094175 },\n { x: 9.53000000000058e-7, y: -2.88527824009263 },\n { x: 9.540000000000581e-7, y: -2.9004925579372736 },\n { x: 9.550000000000582e-7, y: -2.8619863546464517 },\n { x: 9.560000000000583e-7, y: -2.874137257214041 },\n { x: 9.570000000000583e-7, y: -2.8552102483960966 },\n { x: 9.580000000000584e-7, y: -2.8786915156360866 },\n { x: 9.590000000000585e-7, y: -2.8568495436065464 },\n { x: 9.600000000000586e-7, y: -2.8911457219041163 },\n { x: 9.610000000000586e-7, y: -2.9049199006203055 },\n { x: 9.620000000000587e-7, y: -2.870753698210861 },\n { x: 9.630000000000588e-7, y: -2.8640630016241126 },\n { x: 9.640000000000589e-7, y: -2.83726716564893 },\n { x: 9.65000000000059e-7, y: -2.8314638129994814 },\n { x: 9.66000000000059e-7, y: -2.85247264605437 },\n { x: 9.67000000000059e-7, y: -2.8673165364236834 },\n { x: 9.680000000000592e-7, y: -2.8406045706033933 },\n { x: 9.690000000000592e-7, y: -2.8219753606363853 },\n { x: 9.700000000000593e-7, y: -2.825899372369524 },\n { x: 9.710000000000594e-7, y: -2.8493359555856745 },\n { x: 9.720000000000595e-7, y: -2.862735020921013 },\n { x: 9.730000000000595e-7, y: -2.8307770007251682 },\n { x: 9.740000000000596e-7, y: -2.8221561577794527 },\n { x: 9.750000000000597e-7, y: -2.811385901066925 },\n { x: 9.760000000000598e-7, y: -2.827662881343826 },\n { x: 9.770000000000598e-7, y: -2.7965472829768863 },\n { x: 9.7800000000006e-7, y: -2.788428858190958 },\n { x: 9.7900000000006e-7, y: -2.8441734932241953 },\n { x: 9.8000000000006e-7, y: -2.781833981692926 },\n { x: 9.810000000000601e-7, y: -2.8308549346264558 },\n { x: 9.820000000000602e-7, y: -2.756527743948133 },\n { x: 9.830000000000603e-7, y: -2.785222528151875 },\n { x: 9.840000000000604e-7, y: -2.776646677900193 },\n { x: 9.850000000000604e-7, y: -2.7864867204481785 },\n { x: 9.860000000000605e-7, y: -2.761534793534902 },\n { x: 9.870000000000606e-7, y: -2.7818643010825195 },\n { x: 9.880000000000607e-7, y: -2.728761254626916 },\n { x: 9.890000000000607e-7, y: -2.7783140884864883 },\n { x: 9.900000000000608e-7, y: -2.7577191444065225 },\n { x: 9.91000000000061e-7, y: -2.7441047180763793 },\n { x: 9.92000000000061e-7, y: -2.7712962077121355 },\n { x: 9.93000000000061e-7, y: -2.7138091703923664 },\n { x: 9.940000000000611e-7, y: -2.727822159791245 },\n { x: 9.950000000000612e-7, y: -2.69583323562765 },\n { x: 9.960000000000613e-7, y: -2.689606324034795 },\n { x: 9.970000000000614e-7, y: -2.7217491913539376 },\n { x: 9.980000000000614e-7, y: -2.743696201740999 },\n { x: 9.990000000000615e-7, y: -2.729230444301794 },\n { x: 0.0000010000000000000616, y: -2.7002798704252844 },\n { x: 0.0000010010000000000617, y: -2.6964244573508234 },\n { x: 0.0000010020000000000617, y: -2.6954973390823227 },\n { x: 0.0000010030000000000618, y: -2.6742057473662912 },\n { x: 0.0000010040000000000619, y: -2.6869155896835677 },\n { x: 0.000001005000000000062, y: -2.649006202055302 },\n { x: 0.000001006000000000062, y: -2.640016436732289 },\n { x: 0.000001007000000000062, y: -2.6697346018535293 },\n { x: 0.0000010080000000000622, y: -2.6537247452612447 },\n { x: 0.0000010090000000000623, y: -2.6679345916532102 },\n { x: 0.0000010100000000000623, y: -2.653369421210141 },\n { x: 0.0000010110000000000624, y: -2.630046484330408 },\n { x: 0.0000010120000000000625, y: -2.6395439276650956 },\n { x: 0.0000010130000000000626, y: -2.5997301407613 },\n { x: 0.0000010140000000000626, y: -2.6461432860301484 },\n { x: 0.0000010150000000000627, y: -2.6005733095703407 },\n { x: 0.0000010160000000000628, y: -2.6159512628906043 },\n { x: 0.0000010170000000000629, y: -2.624265547470855 },\n { x: 0.000001018000000000063, y: -2.5571658136794873 },\n { x: 0.000001019000000000063, y: -2.5881990309651273 },\n { x: 0.000001020000000000063, y: -2.5541298055449206 },\n { x: 0.0000010210000000000632, y: -2.5377863986711326 },\n { x: 0.0000010220000000000632, y: -2.5489555611229613 },\n { x: 0.0000010230000000000633, y: -2.55538817619838 },\n { x: 0.0000010240000000000634, y: -2.5766401792970512 },\n { x: 0.0000010250000000000635, y: -2.5148417592349763 },\n { x: 0.0000010260000000000635, y: -2.5472709907113376 },\n { x: 0.0000010270000000000636, y: -2.53825638260045 },\n { x: 0.0000010280000000000637, y: -2.477190922886537 },\n { x: 0.0000010290000000000638, y: -2.514066980046247 },\n { x: 0.0000010300000000000638, y: -2.493761840639996 },\n { x: 0.000001031000000000064, y: -2.5185998181291867 },\n { x: 0.000001032000000000064, y: -2.4913912816660093 },\n { x: 0.000001033000000000064, y: -2.4796168646922 },\n { x: 0.0000010340000000000641, y: -2.4796530303501654 },\n { x: 0.0000010350000000000642, y: -2.45121270551031 },\n { x: 0.0000010360000000000643, y: -2.443976954176379 },\n { x: 0.0000010370000000000644, y: -2.4317250425826327 },\n { x: 0.0000010380000000000644, y: -2.4201043484104785 },\n { x: 0.0000010390000000000645, y: -2.433336170259666 },\n { x: 0.0000010400000000000646, y: -2.441347548251501 },\n { x: 0.0000010410000000000647, y: -2.414508312110115 },\n { x: 0.0000010420000000000647, y: -2.4232681901616275 },\n { x: 0.0000010430000000000648, y: -2.423133440182755 },\n { x: 0.0000010440000000000649, y: -2.412656817214131 },\n { x: 0.000001045000000000065, y: -2.405672474450974 },\n { x: 0.000001046000000000065, y: -2.357864832330612 },\n { x: 0.0000010470000000000651, y: -2.3617701422918778 },\n { x: 0.0000010480000000000652, y: -2.347781376983625 },\n { x: 0.0000010490000000000653, y: -2.316753906684353 },\n { x: 0.0000010500000000000653, y: -2.322605217392935 },\n { x: 0.0000010510000000000654, y: -2.3441096488564686 },\n { x: 0.0000010520000000000655, y: -2.282898132491534 },\n { x: 0.0000010530000000000656, y: -2.3069435747675358 },\n { x: 0.0000010540000000000656, y: -2.318574656384435 },\n { x: 0.0000010550000000000657, y: -2.257501230828061 },\n { x: 0.0000010560000000000658, y: -2.2976754936359938 },\n { x: 0.0000010570000000000659, y: -2.28231706183603 },\n { x: 0.000001058000000000066, y: -2.2518844643742533 },\n { x: 0.000001059000000000066, y: -2.245637829959301 },\n { x: 0.000001060000000000066, y: -2.259457696194272 },\n { x: 0.0000010610000000000662, y: -2.2674896557086104 },\n { x: 0.0000010620000000000662, y: -2.25567170796724 },\n { x: 0.0000010630000000000663, y: -2.2259857569530386 },\n { x: 0.0000010640000000000664, y: -2.2064798980754188 },\n { x: 0.0000010650000000000665, y: -2.2215357721999207 },\n { x: 0.0000010660000000000665, y: -2.191990560473061 },\n { x: 0.0000010670000000000666, y: -2.1539329033220675 },\n { x: 0.0000010680000000000667, y: -2.160942247206046 },\n { x: 0.0000010690000000000668, y: -2.143769437596853 },\n { x: 0.0000010700000000000668, y: -2.167421585790664 },\n { x: 0.000001071000000000067, y: -2.131279970759539 },\n { x: 0.000001072000000000067, y: -2.1347397373950034 },\n { x: 0.000001073000000000067, y: -2.0866999139614575 },\n { x: 0.0000010740000000000671, y: -2.1183001384603597 },\n { x: 0.0000010750000000000672, y: -2.086334409698115 },\n { x: 0.0000010760000000000673, y: -2.0593984409407717 },\n { x: 0.0000010770000000000674, y: -2.1063244124424423 },\n { x: 0.0000010780000000000674, y: -2.08836151917355 },\n { x: 0.0000010790000000000675, y: -2.1015081560595226 },\n { x: 0.0000010800000000000676, y: -2.024749987916138 },\n { x: 0.0000010810000000000677, y: -2.040732752230928 },\n { x: 0.0000010820000000000677, y: -2.046168870436642 },\n { x: 0.0000010830000000000678, y: -2.0525018649358757 },\n { x: 0.0000010840000000000679, y: -2.0375303832587295 },\n { x: 0.000001085000000000068, y: -2.0120983798446193 },\n { x: 0.000001086000000000068, y: -1.9960215496681246 },\n { x: 0.0000010870000000000681, y: -1.9739055525154958 },\n { x: 0.0000010880000000000682, y: -1.9884229978218901 },\n { x: 0.0000010890000000000683, y: -1.9959712954910505 },\n { x: 0.0000010900000000000683, y: -1.9350623037016246 },\n { x: 0.0000010910000000000684, y: -1.9279924609968988 },\n { x: 0.0000010920000000000685, y: -1.9083889185898628 },\n { x: 0.0000010930000000000686, y: -1.9107646279557768 },\n { x: 0.0000010940000000000686, y: -1.9235896904213654 },\n { x: 0.0000010950000000000687, y: -1.9077264580747624 },\n { x: 0.0000010960000000000688, y: -1.8587589590236497 },\n { x: 0.0000010970000000000689, y: -1.876597786919901 },\n { x: 0.000001098000000000069, y: -1.8700217459328776 },\n { x: 0.000001099000000000069, y: -1.847740190818427 },\n { x: 0.000001100000000000069, y: -1.835527592526767 },\n { x: 0.0000011010000000000692, y: -1.8290841453361617 },\n { x: 0.0000011020000000000692, y: -1.8089095363694432 },\n { x: 0.0000011030000000000693, y: -1.8190969867635092 },\n { x: 0.0000011040000000000694, y: -1.8092723319865567 },\n { x: 0.0000011050000000000695, y: -1.801222425563087 },\n { x: 0.0000011060000000000695, y: -1.7679683199942404 },\n { x: 0.0000011070000000000696, y: -1.7700883442195483 },\n { x: 0.0000011080000000000697, y: -1.7470404177486727 },\n { x: 0.0000011090000000000698, y: -1.7419412927283844 },\n { x: 0.0000011100000000000698, y: -1.708243658522816 },\n { x: 0.00000111100000000007, y: -1.70685823692574 },\n { x: 0.00000111200000000007, y: -1.6920185647394441 },\n { x: 0.00000111300000000007, y: -1.69210557753839 },\n { x: 0.0000011140000000000701, y: -1.724796033691692 },\n { x: 0.0000011150000000000702, y: -1.7016664205042438 },\n { x: 0.0000011160000000000703, y: -1.705493665671974 },\n { x: 0.0000011170000000000704, y: -1.6578417283905895 },\n { x: 0.0000011180000000000704, y: -1.6802684355063802 },\n { x: 0.0000011190000000000705, y: -1.606026575642993 },\n { x: 0.0000011200000000000706, y: -1.6227450046947103 },\n { x: 0.0000011210000000000707, y: -1.6136834614352478 },\n { x: 0.0000011220000000000707, y: -1.5803592168441492 },\n { x: 0.0000011230000000000708, y: -1.6110596917648399 },\n { x: 0.0000011240000000000709, y: -1.5671805813681838 },\n { x: 0.000001125000000000071, y: -1.57329435918908 },\n { x: 0.000001126000000000071, y: -1.5795922254455512 },\n { x: 0.0000011270000000000711, y: -1.5538408168409483 },\n { x: 0.0000011280000000000712, y: -1.5374636303586313 },\n { x: 0.0000011290000000000713, y: -1.5676948153395773 },\n { x: 0.0000011300000000000713, y: -1.5110600731112371 },\n { x: 0.0000011310000000000714, y: -1.470305290533936 },\n { x: 0.0000011320000000000715, y: -1.471230750920955 },\n { x: 0.0000011330000000000716, y: -1.4820692543786587 },\n { x: 0.0000011340000000000716, y: -1.4874962478150864 },\n { x: 0.0000011350000000000717, y: -1.4578597809457159 },\n { x: 0.0000011360000000000718, y: -1.4215625375059417 },\n { x: 0.0000011370000000000719, y: -1.4616946552057766 },\n { x: 0.000001138000000000072, y: -1.4345160952785518 },\n { x: 0.000001139000000000072, y: -1.4214127328720212 },\n { x: 0.000001140000000000072, y: -1.436569048731919 },\n { x: 0.0000011410000000000722, y: -1.415868722476098 },\n { x: 0.0000011420000000000722, y: -1.3726439914739348 },\n { x: 0.0000011430000000000723, y: -1.3927190972834356 },\n { x: 0.0000011440000000000724, y: -1.3572754080466038 },\n { x: 0.0000011450000000000725, y: -1.3176891264423618 },\n { x: 0.0000011460000000000725, y: -1.297536940448045 },\n { x: 0.0000011470000000000726, y: -1.3534486267580776 },\n { x: 0.0000011480000000000727, y: -1.3453498940426343 },\n { x: 0.0000011490000000000728, y: -1.2937255429648007 },\n { x: 0.0000011500000000000728, y: -1.249173294768944 },\n { x: 0.000001151000000000073, y: -1.2855758420136414 },\n { x: 0.000001152000000000073, y: -1.2878233524132527 },\n { x: 0.000001153000000000073, y: -1.2238746184687883 },\n { x: 0.0000011540000000000731, y: -1.2261625076650529 },\n { x: 0.0000011550000000000732, y: -1.2244442063236738 },\n { x: 0.0000011560000000000733, y: -1.1797882988974489 },\n { x: 0.0000011570000000000734, y: -1.1649731253785105 },\n { x: 0.0000011580000000000734, y: -1.1768275453401826 },\n { x: 0.0000011590000000000735, y: -1.1908915651711174 },\n { x: 0.0000011600000000000736, y: -1.163447905914741 },\n { x: 0.0000011610000000000737, y: -1.121123721260343 },\n { x: 0.0000011620000000000737, y: -1.143009576913168 },\n { x: 0.0000011630000000000738, y: -1.1552731558038924 },\n { x: 0.000001164000000000074, y: -1.0996497605933475 },\n { x: 0.000001165000000000074, y: -1.0931065759246417 },\n { x: 0.000001166000000000074, y: -1.0637961552040398 },\n { x: 0.0000011670000000000741, y: -1.0959283508828057 },\n { x: 0.0000011680000000000742, y: -1.0890231453497359 },\n { x: 0.0000011690000000000743, y: -1.0782191801027068 },\n { x: 0.0000011700000000000743, y: -1.0132884475994262 },\n { x: 0.0000011710000000000744, y: -1.0020973860822264 },\n { x: 0.0000011720000000000745, y: -1.0241218334285882 },\n { x: 0.0000011730000000000746, y: -1.0031357856720269 },\n { x: 0.0000011740000000000746, y: -1.005636247241965 },\n { x: 0.0000011750000000000747, y: -0.9925000750270289 },\n { x: 0.0000011760000000000748, y: -0.9610862456471924 },\n { x: 0.0000011770000000000749, y: -0.9556779325141588 },\n { x: 0.000001178000000000075, y: -0.9358322265882817 },\n { x: 0.000001179000000000075, y: -0.9042068481365282 },\n { x: 0.000001180000000000075, y: -0.9441361447165949 },\n { x: 0.0000011810000000000752, y: -0.9252952984481573 },\n { x: 0.0000011820000000000752, y: -0.9000672065787889 },\n { x: 0.0000011830000000000753, y: -0.9283057383199305 },\n { x: 0.0000011840000000000754, y: -0.8774893554451562 },\n { x: 0.0000011850000000000755, y: -0.8529084046226574 },\n { x: 0.0000011860000000000756, y: -0.8624063515743335 },\n { x: 0.0000011870000000000756, y: -0.8167009109674965 },\n { x: 0.0000011880000000000757, y: -0.8043248337208095 },\n { x: 0.0000011890000000000758, y: -0.8501223406799542 },\n { x: 0.0000011900000000000759, y: -0.798174663748855 },\n { x: 0.000001191000000000076, y: -0.809421445655857 },\n { x: 0.000001192000000000076, y: -0.7811664379641953 },\n { x: 0.000001193000000000076, y: -0.7331741766129248 },\n { x: 0.0000011940000000000762, y: -0.7678636008900854 },\n { x: 0.0000011950000000000762, y: -0.7291745382612629 },\n { x: 0.0000011960000000000763, y: -0.7064243017579349 },\n { x: 0.0000011970000000000764, y: -0.7314566866982875 },\n { x: 0.0000011980000000000765, y: -0.6736269281284476 },\n { x: 0.0000011990000000000765, y: -0.6961430607322345 },\n { x: 0.0000012000000000000766, y: -0.6760020006353963 },\n { x: 0.0000012010000000000767, y: -0.6603962886061162 },\n { x: 0.0000012020000000000768, y: -0.6216122377675556 },\n { x: 0.0000012030000000000768, y: -0.6699811922803657 },\n { x: 0.000001204000000000077, y: -0.6072391978108935 },\n { x: 0.000001205000000000077, y: -0.6471095886886495 },\n { x: 0.000001206000000000077, y: -0.6214786900756055 },\n { x: 0.0000012070000000000771, y: -0.6032581063776964 },\n { x: 0.0000012080000000000772, y: -0.5660881860970816 },\n { x: 0.0000012090000000000773, y: -0.604502355070154 },\n { x: 0.0000012100000000000774, y: -0.5349529258666671 },\n { x: 0.0000012110000000000774, y: -0.5718732660477731 },\n { x: 0.0000012120000000000775, y: -0.541292351736929 },\n { x: 0.0000012130000000000776, y: -0.553317931937487 },\n { x: 0.0000012140000000000777, y: -0.5211680273101764 },\n { x: 0.0000012150000000000777, y: -0.47399143437207375 },\n { x: 0.0000012160000000000778, y: -0.47197657428818074 },\n { x: 0.0000012170000000000779, y: -0.4536771160107145 },\n { x: 0.000001218000000000078, y: -0.43356801949054585 },\n { x: 0.000001219000000000078, y: -0.4860261910727052 },\n { x: 0.000001220000000000078, y: -0.412817153510327 },\n { x: 0.0000012210000000000782, y: -0.39299964123401604 },\n { x: 0.0000012220000000000783, y: -0.4148650599048196 },\n { x: 0.0000012230000000000783, y: -0.4402037779506115 },\n { x: 0.0000012240000000000784, y: -0.3566532499659609 },\n { x: 0.0000012250000000000785, y: -0.40529459829099734 },\n { x: 0.0000012260000000000786, y: -0.35570858729529825 },\n { x: 0.0000012270000000000786, y: -0.3563409633429071 },\n { x: 0.0000012280000000000787, y: -0.33188067469457133 },\n { x: 0.0000012290000000000788, y: -0.3499667793908304 },\n { x: 0.0000012300000000000789, y: -0.2954163264402897 },\n { x: 0.000001231000000000079, y: -0.30286059381414276 },\n { x: 0.000001232000000000079, y: -0.3151707751191381 },\n { x: 0.000001233000000000079, y: -0.29108939715095333 },\n { x: 0.0000012340000000000792, y: -0.27181700370963724 },\n { x: 0.0000012350000000000792, y: -0.27799890978536135 },\n { x: 0.0000012360000000000793, y: -0.2385474349092482 },\n { x: 0.0000012370000000000794, y: -0.2586020325902714 },\n { x: 0.0000012380000000000795, y: -0.22536500423236583 },\n { x: 0.0000012390000000000795, y: -0.20183827100993776 },\n { x: 0.0000012400000000000796, y: -0.23010071703753565 },\n { x: 0.0000012410000000000797, y: -0.16503036288459788 },\n { x: 0.0000012420000000000798, y: -0.1566256961757913 },\n { x: 0.0000012430000000000798, y: -0.18521100261754386 },\n { x: 0.00000124400000000008, y: -0.12747842038671897 },\n { x: 0.00000124500000000008, y: -0.14309280125545476 },\n { x: 0.00000124600000000008, y: -0.13100474583539598 },\n { x: 0.0000012470000000000801, y: -0.10405612830352308 },\n { x: 0.0000012480000000000802, y: -0.06832324024087069 },\n { x: 0.0000012490000000000803, y: -0.0656382549619924 },\n { x: 0.0000012500000000000804, y: -0.10622065014561533 },\n { x: 0.0000012510000000000804, y: -0.07044054202811087 },\n { x: 0.0000012520000000000805, y: -0.04262569001602948 },\n { x: 0.0000012530000000000806, y: -0.006892326022809522 },\n { x: 0.0000012540000000000807, y: -0.044470199050654004 },\n { x: 0.0000012550000000000807, y: -0.0404008740530935 },\n { x: 0.0000012560000000000808, y: 0.0222345762679733 },\n { x: 0.0000012570000000000809, y: 0.014272908557915614 },\n { x: 0.000001258000000000081, y: 0.00955292527263679 },\n { x: 0.000001259000000000081, y: 0.018943398024962442 },\n { x: 0.0000012600000000000811, y: 0.04591799795923668 },\n { x: 0.0000012610000000000812, y: 0.06177106106287698 },\n { x: 0.0000012620000000000813, y: 0.06156218253302007 },\n { x: 0.0000012630000000000813, y: 0.09901423986690978 },\n { x: 0.0000012640000000000814, y: 0.07718737983512958 },\n { x: 0.0000012650000000000815, y: 0.11499187693592912 },\n { x: 0.0000012660000000000816, y: 0.09838870921516399 },\n { x: 0.0000012670000000000816, y: 0.0840379348728896 },\n { x: 0.0000012680000000000817, y: 0.13633526308057603 },\n { x: 0.0000012690000000000818, y: 0.1505639064186107 },\n { x: 0.0000012700000000000819, y: 0.18636304009074428 },\n { x: 0.000001271000000000082, y: 0.16631802517142183 },\n { x: 0.000001272000000000082, y: 0.14394172167609634 },\n { x: 0.000001273000000000082, y: 0.1847688995852056 },\n { x: 0.0000012740000000000822, y: 0.16418411574793573 },\n { x: 0.0000012750000000000822, y: 0.23999062672305949 },\n { x: 0.0000012760000000000823, y: 0.19295812425074416 },\n { x: 0.0000012770000000000824, y: 0.21590498380700832 },\n { x: 0.0000012780000000000825, y: 0.2727873035990194 },\n { x: 0.0000012790000000000825, y: 0.28807061637346115 },\n { x: 0.0000012800000000000826, y: 0.29462033681088584 },\n { x: 0.0000012810000000000827, y: 0.25129915397047126 },\n { x: 0.0000012820000000000828, y: 0.28442262840447213 },\n { x: 0.0000012830000000000828, y: 0.2802008382995984 },\n { x: 0.000001284000000000083, y: 0.2795953427073829 },\n { x: 0.000001285000000000083, y: 0.32248646722251306 },\n { x: 0.000001286000000000083, y: 0.34498547257461015 },\n { x: 0.0000012870000000000831, y: 0.3754367286864585 },\n { x: 0.0000012880000000000832, y: 0.3549892102190534 },\n { x: 0.0000012890000000000833, y: 0.3556622432894077 },\n { x: 0.0000012900000000000834, y: 0.40761037666177297 },\n { x: 0.0000012910000000000834, y: 0.3934519898280681 },\n { x: 0.0000012920000000000835, y: 0.3993731625146763 },\n { x: 0.0000012930000000000836, y: 0.4145989997553983 },\n { x: 0.0000012940000000000837, y: 0.428242236157867 },\n { x: 0.0000012950000000000837, y: 0.4394479597005514 },\n { x: 0.0000012960000000000838, y: 0.41697021752229857 },\n { x: 0.0000012970000000000839, y: 0.4321021747935018 },\n { x: 0.000001298000000000084, y: 0.4991021558247655 },\n { x: 0.000001299000000000084, y: 0.4841753180139331 },\n { x: 0.0000013000000000000841, y: 0.5024118956639743 },\n { x: 0.0000013010000000000842, y: 0.49777540379003915 },\n { x: 0.0000013020000000000843, y: 0.4993041830210104 },\n { x: 0.0000013030000000000843, y: 0.5555349732401625 },\n { x: 0.0000013040000000000844, y: 0.5629492248583431 },\n { x: 0.0000013050000000000845, y: 0.511170676531255 },\n { x: 0.0000013060000000000846, y: 0.5296936284835054 },\n { x: 0.0000013070000000000846, y: 0.5758686488334313 },\n { x: 0.0000013080000000000847, y: 0.5944288869939841 },\n { x: 0.0000013090000000000848, y: 0.5580989997058687 },\n { x: 0.0000013100000000000849, y: 0.5729570099495459 },\n { x: 0.000001311000000000085, y: 0.5756725686316552 },\n { x: 0.000001312000000000085, y: 0.6435082364409714 },\n { x: 0.000001313000000000085, y: 0.5918370644555717 },\n { x: 0.0000013140000000000852, y: 0.6155246551318653 },\n { x: 0.0000013150000000000852, y: 0.6624536182221034 },\n { x: 0.0000013160000000000853, y: 0.67987383385797 },\n { x: 0.0000013170000000000854, y: 0.6929630847664733 },\n { x: 0.0000013180000000000855, y: 0.6660665077125373 },\n { x: 0.0000013190000000000855, y: 0.7096574334175468 },\n { x: 0.0000013200000000000856, y: 0.7267585634672878 },\n { x: 0.0000013210000000000857, y: 0.7099257982334164 },\n { x: 0.0000013220000000000858, y: 0.7349264148641211 },\n { x: 0.0000013230000000000858, y: 0.7690448908074996 },\n { x: 0.000001324000000000086, y: 0.7534382474070918 },\n { x: 0.000001325000000000086, y: 0.7644049030276735 },\n { x: 0.000001326000000000086, y: 0.7467587676806047 },\n { x: 0.0000013270000000000861, y: 0.7669818111777716 },\n { x: 0.0000013280000000000862, y: 0.7988575614807502 },\n { x: 0.0000013290000000000863, y: 0.7831882572233348 },\n { x: 0.0000013300000000000864, y: 0.8365998374971845 },\n { x: 0.0000013310000000000864, y: 0.7781463160569243 },\n { x: 0.0000013320000000000865, y: 0.7899770842862761 },\n { x: 0.0000013330000000000866, y: 0.8006550736377733 },\n { x: 0.0000013340000000000867, y: 0.9002449346568221 },\n { x: 0.0000013350000000000867, y: 0.8632371565230259 },\n { x: 0.0000013360000000000868, y: 0.8861729766886234 },\n { x: 0.000001337000000000087, y: 0.847276070381745 },\n { x: 0.000001338000000000087, y: 0.9127517184353817 },\n { x: 0.000001339000000000087, y: 0.8534266188437545 },\n { x: 0.0000013400000000000871, y: 0.8823190628769446 },\n { x: 0.0000013410000000000872, y: 0.9112271670028148 },\n { x: 0.0000013420000000000873, y: 0.8867842855047384 },\n { x: 0.0000013430000000000873, y: 0.9322336072203685 },\n { x: 0.0000013440000000000874, y: 0.9252305587856131 },\n { x: 0.0000013450000000000875, y: 0.9080531556699117 },\n { x: 0.0000013460000000000876, y: 0.9592728298584061 },\n { x: 0.0000013470000000000876, y: 0.9537044931110791 },\n { x: 0.0000013480000000000877, y: 0.9763400143931343 },\n { x: 0.0000013490000000000878, y: 0.9778785299230038 },\n { x: 0.0000013500000000000879, y: 1.02335388029879 },\n { x: 0.000001351000000000088, y: 1.0301951965852265 },\n { x: 0.000001352000000000088, y: 1.0049752184771101 },\n { x: 0.000001353000000000088, y: 1.0207330574280284 },\n { x: 0.0000013540000000000882, y: 1.0604016122403743 },\n { x: 0.0000013550000000000882, y: 1.0763512845981638 },\n { x: 0.0000013560000000000883, y: 1.0081616297784155 },\n { x: 0.0000013570000000000884, y: 1.0601639039079285 },\n { x: 0.0000013580000000000885, y: 1.037881172538787 },\n { x: 0.0000013590000000000885, y: 1.0947889707438094 },\n { x: 0.0000013600000000000886, y: 1.0638148734476056 },\n { x: 0.0000013610000000000887, y: 1.109269641128165 },\n { x: 0.0000013620000000000888, y: 1.131991477205069 },\n { x: 0.0000013630000000000888, y: 1.0809993260950888 },\n { x: 0.000001364000000000089, y: 1.1406593859177832 },\n { x: 0.000001365000000000089, y: 1.1022940906732164 },\n { x: 0.000001366000000000089, y: 1.109503884727809 },\n { x: 0.0000013670000000000891, y: 1.1530727818792175 },\n { x: 0.0000013680000000000892, y: 1.1201052726299028 },\n { x: 0.0000013690000000000893, y: 1.1848508584439053 },\n { x: 0.0000013700000000000894, y: 1.1393971861846335 },\n { x: 0.0000013710000000000894, y: 1.1868523171957746 },\n { x: 0.0000013720000000000895, y: 1.1927822129675518 },\n { x: 0.0000013730000000000896, y: 1.2262264561900362 },\n { x: 0.0000013740000000000897, y: 1.2145199307800636 },\n { x: 0.0000013750000000000897, y: 1.1865584481971507 },\n { x: 0.0000013760000000000898, y: 1.24932341609842 },\n { x: 0.00000137700000000009, y: 1.2289433580721276 },\n { x: 0.00000137800000000009, y: 1.233498062275379 },\n { x: 0.00000137900000000009, y: 1.2013012874965872 },\n { x: 0.0000013800000000000901, y: 1.2541024503936453 },\n { x: 0.0000013810000000000902, y: 1.260847737848186 },\n { x: 0.0000013820000000000903, y: 1.2540716847222866 },\n { x: 0.0000013830000000000904, y: 1.253580933646218 },\n { x: 0.0000013840000000000904, y: 1.2977099253491804 },\n { x: 0.0000013850000000000905, y: 1.3042756904890374 },\n { x: 0.0000013860000000000906, y: 1.3102778099058368 },\n { x: 0.0000013870000000000907, y: 1.3079842329637883 },\n { x: 0.0000013880000000000907, y: 1.279246923386455 },\n { x: 0.0000013890000000000908, y: 1.3240327335338125 },\n { x: 0.0000013900000000000909, y: 1.3052053262606482 },\n { x: 0.000001391000000000091, y: 1.3420997940341681 },\n { x: 0.000001392000000000091, y: 1.3175633048625737 },\n { x: 0.000001393000000000091, y: 1.3319689879743344 },\n { x: 0.0000013940000000000912, y: 1.3243179210992126 },\n { x: 0.0000013950000000000913, y: 1.3305423519846902 },\n { x: 0.0000013960000000000913, y: 1.3470543963602295 },\n { x: 0.0000013970000000000914, y: 1.3453053583704047 },\n { x: 0.0000013980000000000915, y: 1.3985414163076368 },\n { x: 0.0000013990000000000916, y: 1.3523447467162584 },\n { x: 0.0000014000000000000916, y: 1.4175969014857355 },\n { x: 0.0000014010000000000917, y: 1.422805794341122 },\n { x: 0.0000014020000000000918, y: 1.3827020373009486 },\n { x: 0.0000014030000000000919, y: 1.419026855558873 },\n { x: 0.000001404000000000092, y: 1.4474092185770062 },\n { x: 0.000001405000000000092, y: 1.4336613275978254 },\n { x: 0.000001406000000000092, y: 1.435761775780304 },\n { x: 0.0000014070000000000922, y: 1.479037987164875 },\n { x: 0.0000014080000000000922, y: 1.4204867184247094 },\n { x: 0.0000014090000000000923, y: 1.4253652526048908 },\n { x: 0.0000014100000000000924, y: 1.4825068358351217 },\n { x: 0.0000014110000000000925, y: 1.4625566089324982 },\n { x: 0.0000014120000000000925, y: 1.44479121833187 },\n { x: 0.0000014130000000000926, y: 1.490633320624915 },\n { x: 0.0000014140000000000927, y: 1.4571191809168724 },\n { x: 0.0000014150000000000928, y: 1.479070756508637 },\n { x: 0.0000014160000000000928, y: 1.47201571523662 },\n { x: 0.000001417000000000093, y: 1.5089304910268952 },\n { x: 0.000001418000000000093, y: 1.5016359101324117 },\n { x: 0.000001419000000000093, y: 1.5402289028349656 },\n { x: 0.0000014200000000000931, y: 1.4996123374523933 },\n { x: 0.0000014210000000000932, y: 1.5390983947862773 },\n { x: 0.0000014220000000000933, y: 1.573380257701024 },\n { x: 0.0000014230000000000934, y: 1.545228658728816 },\n { x: 0.0000014240000000000934, y: 1.5182315898604775 },\n { x: 0.0000014250000000000935, y: 1.5288565986743126 },\n { x: 0.0000014260000000000936, y: 1.550765932220956 },\n { x: 0.0000014270000000000937, y: 1.539844056031576 },\n { x: 0.0000014280000000000937, y: 1.6072188955842586 },\n { x: 0.0000014290000000000938, y: 1.5637666683921325 },\n { x: 0.0000014300000000000939, y: 1.5926528672933669 },\n { x: 0.000001431000000000094, y: 1.6006688884094726 },\n { x: 0.000001432000000000094, y: 1.5808575980645503 },\n { x: 0.0000014330000000000941, y: 1.5818714452269909 },\n { x: 0.0000014340000000000942, y: 1.6104324510826464 },\n { x: 0.0000014350000000000943, y: 1.6109894062563763 },\n { x: 0.0000014360000000000943, y: 1.613775566543623 },\n { x: 0.0000014370000000000944, y: 1.5879502582947922 },\n { x: 0.0000014380000000000945, y: 1.6509233363230875 },\n { x: 0.0000014390000000000946, y: 1.666832074364236 },\n { x: 0.0000014400000000000946, y: 1.617697621024788 },\n { x: 0.0000014410000000000947, y: 1.6215467511000008 },\n { x: 0.0000014420000000000948, y: 1.6350247530000641 },\n { x: 0.0000014430000000000949, y: 1.6573130899160686 },\n { x: 0.000001444000000000095, y: 1.6472290993325687 },\n { x: 0.000001445000000000095, y: 1.6528361255604989 },\n { x: 0.000001446000000000095, y: 1.6752075728222795 },\n { x: 0.0000014470000000000952, y: 1.6604596065985828 },\n { x: 0.0000014480000000000952, y: 1.7174934450483135 },\n { x: 0.0000014490000000000953, y: 1.7151268639704775 },\n { x: 0.0000014500000000000954, y: 1.6774700480466092 },\n { x: 0.0000014510000000000955, y: 1.6605459562773377 },\n { x: 0.0000014520000000000955, y: 1.6631179816046038 },\n { x: 0.0000014530000000000956, y: 1.6734516272150848 },\n { x: 0.0000014540000000000957, y: 1.7057702302492914 },\n { x: 0.0000014550000000000958, y: 1.714602100117394 },\n { x: 0.0000014560000000000958, y: 1.7032063357622889 },\n { x: 0.000001457000000000096, y: 1.6828565751266131 },\n { x: 0.000001458000000000096, y: 1.7074587889390729 },\n { x: 0.000001459000000000096, y: 1.717877649452109 },\n { x: 0.0000014600000000000961, y: 1.7574421897984218 },\n { x: 0.0000014610000000000962, y: 1.7141339602267018 },\n { x: 0.0000014620000000000963, y: 1.7666450413502615 },\n { x: 0.0000014630000000000964, y: 1.7666094454459231 },\n { x: 0.0000014640000000000964, y: 1.7846373614348021 },\n { x: 0.0000014650000000000965, y: 1.7216312395800037 },\n { x: 0.0000014660000000000966, y: 1.7478189309272825 },\n { x: 0.0000014670000000000967, y: 1.7536177757822449 },\n { x: 0.0000014680000000000967, y: 1.7635447863280753 },\n { x: 0.0000014690000000000968, y: 1.7814573045479227 },\n { x: 0.0000014700000000000969, y: 1.789039254345991 },\n { x: 0.000001471000000000097, y: 1.7697375578374506 },\n { x: 0.000001472000000000097, y: 1.7675320681639766 },\n { x: 0.0000014730000000000971, y: 1.7701851453220134 },\n { x: 0.0000014740000000000972, y: 1.78337529058658 },\n { x: 0.0000014750000000000973, y: 1.7742950488647922 },\n { x: 0.0000014760000000000973, y: 1.7653274475326501 },\n { x: 0.0000014770000000000974, y: 1.8301639684150808 },\n { x: 0.0000014780000000000975, y: 1.8068433596873197 },\n { x: 0.0000014790000000000976, y: 1.8238155093492354 },\n { x: 0.0000014800000000000976, y: 1.7951873008280588 },\n { x: 0.0000014810000000000977, y: 1.8049504352580952 },\n { x: 0.0000014820000000000978, y: 1.780118923235781 },\n { x: 0.0000014830000000000979, y: 1.8370895852672278 },\n { x: 0.000001484000000000098, y: 1.8102842649232616 },\n { x: 0.000001485000000000098, y: 1.8142034505414075 },\n { x: 0.000001486000000000098, y: 1.8550458803647334 },\n { x: 0.0000014870000000000982, y: 1.8063987736343825 },\n { x: 0.0000014880000000000982, y: 1.803316412026017 },\n { x: 0.0000014890000000000983, y: 1.8275014476617208 },\n { x: 0.0000014900000000000984, y: 1.8345056995195583 },\n { x: 0.0000014910000000000985, y: 1.8235958930130387 },\n { x: 0.0000014920000000000985, y: 1.8685153496704994 },\n { x: 0.0000014930000000000986, y: 1.8507441695712015 },\n { x: 0.0000014940000000000987, y: 1.8607858897062826 },\n { x: 0.0000014950000000000988, y: 1.812694211987892 },\n { x: 0.0000014960000000000988, y: 1.83434609025351 },\n { x: 0.000001497000000000099, y: 1.8532545374843148 },\n { x: 0.000001498000000000099, y: 1.8643854446855914 },\n { x: 0.000001499000000000099, y: 1.8243497264912738 },\n { x: 0.0000015000000000000991, y: 1.8925134014688394 },\n { x: 0.0000015010000000000992, y: 1.860953548271042 },\n { x: 0.0000015020000000000993, y: 1.8785196325281608 },\n { x: 0.0000015030000000000994, y: 1.861150942623333 },\n { x: 0.0000015040000000000994, y: 1.8797006105166452 },\n { x: 0.0000015050000000000995, y: 1.8376681034290774 },\n { x: 0.0000015060000000000996, y: 1.8644634280071186 },\n { x: 0.0000015070000000000997, y: 1.8862993891068205 },\n { x: 0.0000015080000000000997, y: 1.8334242315716305 },\n { x: 0.0000015090000000000998, y: 1.851266129348199 },\n { x: 0.0000015100000000000999, y: 1.887588938564708 },\n { x: 0.0000015110000000001, y: 1.8662547374747216 },\n { x: 0.0000015120000000001, y: 1.8816369582640442 },\n { x: 0.0000015130000000001001, y: 1.8528951303022463 },\n { x: 0.0000015140000000001002, y: 1.8713252732134174 },\n { x: 0.0000015150000000001003, y: 1.8908649227574983 },\n { x: 0.0000015160000000001003, y: 1.906689942063815 },\n { x: 0.0000015170000000001004, y: 1.8868777950272633 },\n { x: 0.0000015180000000001005, y: 1.862199690584565 },\n { x: 0.0000015190000000001006, y: 1.8789739954545102 },\n { x: 0.0000015200000000001006, y: 1.8689118798688504 },\n { x: 0.0000015210000000001007, y: 1.9119499732277851 },\n { x: 0.0000015220000000001008, y: 1.9152563937616063 },\n { x: 0.0000015230000000001009, y: 1.9220510082439022 },\n { x: 0.000001524000000000101, y: 1.8703992835651486 },\n { x: 0.000001525000000000101, y: 1.8856038884385498 },\n { x: 0.000001526000000000101, y: 1.8984454725585482 },\n { x: 0.0000015270000000001012, y: 1.8844721673166929 },\n { x: 0.0000015280000000001012, y: 1.8925789410893754 },\n { x: 0.0000015290000000001013, y: 1.8922685412659606 },\n { x: 0.0000015300000000001014, y: 1.8836883595875777 },\n { x: 0.0000015310000000001015, y: 1.9047122803007412 },\n { x: 0.0000015320000000001015, y: 1.9296797790253686 },\n { x: 0.0000015330000000001016, y: 1.9261026261678198 },\n { x: 0.0000015340000000001017, y: 1.8868162588437538 },\n { x: 0.0000015350000000001018, y: 1.8959553657375319 },\n { x: 0.0000015360000000001018, y: 1.8674549688769102 },\n { x: 0.000001537000000000102, y: 1.8902671543748741 },\n { x: 0.000001538000000000102, y: 1.8667785130986145 },\n { x: 0.000001539000000000102, y: 1.9129225960754155 },\n { x: 0.0000015400000000001021, y: 1.8977869742151219 },\n { x: 0.0000015410000000001022, y: 1.9131871359736343 },\n { x: 0.0000015420000000001023, y: 1.9047930619613263 },\n { x: 0.0000015430000000001024, y: 1.8947747207071641 },\n { x: 0.0000015440000000001024, y: 1.8964381746455443 },\n { x: 0.0000015450000000001025, y: 1.9079773570878646 },\n { x: 0.0000015460000000001026, y: 1.9384554069184756 },\n { x: 0.0000015470000000001027, y: 1.8728636196128705 },\n { x: 0.0000015480000000001027, y: 1.8812995334068285 },\n { x: 0.0000015490000000001028, y: 1.9418367521610471 },\n { x: 0.000001550000000000103, y: 1.9355705222299138 },\n { x: 0.000001551000000000103, y: 1.90894487787589 },\n { x: 0.000001552000000000103, y: 1.8818579276871013 },\n { x: 0.0000015530000000001031, y: 1.8770799847287651 },\n { x: 0.0000015540000000001032, y: 1.9044930141630907 },\n { x: 0.0000015550000000001033, y: 1.8661651693930084 },\n { x: 0.0000015560000000001033, y: 1.907791817955513 },\n { x: 0.0000015570000000001034, y: 1.8729318308052993 },\n { x: 0.0000015580000000001035, y: 1.8732953225250497 },\n { x: 0.0000015590000000001036, y: 1.8609196273032926 },\n { x: 0.0000015600000000001036, y: 1.916577448889704 },\n { x: 0.0000015610000000001037, y: 1.876224822962021 },\n { x: 0.0000015620000000001038, y: 1.8713390808416641 },\n { x: 0.0000015630000000001039, y: 1.8824630708570054 },\n { x: 0.000001564000000000104, y: 1.8873740345399652 },\n { x: 0.000001565000000000104, y: 1.863647444573023 },\n { x: 0.000001566000000000104, y: 1.875114611514498 },\n { x: 0.0000015670000000001042, y: 1.874582951543223 },\n { x: 0.0000015680000000001042, y: 1.9212647970730914 },\n { x: 0.0000015690000000001043, y: 1.8685298585342047 },\n { x: 0.0000015700000000001044, y: 1.894426012738697 },\n { x: 0.0000015710000000001045, y: 1.9170473633939735 },\n { x: 0.0000015720000000001046, y: 1.8853544704646132 },\n { x: 0.0000015730000000001046, y: 1.889809335241923 },\n { x: 0.0000015740000000001047, y: 1.9165978128993935 },\n { x: 0.0000015750000000001048, y: 1.8913963010581722 },\n { x: 0.0000015760000000001049, y: 1.8736515303059285 },\n { x: 0.000001577000000000105, y: 1.9152477730259942 },\n { x: 0.000001578000000000105, y: 1.8440540277067565 },\n { x: 0.000001579000000000105, y: 1.9122620588824573 },\n { x: 0.0000015800000000001052, y: 1.8658959039505405 },\n { x: 0.0000015810000000001052, y: 1.847270619491048 },\n { x: 0.0000015820000000001053, y: 1.8999229757027456 },\n { x: 0.0000015830000000001054, y: 1.8506686930094023 },\n { x: 0.0000015840000000001055, y: 1.8586880732445 },\n { x: 0.0000015850000000001055, y: 1.874972060371563 },\n { x: 0.0000015860000000001056, y: 1.8704564391777614 },\n { x: 0.0000015870000000001057, y: 1.8698480599377294 },\n { x: 0.0000015880000000001058, y: 1.8482757147947744 },\n { x: 0.0000015890000000001058, y: 1.8424217848865307 },\n { x: 0.000001590000000000106, y: 1.8233781582445685 },\n { x: 0.000001591000000000106, y: 1.8702386320216384 },\n { x: 0.000001592000000000106, y: 1.8859127016120325 },\n { x: 0.0000015930000000001061, y: 1.878276160473116 },\n { x: 0.0000015940000000001062, y: 1.8677504404226315 },\n { x: 0.0000015950000000001063, y: 1.8632021353360044 },\n { x: 0.0000015960000000001064, y: 1.8322785935685886 },\n { x: 0.0000015970000000001064, y: 1.8391758023953622 },\n { x: 0.0000015980000000001065, y: 1.8096176702193707 },\n { x: 0.0000015990000000001066, y: 1.855034617913229 },\n { x: 0.0000016000000000001067, y: 1.8482835294888607 },\n { x: 0.0000016010000000001067, y: 1.835833214087766 },\n { x: 0.0000016020000000001068, y: 1.8052166331553055 },\n { x: 0.0000016030000000001069, y: 1.7902894678501065 },\n { x: 0.000001604000000000107, y: 1.8369923125350067 },\n { x: 0.000001605000000000107, y: 1.7922647488696313 },\n { x: 0.000001606000000000107, y: 1.7934672190883718 },\n { x: 0.0000016070000000001072, y: 1.8048890571115532 },\n { x: 0.0000016080000000001073, y: 1.8092032577848933 },\n { x: 0.0000016090000000001073, y: 1.8399940448264334 },\n { x: 0.0000016100000000001074, y: 1.7628483295584574 },\n { x: 0.0000016110000000001075, y: 1.7700920809298333 },\n { x: 0.0000016120000000001076, y: 1.8082683127805284 },\n { x: 0.0000016130000000001076, y: 1.810419344399425 },\n { x: 0.0000016140000000001077, y: 1.7842842877871867 },\n { x: 0.0000016150000000001078, y: 1.746427787110012 },\n { x: 0.0000016160000000001079, y: 1.7681242568510784 },\n { x: 0.000001617000000000108, y: 1.771804533141493 },\n { x: 0.000001618000000000108, y: 1.7829456494665994 },\n { x: 0.000001619000000000108, y: 1.762423417301352 },\n { x: 0.0000016200000000001082, y: 1.790192252579323 },\n { x: 0.0000016210000000001082, y: 1.7701955101310594 },\n { x: 0.0000016220000000001083, y: 1.7318761053597422 },\n { x: 0.0000016230000000001084, y: 1.728154975427654 },\n { x: 0.0000016240000000001085, y: 1.7522174422126358 },\n { x: 0.0000016250000000001085, y: 1.754419511878992 },\n { x: 0.0000016260000000001086, y: 1.7658995727361002 },\n { x: 0.0000016270000000001087, y: 1.7750836025173136 },\n { x: 0.0000016280000000001088, y: 1.705238850494079 },\n { x: 0.0000016290000000001088, y: 1.7457692846988404 },\n { x: 0.000001630000000000109, y: 1.7408691923139077 },\n { x: 0.000001631000000000109, y: 1.7172516233835076 },\n { x: 0.000001632000000000109, y: 1.723647547761742 },\n { x: 0.0000016330000000001091, y: 1.7142232962221842 },\n { x: 0.0000016340000000001092, y: 1.7319837944583334 },\n { x: 0.0000016350000000001093, y: 1.6789211047699923 },\n { x: 0.0000016360000000001094, y: 1.7209111351896542 },\n { x: 0.0000016370000000001094, y: 1.6955184701179251 },\n { x: 0.0000016380000000001095, y: 1.6661664730067631 },\n { x: 0.0000016390000000001096, y: 1.6778569539380102 },\n { x: 0.0000016400000000001097, y: 1.6820457372163402 },\n { x: 0.0000016410000000001097, y: 1.6751734765509971 },\n { x: 0.0000016420000000001098, y: 1.682032300795322 },\n { x: 0.0000016430000000001099, y: 1.6845563293536863 },\n { x: 0.00000164400000000011, y: 1.661111988270595 },\n { x: 0.00000164500000000011, y: 1.6408567993814596 },\n { x: 0.0000016460000000001101, y: 1.7008158182401056 },\n { x: 0.0000016470000000001102, y: 1.655198412132026 },\n { x: 0.0000016480000000001103, y: 1.6275625281928723 },\n { x: 0.0000016490000000001103, y: 1.6218242860538887 },\n { x: 0.0000016500000000001104, y: 1.6083884732638676 },\n { x: 0.0000016510000000001105, y: 1.6673248127665845 },\n { x: 0.0000016520000000001106, y: 1.6403953293339677 },\n { x: 0.0000016530000000001106, y: 1.6608722206893922 },\n { x: 0.0000016540000000001107, y: 1.646038983934043 },\n { x: 0.0000016550000000001108, y: 1.5938910702902471 },\n { x: 0.0000016560000000001109, y: 1.6510986313855462 },\n { x: 0.000001657000000000111, y: 1.62686701385475 },\n { x: 0.000001658000000000111, y: 1.5998921901900898 },\n { x: 0.000001659000000000111, y: 1.6245876659849168 },\n { x: 0.0000016600000000001112, y: 1.5622047901252105 },\n { x: 0.0000016610000000001112, y: 1.5742038366017066 },\n { x: 0.0000016620000000001113, y: 1.5611199997048664 },\n { x: 0.0000016630000000001114, y: 1.5871588220820974 },\n { x: 0.0000016640000000001115, y: 1.6075196228608475 },\n { x: 0.0000016650000000001115, y: 1.5421904485613767 },\n { x: 0.0000016660000000001116, y: 1.59629100663841 },\n { x: 0.0000016670000000001117, y: 1.5264660518445645 },\n { x: 0.0000016680000000001118, y: 1.5769237392862725 },\n { x: 0.0000016690000000001118, y: 1.5398858098540076 },\n { x: 0.000001670000000000112, y: 1.5534801961145324 },\n { x: 0.000001671000000000112, y: 1.5666416319487044 },\n { x: 0.000001672000000000112, y: 1.55200225135598 },\n { x: 0.0000016730000000001121, y: 1.5235845706990685 },\n { x: 0.0000016740000000001122, y: 1.5395352966628106 },\n { x: 0.0000016750000000001123, y: 1.5084874648810562 },\n { x: 0.0000016760000000001124, y: 1.5337002821845365 },\n { x: 0.0000016770000000001124, y: 1.4772938546664136 },\n { x: 0.0000016780000000001125, y: 1.5076062000475374 },\n { x: 0.0000016790000000001126, y: 1.5024882602525487 },\n { x: 0.0000016800000000001127, y: 1.4965851687817378 },\n { x: 0.0000016810000000001127, y: 1.499257658518879 },\n { x: 0.0000016820000000001128, y: 1.465534360190667 },\n { x: 0.0000016830000000001129, y: 1.4565746226363188 },\n { x: 0.000001684000000000113, y: 1.4664450594174712 },\n { x: 0.000001685000000000113, y: 1.4903293473080246 },\n { x: 0.0000016860000000001131, y: 1.4598304175366217 },\n { x: 0.0000016870000000001132, y: 1.4690706555375441 },\n { x: 0.0000016880000000001133, y: 1.4253871744836082 },\n { x: 0.0000016890000000001133, y: 1.4711967656571237 },\n { x: 0.0000016900000000001134, y: 1.4258275003680279 },\n { x: 0.0000016910000000001135, y: 1.4371963096342175 },\n { x: 0.0000016920000000001136, y: 1.420695852115151 },\n { x: 0.0000016930000000001136, y: 1.4326415536863035 },\n { x: 0.0000016940000000001137, y: 1.402635761140759 },\n { x: 0.0000016950000000001138, y: 1.441298666200187 },\n { x: 0.0000016960000000001139, y: 1.41472873211655 },\n { x: 0.000001697000000000114, y: 1.373704858308324 },\n { x: 0.000001698000000000114, y: 1.4135179993972475 },\n { x: 0.000001699000000000114, y: 1.4107919200075094 },\n { x: 0.0000017000000000001142, y: 1.3726186189339955 },\n { x: 0.0000017010000000001142, y: 1.3360545434613273 },\n { x: 0.0000017020000000001143, y: 1.3527551452603812 },\n { x: 0.0000017030000000001144, y: 1.3935391815162788 },\n { x: 0.0000017040000000001145, y: 1.3786949932401669 },\n { x: 0.0000017050000000001145, y: 1.3816801916099977 },\n { x: 0.0000017060000000001146, y: 1.3009986519663972 },\n { x: 0.0000017070000000001147, y: 1.3187780210377853 },\n { x: 0.0000017080000000001148, y: 1.3412528566768211 },\n { x: 0.0000017090000000001148, y: 1.3390480833544698 },\n { x: 0.000001710000000000115, y: 1.3056216725558858 },\n { x: 0.000001711000000000115, y: 1.2935920935829797 },\n { x: 0.000001712000000000115, y: 1.2644650949751886 },\n { x: 0.0000017130000000001151, y: 1.290977611408184 },\n { x: 0.0000017140000000001152, y: 1.3224101809561863 },\n { x: 0.0000017150000000001153, y: 1.278139503493128 },\n { x: 0.0000017160000000001154, y: 1.2959032997168354 },\n { x: 0.0000017170000000001154, y: 1.2545173717646112 },\n { x: 0.0000017180000000001155, y: 1.2292701261735286 },\n { x: 0.0000017190000000001156, y: 1.2482130911721452 },\n { x: 0.0000017200000000001157, y: 1.278691111474727 },\n { x: 0.0000017210000000001157, y: 1.2792566087515185 },\n { x: 0.0000017220000000001158, y: 1.2498210816403308 },\n { x: 0.000001723000000000116, y: 1.196011818996488 },\n { x: 0.000001724000000000116, y: 1.2594618764616352 },\n { x: 0.000001725000000000116, y: 1.2115833658757438 },\n { x: 0.0000017260000000001161, y: 1.173061215344364 },\n { x: 0.0000017270000000001162, y: 1.1716987683385647 },\n { x: 0.0000017280000000001163, y: 1.1992386167463802 },\n { x: 0.0000017290000000001163, y: 1.1890475561954534 },\n { x: 0.0000017300000000001164, y: 1.2142789474410358 },\n { x: 0.0000017310000000001165, y: 1.1355387233708554 },\n { x: 0.0000017320000000001166, y: 1.1768252613616619 },\n { x: 0.0000017330000000001166, y: 1.150082304001767 },\n { x: 0.0000017340000000001167, y: 1.1497621747608626 },\n { x: 0.0000017350000000001168, y: 1.1364680632348483 },\n { x: 0.0000017360000000001169, y: 1.14291978102332 },\n { x: 0.000001737000000000117, y: 1.1060580977273025 },\n { x: 0.000001738000000000117, y: 1.146401545956996 },\n { x: 0.000001739000000000117, y: 1.1107291983398768 },\n { x: 0.0000017400000000001172, y: 1.0793723241040567 },\n { x: 0.0000017410000000001172, y: 1.0737092073504717 },\n { x: 0.0000017420000000001173, y: 1.059155293785555 },\n { x: 0.0000017430000000001174, y: 1.1212625228086368 },\n { x: 0.0000017440000000001175, y: 1.1122442815110118 },\n { x: 0.0000017450000000001175, y: 1.0463752370298995 },\n { x: 0.0000017460000000001176, y: 1.0885412605846692 },\n { x: 0.0000017470000000001177, y: 1.0751011879270187 },\n { x: 0.0000017480000000001178, y: 1.0234236732909958 },\n { x: 0.0000017490000000001178, y: 1.0511152033041122 },\n { x: 0.000001750000000000118, y: 1.0064275902604922 },\n { x: 0.000001751000000000118, y: 1.0482282985548423 },\n { x: 0.000001752000000000118, y: 1.037717181632446 },\n { x: 0.0000017530000000001181, y: 1.0057200430319189 },\n { x: 0.0000017540000000001182, y: 1.0003929114070311 },\n { x: 0.0000017550000000001183, y: 1.0060526203316948 },\n { x: 0.0000017560000000001184, y: 0.9666791231232204 },\n { x: 0.0000017570000000001184, y: 1.011481038250688 },\n { x: 0.0000017580000000001185, y: 0.9724848378508939 },\n { x: 0.0000017590000000001186, y: 0.9785496578901185 },\n { x: 0.0000017600000000001187, y: 0.9669045211641233 },\n { x: 0.0000017610000000001187, y: 0.9927616916827425 },\n { x: 0.0000017620000000001188, y: 0.931482675695195 },\n { x: 0.000001763000000000119, y: 0.979030634139376 },\n { x: 0.000001764000000000119, y: 0.9155880976629741 },\n { x: 0.000001765000000000119, y: 0.9323797357960899 },\n { x: 0.0000017660000000001191, y: 0.9554169758189069 },\n { x: 0.0000017670000000001192, y: 0.9259991684993201 },\n { x: 0.0000017680000000001193, y: 0.8710583040159814 },\n { x: 0.0000017690000000001194, y: 0.928805033109958 },\n { x: 0.0000017700000000001194, y: 0.8822771019050856 },\n { x: 0.0000017710000000001195, y: 0.8467219574160861 },\n { x: 0.0000017720000000001196, y: 0.839532495711053 },\n { x: 0.0000017730000000001197, y: 0.8430894295902366 },\n { x: 0.0000017740000000001197, y: 0.8617802958582693 },\n { x: 0.0000017750000000001198, y: 0.8890574520010209 },\n { x: 0.0000017760000000001199, y: 0.8252023196861221 },\n { x: 0.00000177700000000012, y: 0.846191166821027 },\n { x: 0.00000177800000000012, y: 0.841275853282362 },\n { x: 0.00000177900000000012, y: 0.8120198287469949 },\n { x: 0.0000017800000000001202, y: 0.845777043375414 },\n { x: 0.0000017810000000001203, y: 0.7877953547058272 },\n { x: 0.0000017820000000001203, y: 0.7721366231936568 },\n { x: 0.0000017830000000001204, y: 0.7601043619508671 },\n { x: 0.0000017840000000001205, y: 0.7687626708524489 },\n { x: 0.0000017850000000001206, y: 0.7786574016780818 },\n { x: 0.0000017860000000001206, y: 0.7963354064030586 },\n { x: 0.0000017870000000001207, y: 0.7847265245887479 },\n { x: 0.0000017880000000001208, y: 0.7205280862844804 },\n { x: 0.0000017890000000001209, y: 0.7688533021835856 },\n { x: 0.000001790000000000121, y: 0.7389379897811448 },\n { x: 0.000001791000000000121, y: 0.7050691865007874 },\n { x: 0.000001792000000000121, y: 0.7534969048243474 },\n { x: 0.0000017930000000001212, y: 0.7021183789272125 },\n { x: 0.0000017940000000001212, y: 0.6740477136297011 },\n { x: 0.0000017950000000001213, y: 0.6994710880776371 },\n { x: 0.0000017960000000001214, y: 0.706575908824655 },\n { x: 0.0000017970000000001215, y: 0.7062683225914809 },\n { x: 0.0000017980000000001215, y: 0.6774476770459507 },\n { x: 0.0000017990000000001216, y: 0.6460618263174157 },\n { x: 0.0000018000000000001217, y: 0.629092275171784 },\n { x: 0.0000018010000000001218, y: 0.6793268556847807 },\n { x: 0.0000018020000000001218, y: 0.6719283287295943 },\n { x: 0.000001803000000000122, y: 0.6444965771338297 },\n { x: 0.000001804000000000122, y: 0.630050139732022 },\n { x: 0.000001805000000000122, y: 0.639818804647739 },\n { x: 0.0000018060000000001221, y: 0.5988363361951942 },\n { x: 0.0000018070000000001222, y: 0.6357218144748128 },\n { x: 0.0000018080000000001223, y: 0.596596571869268 },\n { x: 0.0000018090000000001224, y: 0.5539127645942263 },\n { x: 0.0000018100000000001224, y: 0.5969328899378453 },\n { x: 0.0000018110000000001225, y: 0.6070207878621521 },\n { x: 0.0000018120000000001226, y: 0.5578158944719761 },\n { x: 0.0000018130000000001227, y: 0.5383347922654027 },\n { x: 0.0000018140000000001227, y: 0.5384678172646908 },\n { x: 0.0000018150000000001228, y: 0.5203470199057184 },\n { x: 0.0000018160000000001229, y: 0.5143523944008801 },\n { x: 0.000001817000000000123, y: 0.5497136380511192 },\n { x: 0.000001818000000000123, y: 0.5207715252244023 },\n { x: 0.0000018190000000001231, y: 0.533778780400845 },\n { x: 0.0000018200000000001232, y: 0.4721907228628809 },\n { x: 0.0000018210000000001233, y: 0.5083521149433681 },\n { x: 0.0000018220000000001233, y: 0.4670134659107506 },\n { x: 0.0000018230000000001234, y: 0.4667912556292909 },\n { x: 0.0000018240000000001235, y: 0.5119507212408104 },\n { x: 0.0000018250000000001236, y: 0.48461479425898735 },\n { x: 0.0000018260000000001236, y: 0.48850297873101833 },\n { x: 0.0000018270000000001237, y: 0.46630847180215085 },\n { x: 0.0000018280000000001238, y: 0.4742941857950925 },\n { x: 0.0000018290000000001239, y: 0.41759232425854625 },\n { x: 0.000001830000000000124, y: 0.45469903467898154 },\n { x: 0.000001831000000000124, y: 0.381706326626884 },\n { x: 0.000001832000000000124, y: 0.4101451045780741 },\n { x: 0.0000018330000000001242, y: 0.41192851786047635 },\n { x: 0.0000018340000000001242, y: 0.3794438058066927 },\n { x: 0.0000018350000000001243, y: 0.4223695241692824 },\n { x: 0.0000018360000000001244, y: 0.388420389959051 },\n { x: 0.0000018370000000001245, y: 0.3729004606803574 },\n { x: 0.0000018380000000001245, y: 0.32709835757397876 },\n { x: 0.0000018390000000001246, y: 0.36317929926128756 },\n { x: 0.0000018400000000001247, y: 0.3500921063811527 },\n { x: 0.0000018410000000001248, y: 0.3134417717562017 },\n { x: 0.0000018420000000001248, y: 0.34047534978995514 },\n { x: 0.000001843000000000125, y: 0.35212934913446436 },\n { x: 0.000001844000000000125, y: 0.32808289003474056 },\n { x: 0.000001845000000000125, y: 0.30247128106412186 },\n { x: 0.0000018460000000001251, y: 0.31952707294678734 },\n { x: 0.0000018470000000001252, y: 0.2958033508946068 },\n { x: 0.0000018480000000001253, y: 0.27055301451369307 },\n { x: 0.0000018490000000001254, y: 0.2878705361828219 },\n { x: 0.0000018500000000001254, y: 0.30193324682836054 },\n { x: 0.0000018510000000001255, y: 0.2669150813875294 },\n { x: 0.0000018520000000001256, y: 0.253075388812941 },\n { x: 0.0000018530000000001257, y: 0.2317633661579683 },\n { x: 0.0000018540000000001257, y: 0.2126325869905244 },\n { x: 0.0000018550000000001258, y: 0.23592295789419557 },\n { x: 0.0000018560000000001259, y: 0.20043996321052243 },\n { x: 0.000001857000000000126, y: 0.2427672005856332 },\n { x: 0.000001858000000000126, y: 0.1932373001356702 },\n { x: 0.0000018590000000001261, y: 0.2103132746601908 },\n { x: 0.0000018600000000001262, y: 0.22499910870478354 },\n { x: 0.0000018610000000001263, y: 0.1781844591542755 },\n { x: 0.0000018620000000001263, y: 0.16638747989499747 },\n { x: 0.0000018630000000001264, y: 0.133789010706234 },\n { x: 0.0000018640000000001265, y: 0.1375886595425538 },\n { x: 0.0000018650000000001266, y: 0.16769615462187587 },\n { x: 0.0000018660000000001266, y: 0.17503074430186494 },\n { x: 0.0000018670000000001267, y: 0.1667015077365376 },\n { x: 0.0000018680000000001268, y: 0.1586269597245909 },\n { x: 0.0000018690000000001269, y: 0.09258644945132447 },\n { x: 0.000001870000000000127, y: 0.09418687166919149 },\n { x: 0.000001871000000000127, y: 0.08957902890101409 },\n { x: 0.000001872000000000127, y: 0.06773552419923072 },\n { x: 0.0000018730000000001272, y: 0.06317479021103092 },\n { x: 0.0000018740000000001272, y: 0.08621135433255578 },\n { x: 0.0000018750000000001273, y: 0.05613288564580528 },\n { x: 0.0000018760000000001274, y: 0.09232407769802704 },\n { x: 0.0000018770000000001275, y: 0.07160918405927019 },\n { x: 0.0000018780000000001275, y: 0.05760749187396033 },\n { x: 0.0000018790000000001276, y: 0.04901624811734664 },\n { x: 0.0000018800000000001277, y: 0.04742764542586185 },\n { x: 0.0000018810000000001278, y: 0.04590013587805898 },\n { x: 0.0000018820000000001278, y: 0.02858992163133199 },\n { x: 0.000001883000000000128, y: 0.005423800492616123 },\n { x: 0.000001884000000000128, y: 0.02429193335637827 },\n { x: 0.000001885000000000128, y: 0.013783369487446169 },\n { x: 0.0000018860000000001281, y: -0.011016606032124964 },\n { x: 0.0000018870000000001282, y: 0.022756802400864536 },\n { x: 0.0000018880000000001283, y: -0.04641405252828169 },\n { x: 0.0000018890000000001284, y: -0.028083359283275048 },\n { x: 0.0000018900000000001284, y: -0.030084429642825695 },\n { x: 0.0000018910000000001285, y: -0.061119889770175566 },\n { x: 0.0000018920000000001286, y: -0.09014411960715357 },\n { x: 0.0000018930000000001287, y: -0.0828155241966775 },\n { x: 0.0000018940000000001287, y: -0.044630610385212245 },\n { x: 0.0000018950000000001288, y: -0.06624098809924073 },\n { x: 0.0000018960000000001289, y: -0.09324443236856593 },\n { x: 0.000001897000000000129, y: -0.09949133613352308 },\n { x: 0.000001898000000000129, y: -0.059564000091321866 },\n { x: 0.0000018990000000001291, y: -0.09114867242379796 },\n { x: 0.0000019000000000001292, y: -0.12978941188171944 },\n { x: 0.0000019010000000001293, y: -0.11641813826958265 },\n { x: 0.0000019020000000001293, y: -0.10410161092157948 },\n { x: 0.0000019030000000001294, y: -0.11103011075741599 },\n { x: 0.0000019040000000001295, y: -0.14553718791264772 },\n { x: 0.0000019050000000001296, y: -0.147572981864493 },\n { x: 0.0000019060000000001296, y: -0.13031804905691777 },\n { x: 0.0000019070000000001297, y: -0.1851688750533873 },\n { x: 0.00000190800000000013, y: -0.15143955673946294 },\n { x: 0.00000190900000000013, y: -0.17001815677985424 },\n { x: 0.00000191000000000013, y: -0.16251946193823488 },\n { x: 0.00000191100000000013, y: -0.21493036135421975 },\n { x: 0.00000191200000000013, y: -0.20434216017903817 },\n { x: 0.00000191300000000013, y: -0.17924714052967403 },\n { x: 0.0000019140000000001302, y: -0.20558806632096843 },\n { x: 0.0000019150000000001303, y: -0.18568128678497212 },\n { x: 0.0000019160000000001304, y: -0.210093567946274 },\n { x: 0.0000019170000000001305, y: -0.26819311660233314 },\n { x: 0.0000019180000000001305, y: -0.23817857411332283 },\n { x: 0.0000019190000000001306, y: -0.24398843415801152 },\n { x: 0.0000019200000000001307, y: -0.24196508315340046 },\n { x: 0.0000019210000000001308, y: -0.274304931724491 },\n { x: 0.000001922000000000131, y: -0.2609417500211901 },\n { x: 0.000001923000000000131, y: -0.27849527707493915 },\n { x: 0.000001924000000000131, y: -0.2739161338370364 },\n { x: 0.000001925000000000131, y: -0.2699482865215363 },\n { x: 0.000001926000000000131, y: -0.27780855318155223 },\n { x: 0.0000019270000000001312, y: -0.3247390573972742 },\n { x: 0.0000019280000000001313, y: -0.3164763487566581 },\n { x: 0.0000019290000000001314, y: -0.30528204879652177 },\n { x: 0.0000019300000000001314, y: -0.3281063496408248 },\n { x: 0.0000019310000000001315, y: -0.32919674676747884 },\n { x: 0.0000019320000000001316, y: -0.35498455756718605 },\n { x: 0.0000019330000000001317, y: -0.33544629591367064 },\n { x: 0.0000019340000000001317, y: -0.33608049075372937 },\n { x: 0.000001935000000000132, y: -0.34603605944204063 },\n { x: 0.000001936000000000132, y: -0.3850958417224972 },\n { x: 0.000001937000000000132, y: -0.34268614381362766 },\n { x: 0.000001938000000000132, y: -0.3916615069361548 },\n { x: 0.000001939000000000132, y: -0.3862984562585444 },\n { x: 0.000001940000000000132, y: -0.4216026394243932 },\n { x: 0.0000019410000000001323, y: -0.36928248393042035 },\n { x: 0.0000019420000000001323, y: -0.40189306404810465 },\n { x: 0.0000019430000000001324, y: -0.3934414314400235 },\n { x: 0.0000019440000000001325, y: -0.42776543227184693 },\n { x: 0.0000019450000000001326, y: -0.43440293632840626 },\n { x: 0.0000019460000000001326, y: -0.4191035501301289 },\n { x: 0.0000019470000000001327, y: -0.4433629905620163 },\n { x: 0.000001948000000000133, y: -0.46121805103042807 },\n { x: 0.000001949000000000133, y: -0.4716610659187238 },\n { x: 0.000001950000000000133, y: -0.47579920044406976 },\n { x: 0.000001951000000000133, y: -0.4313459850787053 },\n { x: 0.000001952000000000133, y: -0.5123738994824097 },\n { x: 0.000001953000000000133, y: -0.46680404977110207 },\n { x: 0.0000019540000000001332, y: -0.504416615264248 },\n { x: 0.0000019550000000001333, y: -0.4813511752515375 },\n { x: 0.0000019560000000001334, y: -0.5076667339324117 },\n { x: 0.0000019570000000001335, y: -0.5398511554097921 },\n { x: 0.0000019580000000001335, y: -0.5036475488676722 },\n { x: 0.0000019590000000001336, y: -0.4857626770104701 },\n { x: 0.0000019600000000001337, y: -0.5307612027479378 },\n { x: 0.0000019610000000001338, y: -0.5338352765635476 },\n { x: 0.000001962000000000134, y: -0.5394790091511877 },\n { x: 0.000001963000000000134, y: -0.5364157268208168 },\n { x: 0.000001964000000000134, y: -0.5261546973742287 },\n { x: 0.000001965000000000134, y: -0.5927599445580012 },\n { x: 0.000001966000000000134, y: -0.5421861366976465 },\n { x: 0.0000019670000000001342, y: -0.5921944772681971 },\n { x: 0.0000019680000000001343, y: -0.597790465523866 },\n { x: 0.0000019690000000001344, y: -0.6144523577482467 },\n { x: 0.0000019700000000001345, y: -0.5912264084655625 },\n { x: 0.0000019710000000001345, y: -0.5729827150843166 },\n { x: 0.0000019720000000001346, y: -0.57784533258804 },\n { x: 0.0000019730000000001347, y: -0.585805610239716 },\n { x: 0.0000019740000000001348, y: -0.6184214520880771 },\n { x: 0.000001975000000000135, y: -0.649203399181819 },\n { x: 0.000001976000000000135, y: -0.6202538804430577 },\n { x: 0.000001977000000000135, y: -0.6022826557909744 },\n { x: 0.000001978000000000135, y: -0.6329986164446779 },\n { x: 0.000001979000000000135, y: -0.618920588388072 },\n { x: 0.000001980000000000135, y: -0.6451001098528613 },\n { x: 0.0000019810000000001353, y: -0.6202764877817638 },\n { x: 0.0000019820000000001354, y: -0.6244265892190791 },\n { x: 0.0000019830000000001354, y: -0.6936699168444022 },\n { x: 0.0000019840000000001355, y: -0.6684643142520372 },\n { x: 0.0000019850000000001356, y: -0.6856379449776525 },\n { x: 0.0000019860000000001357, y: -0.7052326912020868 },\n { x: 0.0000019870000000001357, y: -0.6872775923771802 },\n { x: 0.000001988000000000136, y: -0.670452883412318 },\n { x: 0.000001989000000000136, y: -0.6734325196466604 },\n { x: 0.000001990000000000136, y: -0.7082276953759489 },\n { x: 0.000001991000000000136, y: -0.7382290226574425 },\n { x: 0.000001992000000000136, y: -0.6839080850872912 },\n { x: 0.000001993000000000136, y: -0.743900784847232 },\n { x: 0.0000019940000000001363, y: -0.7646719011435118 },\n { x: 0.0000019950000000001363, y: -0.717200885013258 },\n { x: 0.0000019960000000001364, y: -0.7250010129113865 },\n { x: 0.0000019970000000001365, y: -0.7523366825136548 },\n { x: 0.0000019980000000001366, y: -0.765657961253851 },\n { x: 0.0000019990000000001366, y: -0.7884255819669997 },\n { x: 0.0000020000000000001367, y: -0.7645731154095298 },\n { x: 0.0000020010000000001368, y: -0.7665298098181962 },\n { x: 0.000002002000000000137, y: -0.7949515270491656 },\n { x: 0.000002003000000000137, y: -0.7892599122083302 },\n { x: 0.000002004000000000137, y: -0.8043419108854832 },\n { x: 0.000002005000000000137, y: -0.7756148401523104 },\n { x: 0.000002006000000000137, y: -0.769416506714911 },\n { x: 0.0000020070000000001372, y: -0.7876894578703126 },\n { x: 0.0000020080000000001373, y: -0.7957297295185116 },\n { x: 0.0000020090000000001374, y: -0.7811228497061362 },\n { x: 0.0000020100000000001375, y: -0.7864072428903285 },\n { x: 0.0000020110000000001375, y: -0.8418432500737286 },\n { x: 0.0000020120000000001376, y: -0.7879182413594504 },\n { x: 0.0000020130000000001377, y: -0.7954325274132081 },\n { x: 0.0000020140000000001378, y: -0.8231165363390369 },\n { x: 0.000002015000000000138, y: -0.8674962827800862 },\n { x: 0.000002016000000000138, y: -0.8183887259231337 },\n { x: 0.000002017000000000138, y: -0.8137624436228066 },\n { x: 0.000002018000000000138, y: -0.8684586228855796 },\n { x: 0.000002019000000000138, y: -0.890947095541127 },\n { x: 0.000002020000000000138, y: -0.8913091068871473 },\n { x: 0.0000020210000000001383, y: -0.8781718339976893 },\n { x: 0.0000020220000000001384, y: -0.9046866955588501 },\n { x: 0.0000020230000000001384, y: -0.8423356805855133 },\n { x: 0.0000020240000000001385, y: -0.8466076164859948 },\n { x: 0.0000020250000000001386, y: -0.8841358206078905 },\n { x: 0.0000020260000000001387, y: -0.9172006316104219 },\n { x: 0.0000020270000000001387, y: -0.9109546931390988 },\n { x: 0.000002028000000000139, y: -0.9174968579103381 },\n { x: 0.000002029000000000139, y: -0.8716075551075205 },\n { x: 0.000002030000000000139, y: -0.8699296349311166 },\n { x: 0.000002031000000000139, y: -0.90296407722351 },\n { x: 0.000002032000000000139, y: -0.9277027898533693 },\n { x: 0.000002033000000000139, y: -0.9048135944177843 },\n { x: 0.0000020340000000001393, y: -0.9028026955581575 },\n { x: 0.0000020350000000001393, y: -0.9126183563923367 },\n { x: 0.0000020360000000001394, y: -0.9542143003347459 },\n { x: 0.0000020370000000001395, y: -0.9057740346986957 },\n { x: 0.0000020380000000001396, y: -0.9629078209445586 },\n { x: 0.0000020390000000001396, y: -0.9094026438664571 },\n { x: 0.0000020400000000001397, y: -0.9558778764001176 },\n { x: 0.0000020410000000001398, y: -0.9769666190893403 },\n { x: 0.00000204200000000014, y: -0.9359181174544778 },\n { x: 0.00000204300000000014, y: -0.981088809662785 },\n { x: 0.00000204400000000014, y: -0.9789537143919016 },\n { x: 0.00000204500000000014, y: -0.9333047536362957 },\n { x: 0.00000204600000000014, y: -0.9889485705412342 },\n { x: 0.0000020470000000001402, y: -0.977747464526857 },\n { x: 0.0000020480000000001403, y: -1.015597318795567 },\n { x: 0.0000020490000000001404, y: -0.9818532699972032 },\n { x: 0.0000020500000000001405, y: -1.0268027174143752 },\n { x: 0.0000020510000000001405, y: -0.9608747574634242 },\n { x: 0.0000020520000000001406, y: -1.0215854364802281 },\n { x: 0.0000020530000000001407, y: -0.9762352838521732 },\n { x: 0.0000020540000000001408, y: -1.0287664209675345 },\n { x: 0.000002055000000000141, y: -1.0448408144307286 },\n { x: 0.000002056000000000141, y: -1.043894847886768 },\n { x: 0.000002057000000000141, y: -1.036080075498768 },\n { x: 0.000002058000000000141, y: -1.0368753307921756 },\n { x: 0.000002059000000000141, y: -1.0264875487132825 },\n { x: 0.0000020600000000001412, y: -1.024030475113556 },\n { x: 0.0000020610000000001413, y: -1.045614729630012 },\n { x: 0.0000020620000000001414, y: -1.0209801206054478 },\n { x: 0.0000020630000000001414, y: -1.0337165417908984 },\n { x: 0.0000020640000000001415, y: -1.0080211197530593 },\n { x: 0.0000020650000000001416, y: -1.0173128292499731 },\n { x: 0.0000020660000000001417, y: -1.0740949372255375 },\n { x: 0.0000020670000000001417, y: -1.056149430721851 },\n { x: 0.000002068000000000142, y: -1.0666807984844948 },\n { x: 0.000002069000000000142, y: -1.053184947626393 },\n { x: 0.000002070000000000142, y: -1.089708422368973 },\n { x: 0.000002071000000000142, y: -1.0421730521176458 },\n { x: 0.000002072000000000142, y: -1.0645104089707633 },\n { x: 0.000002073000000000142, y: -1.1075151833002732 },\n { x: 0.0000020740000000001423, y: -1.0732942253716746 },\n { x: 0.0000020750000000001423, y: -1.0519799092753723 },\n { x: 0.0000020760000000001424, y: -1.0830883027181253 },\n { x: 0.0000020770000000001425, y: -1.0744323382748378 },\n { x: 0.0000020780000000001426, y: -1.0824061164678547 },\n { x: 0.0000020790000000001426, y: -1.1072313129783127 },\n { x: 0.0000020800000000001427, y: -1.0582448264160995 },\n { x: 0.000002081000000000143, y: -1.1289713795240328 },\n { x: 0.000002082000000000143, y: -1.0914047127398843 },\n { x: 0.000002083000000000143, y: -1.1148746567994705 },\n { x: 0.000002084000000000143, y: -1.0865528507310622 },\n { x: 0.000002085000000000143, y: -1.0724142677880109 },\n { x: 0.000002086000000000143, y: -1.1024906842074884 },\n { x: 0.0000020870000000001432, y: -1.0946637312140621 },\n { x: 0.0000020880000000001433, y: -1.1541119175527692 },\n { x: 0.0000020890000000001434, y: -1.133310661686653 },\n { x: 0.0000020900000000001435, y: -1.0983116049556387 },\n { x: 0.0000020910000000001435, y: -1.093330643016027 },\n { x: 0.0000020920000000001436, y: -1.0917736095879387 },\n { x: 0.0000020930000000001437, y: -1.1650635498914457 },\n { x: 0.0000020940000000001438, y: -1.1095407157578265 },\n { x: 0.000002095000000000144, y: -1.1656614968255092 },\n { x: 0.000002096000000000144, y: -1.1060352224021655 },\n { x: 0.000002097000000000144, y: -1.1325034867339496 },\n { x: 0.000002098000000000144, y: -1.1715055937258096 },\n { x: 0.000002099000000000144, y: -1.1344422713785771 },\n { x: 0.0000021000000000001442, y: -1.119351852076914 },\n { x: 0.0000021010000000001443, y: -1.1329027979150834 },\n { x: 0.0000021020000000001444, y: -1.1751661962178672 },\n { x: 0.0000021030000000001444, y: -1.1392390449567167 },\n { x: 0.0000021040000000001445, y: -1.14642678312887 },\n { x: 0.0000021050000000001446, y: -1.1368408341842335 },\n { x: 0.0000021060000000001447, y: -1.1307917035716262 },\n { x: 0.0000021070000000001447, y: -1.1515139044097298 },\n { x: 0.000002108000000000145, y: -1.1918767649650936 },\n { x: 0.000002109000000000145, y: -1.1499017603176236 },\n { x: 0.000002110000000000145, y: -1.1657717130624003 },\n { x: 0.000002111000000000145, y: -1.1901063025797451 },\n { x: 0.000002112000000000145, y: -1.1875406627098366 },\n { x: 0.000002113000000000145, y: -1.1462588127149231 },\n { x: 0.0000021140000000001453, y: -1.1922419553615307 },\n { x: 0.0000021150000000001453, y: -1.1682219316553129 },\n { x: 0.0000021160000000001454, y: -1.1830653479107394 },\n { x: 0.0000021170000000001455, y: -1.1753518681492223 },\n { x: 0.0000021180000000001456, y: -1.2085768654552629 },\n { x: 0.0000021190000000001456, y: -1.221780302107408 },\n { x: 0.0000021200000000001457, y: -1.1790986628657338 },\n { x: 0.000002121000000000146, y: -1.1752299314504844 },\n { x: 0.000002122000000000146, y: -1.2262975081705525 },\n { x: 0.000002123000000000146, y: -1.1547690707308786 },\n { x: 0.000002124000000000146, y: -1.155590748589819 },\n { x: 0.000002125000000000146, y: -1.2215201107619296 },\n { x: 0.000002126000000000146, y: -1.192214232298731 },\n { x: 0.0000021270000000001462, y: -1.1976036926673637 },\n { x: 0.0000021280000000001463, y: -1.2106667121191867 },\n { x: 0.0000021290000000001464, y: -1.1810961522838284 },\n { x: 0.0000021300000000001465, y: -1.2294173006177818 },\n { x: 0.0000021310000000001465, y: -1.1891311008444585 },\n { x: 0.0000021320000000001466, y: -1.2103787790498537 },\n { x: 0.0000021330000000001467, y: -1.1738459803287855 },\n { x: 0.0000021340000000001468, y: -1.1862068278047035 },\n { x: 0.000002135000000000147, y: -1.207573731508814 },\n { x: 0.000002136000000000147, y: -1.2149035948322942 },\n { x: 0.000002137000000000147, y: -1.2460034483121056 },\n { x: 0.000002138000000000147, y: -1.218073011122839 },\n { x: 0.000002139000000000147, y: -1.193477306405147 },\n { x: 0.0000021400000000001472, y: -1.2206873460940273 },\n { x: 0.0000021410000000001473, y: -1.1965849016122774 },\n { x: 0.0000021420000000001474, y: -1.1969376647950813 },\n { x: 0.0000021430000000001474, y: -1.2092138988385954 },\n { x: 0.0000021440000000001475, y: -1.2470580334403962 },\n { x: 0.0000021450000000001476, y: -1.1932307726756652 },\n { x: 0.0000021460000000001477, y: -1.2503499891913694 },\n { x: 0.0000021470000000001477, y: -1.2320580477943053 },\n { x: 0.000002148000000000148, y: -1.1976027721262665 },\n { x: 0.000002149000000000148, y: -1.2301644295325902 },\n { x: 0.000002150000000000148, y: -1.221425317048347 },\n { x: 0.000002151000000000148, y: -1.205922758276388 },\n { x: 0.000002152000000000148, y: -1.1945979059554424 },\n { x: 0.000002153000000000148, y: -1.240158317622497 },\n { x: 0.0000021540000000001483, y: -1.2116420584268912 },\n { x: 0.0000021550000000001484, y: -1.2258934364843523 },\n { x: 0.0000021560000000001484, y: -1.1967845702948345 },\n { x: 0.0000021570000000001485, y: -1.24120043270647 },\n { x: 0.0000021580000000001486, y: -1.2249432129628346 },\n { x: 0.0000021590000000001487, y: -1.2515922712458944 },\n { x: 0.0000021600000000001487, y: -1.2211069243383434 },\n { x: 0.000002161000000000149, y: -1.261260376327873 },\n { x: 0.000002162000000000149, y: -1.2597208700714275 },\n { x: 0.000002163000000000149, y: -1.262721729173913 },\n { x: 0.000002164000000000149, y: -1.1900986319284 },\n { x: 0.000002165000000000149, y: -1.2013695859844655 },\n { x: 0.000002166000000000149, y: -1.2062483818664547 },\n { x: 0.0000021670000000001493, y: -1.264180942861569 },\n { x: 0.0000021680000000001493, y: -1.2063910148407289 },\n { x: 0.0000021690000000001494, y: -1.195093747960024 },\n { x: 0.0000021700000000001495, y: -1.2540727735025274 },\n { x: 0.0000021710000000001496, y: -1.2390252263508523 },\n { x: 0.0000021720000000001496, y: -1.2087925330547704 },\n { x: 0.0000021730000000001497, y: -1.252038739103907 },\n { x: 0.0000021740000000001498, y: -1.2533975676472286 },\n { x: 0.00000217500000000015, y: -1.1902217976584448 },\n { x: 0.00000217600000000015, y: -1.2200175389814245 },\n { x: 0.00000217700000000015, y: -1.2392712135731416 },\n { x: 0.00000217800000000015, y: -1.2280501975960687 },\n { x: 0.00000217900000000015, y: -1.2475047742887264 },\n { x: 0.0000021800000000001502, y: -1.2510222695503483 },\n { x: 0.0000021810000000001503, y: -1.1876862560983892 },\n { x: 0.0000021820000000001504, y: -1.2584145645790799 },\n { x: 0.0000021830000000001505, y: -1.2220408123327722 },\n { x: 0.0000021840000000001505, y: -1.2292066542012205 },\n { x: 0.0000021850000000001506, y: -1.253557191935308 },\n { x: 0.0000021860000000001507, y: -1.1926371990935603 },\n { x: 0.0000021870000000001508, y: -1.1886819820084908 },\n { x: 0.000002188000000000151, y: -1.2521227410726932 },\n { x: 0.000002189000000000151, y: -1.1982815456594678 },\n { x: 0.000002190000000000151, y: -1.2304199849701873 },\n { x: 0.000002191000000000151, y: -1.196274980750317 },\n { x: 0.000002192000000000151, y: -1.2007756687056381 },\n { x: 0.000002193000000000151, y: -1.2155285705874976 },\n { x: 0.0000021940000000001513, y: -1.1931937974164522 },\n { x: 0.0000021950000000001514, y: -1.2121202800913422 },\n { x: 0.0000021960000000001514, y: -1.2552513308758757 },\n { x: 0.0000021970000000001515, y: -1.2488143341984481 },\n { x: 0.0000021980000000001516, y: -1.2169093023486524 },\n { x: 0.0000021990000000001517, y: -1.2340277290062873 },\n { x: 0.0000022000000000001517, y: -1.184350360653403 },\n { x: 0.000002201000000000152, y: -1.2304628952663486 },\n { x: 0.000002202000000000152, y: -1.199277070586878 },\n { x: 0.000002203000000000152, y: -1.1809330571142898 },\n { x: 0.000002204000000000152, y: -1.2214166233868717 },\n { x: 0.000002205000000000152, y: -1.180345964878448 },\n { x: 0.000002206000000000152, y: -1.239229219607888 },\n { x: 0.0000022070000000001523, y: -1.1941495961805357 },\n { x: 0.0000022080000000001523, y: -1.1798969823347527 },\n { x: 0.0000022090000000001524, y: -1.220777451785606 },\n { x: 0.0000022100000000001525, y: -1.1900870364011982 },\n { x: 0.0000022110000000001526, y: -1.185167628226522 },\n { x: 0.0000022120000000001526, y: -1.20537771589163 },\n { x: 0.0000022130000000001527, y: -1.2620121359397163 },\n { x: 0.0000022140000000001528, y: -1.2370870492852872 },\n { x: 0.000002215000000000153, y: -1.217257498349013 },\n { x: 0.000002216000000000153, y: -1.2147858898738997 },\n { x: 0.000002217000000000153, y: -1.1995495046945983 },\n { x: 0.000002218000000000153, y: -1.2311418132335596 },\n { x: 0.000002219000000000153, y: -1.1661146054435807 },\n { x: 0.0000022200000000001532, y: -1.189445358182485 },\n { x: 0.0000022210000000001533, y: -1.193723532124603 },\n { x: 0.0000022220000000001534, y: -1.2205997269585525 },\n { x: 0.0000022230000000001535, y: -1.1759438785574856 },\n { x: 0.0000022240000000001535, y: -1.1924294438045688 },\n { x: 0.0000022250000000001536, y: -1.1752307624750762 },\n { x: 0.0000022260000000001537, y: -1.2104636319322517 },\n { x: 0.0000022270000000001538, y: -1.155074548308587 },\n { x: 0.000002228000000000154, y: -1.1837161430559953 },\n { x: 0.000002229000000000154, y: -1.1923890731880866 },\n { x: 0.000002230000000000154, y: -1.1937185608674448 },\n { x: 0.000002231000000000154, y: -1.1868646120198374 },\n { x: 0.000002232000000000154, y: -1.1981177036411008 },\n { x: 0.000002233000000000154, y: -1.1372045199941465 },\n { x: 0.0000022340000000001543, y: -1.1500947858201753 },\n { x: 0.0000022350000000001544, y: -1.1612356802393617 },\n { x: 0.0000022360000000001544, y: -1.1732062417515428 },\n { x: 0.0000022370000000001545, y: -1.1992861521854046 },\n { x: 0.0000022380000000001546, y: -1.1945112082604952 },\n { x: 0.0000022390000000001547, y: -1.1760882121467615 },\n { x: 0.0000022400000000001547, y: -1.1601113252276647 },\n { x: 0.000002241000000000155, y: -1.1439224901223617 },\n { x: 0.000002242000000000155, y: -1.1547704321519372 },\n { x: 0.000002243000000000155, y: -1.170673766752924 },\n { x: 0.000002244000000000155, y: -1.126093179273305 },\n { x: 0.000002245000000000155, y: -1.165227583954706 },\n { x: 0.000002246000000000155, y: -1.1493644873470203 },\n { x: 0.0000022470000000001553, y: -1.1567661294009133 },\n { x: 0.0000022480000000001553, y: -1.107782891688032 },\n { x: 0.0000022490000000001554, y: -1.15201631887018 },\n { x: 0.0000022500000000001555, y: -1.1009009057101333 },\n { x: 0.0000022510000000001556, y: -1.1149168603313098 },\n { x: 0.0000022520000000001556, y: -1.1672744113046378 },\n { x: 0.0000022530000000001557, y: -1.1591160088368864 },\n { x: 0.0000022540000000001558, y: -1.1265483337539257 },\n { x: 0.000002255000000000156, y: -1.1292095536428317 },\n { x: 0.000002256000000000156, y: -1.1588148083431178 },\n { x: 0.000002257000000000156, y: -1.150888903458958 },\n { x: 0.000002258000000000156, y: -1.1034365029124422 },\n { x: 0.000002259000000000156, y: -1.118858677475327 },\n { x: 0.0000022600000000001562, y: -1.118025466894398 },\n { x: 0.0000022610000000001563, y: -1.1201425447339548 },\n { x: 0.0000022620000000001564, y: -1.079348766346186 },\n { x: 0.0000022630000000001565, y: -1.0818061281282823 },\n { x: 0.0000022640000000001565, y: -1.0816275613263364 },\n { x: 0.0000022650000000001566, y: -1.0855372447437086 },\n { x: 0.0000022660000000001567, y: -1.1103061208083056 },\n { x: 0.0000022670000000001568, y: -1.0678206663156318 },\n { x: 0.000002268000000000157, y: -1.0519978857739078 },\n { x: 0.000002269000000000157, y: -1.1113132445584515 },\n { x: 0.000002270000000000157, y: -1.0769208196942672 },\n { x: 0.000002271000000000157, y: -1.0670594454839735 },\n { x: 0.000002272000000000157, y: -1.0679897990303937 },\n { x: 0.0000022730000000001572, y: -1.1032504454144747 },\n { x: 0.0000022740000000001573, y: -1.0547875734564618 },\n { x: 0.0000022750000000001574, y: -1.070298090856433 },\n { x: 0.0000022760000000001574, y: -1.058545507616113 },\n { x: 0.0000022770000000001575, y: -1.032711359509102 },\n { x: 0.0000022780000000001576, y: -1.0957870643146737 },\n { x: 0.0000022790000000001577, y: -1.0648584519130846 },\n { x: 0.0000022800000000001577, y: -1.0177923712607453 },\n { x: 0.000002281000000000158, y: -1.0518369844027828 },\n { x: 0.000002282000000000158, y: -1.0662998151028957 },\n { x: 0.000002283000000000158, y: -1.0516312697026737 },\n { x: 0.000002284000000000158, y: -1.0527145248700152 },\n { x: 0.000002285000000000158, y: -1.0276906331732636 },\n { x: 0.000002286000000000158, y: -1.0517350949331168 },\n { x: 0.0000022870000000001583, y: -1.0271290852668449 },\n { x: 0.0000022880000000001583, y: -1.0408319080118253 },\n { x: 0.0000022890000000001584, y: -1.0497125809983106 },\n { x: 0.0000022900000000001585, y: -0.9904775030385523 },\n { x: 0.0000022910000000001586, y: -1.0000816901285665 },\n { x: 0.0000022920000000001586, y: -1.015584601937064 },\n { x: 0.0000022930000000001587, y: -1.007773690505279 },\n { x: 0.000002294000000000159, y: -0.9839536945625968 },\n { x: 0.000002295000000000159, y: -0.9815773762528389 },\n { x: 0.000002296000000000159, y: -1.0152624608434677 },\n { x: 0.000002297000000000159, y: -1.002600523745201 },\n { x: 0.000002298000000000159, y: -1.0264174750303148 },\n { x: 0.000002299000000000159, y: -1.0098950388254664 },\n { x: 0.0000023000000000001592, y: -0.9885558817913994 },\n { x: 0.0000023010000000001593, y: -1.0201784659098563 },\n { x: 0.0000023020000000001594, y: -0.9946775603998603 },\n { x: 0.0000023030000000001595, y: -0.9699039220306213 },\n { x: 0.0000023040000000001595, y: -1.0043708452905702 },\n { x: 0.0000023050000000001596, y: -0.9929122727817833 },\n { x: 0.0000023060000000001597, y: -0.9801997149116384 },\n { x: 0.0000023070000000001598, y: -0.9871669521845855 },\n { x: 0.00000230800000000016, y: -0.9573717698910257 },\n { x: 0.00000230900000000016, y: -0.9957282113470034 },\n { x: 0.00000231000000000016, y: -0.9393598763056146 },\n { x: 0.00000231100000000016, y: -0.9212155933346302 },\n { x: 0.00000231200000000016, y: -0.95676706694914 },\n { x: 0.0000023130000000001602, y: -0.9424792805278669 },\n { x: 0.0000023140000000001603, y: -0.9671742793017462 },\n { x: 0.0000023150000000001604, y: -0.9294478309233294 },\n { x: 0.0000023160000000001604, y: -0.9217912523481558 },\n { x: 0.0000023170000000001605, y: -0.9350809926457113 },\n { x: 0.0000023180000000001606, y: -0.9221849356251933 },\n { x: 0.0000023190000000001607, y: -0.9348296811828873 },\n { x: 0.0000023200000000001607, y: -0.9377073420135766 },\n { x: 0.000002321000000000161, y: -0.9338306966163311 },\n { x: 0.000002322000000000161, y: -0.90446236915445 },\n { x: 0.000002323000000000161, y: -0.8698346198414872 },\n { x: 0.000002324000000000161, y: -0.9211319622460409 },\n { x: 0.000002325000000000161, y: -0.9128822942885423 },\n { x: 0.000002326000000000161, y: -0.8681301727537557 },\n { x: 0.0000023270000000001613, y: -0.8723218309465678 },\n { x: 0.0000023280000000001613, y: -0.8632247422717597 },\n { x: 0.0000023290000000001614, y: -0.8628777953061457 },\n { x: 0.0000023300000000001615, y: -0.8422775633587523 },\n { x: 0.0000023310000000001616, y: -0.8617671836651793 },\n { x: 0.0000023320000000001616, y: -0.8336581392322593 },\n { x: 0.0000023330000000001617, y: -0.8391467977334258 },\n { x: 0.000002334000000000162, y: -0.878034198713163 },\n { x: 0.000002335000000000162, y: -0.8931727987222301 },\n { x: 0.000002336000000000162, y: -0.8636530864352051 },\n { x: 0.000002337000000000162, y: -0.8681278471310856 },\n { x: 0.000002338000000000162, y: -0.8195160557603954 },\n { x: 0.000002339000000000162, y: -0.8648588409173688 },\n { x: 0.0000023400000000001622, y: -0.8065159241068366 },\n { x: 0.0000023410000000001623, y: -0.8274771749548573 },\n { x: 0.0000023420000000001624, y: -0.8436961778430836 },\n { x: 0.0000023430000000001625, y: -0.8212340747694735 },\n { x: 0.0000023440000000001625, y: -0.8393787425492343 },\n { x: 0.0000023450000000001626, y: -0.8074927737470309 },\n { x: 0.0000023460000000001627, y: -0.8418699303977784 },\n { x: 0.0000023470000000001628, y: -0.8070928966541282 },\n { x: 0.000002348000000000163, y: -0.7883104331164187 },\n { x: 0.000002349000000000163, y: -0.8349963316752298 },\n { x: 0.000002350000000000163, y: -0.7853657029023338 },\n { x: 0.000002351000000000163, y: -0.8028047746162525 },\n { x: 0.000002352000000000163, y: -0.8161631240225915 },\n { x: 0.0000023530000000001632, y: -0.7799867088364262 },\n { x: 0.0000023540000000001633, y: -0.7519970201010164 },\n { x: 0.0000023550000000001634, y: -0.802521768463922 },\n { x: 0.0000023560000000001635, y: -0.7778319683787733 },\n { x: 0.0000023570000000001635, y: -0.8007778542447999 },\n { x: 0.0000023580000000001636, y: -0.790757528795572 },\n { x: 0.0000023590000000001637, y: -0.751071363495006 },\n { x: 0.0000023600000000001638, y: -0.7377765966961166 },\n { x: 0.000002361000000000164, y: -0.7129436183290365 },\n { x: 0.000002362000000000164, y: -0.7139996508740053 },\n { x: 0.000002363000000000164, y: -0.7264669566780427 },\n { x: 0.000002364000000000164, y: -0.7317054327514088 },\n { x: 0.000002365000000000164, y: -0.7488292210688796 },\n { x: 0.000002366000000000164, y: -0.6884826667943789 },\n { x: 0.0000023670000000001643, y: -0.7075832865729976 },\n { x: 0.0000023680000000001644, y: -0.6915499825415492 },\n { x: 0.0000023690000000001644, y: -0.6850849369832764 },\n { x: 0.0000023700000000001645, y: -0.7239955834260631 },\n { x: 0.0000023710000000001646, y: -0.6729359141885862 },\n { x: 0.0000023720000000001647, y: -0.677834834343801 },\n { x: 0.0000023730000000001647, y: -0.7281967299857802 },\n { x: 0.000002374000000000165, y: -0.674799073834172 },\n { x: 0.000002375000000000165, y: -0.6926508681810462 },\n { x: 0.000002376000000000165, y: -0.6925134095466664 },\n { x: 0.000002377000000000165, y: -0.6561408146936505 },\n { x: 0.000002378000000000165, y: -0.7045605904383241 },\n { x: 0.000002379000000000165, y: -0.6936969622698995 },\n { x: 0.0000023800000000001653, y: -0.6238196838440893 },\n { x: 0.0000023810000000001653, y: -0.6872495629060865 },\n { x: 0.0000023820000000001654, y: -0.6184585390211844 },\n { x: 0.0000023830000000001655, y: -0.6215494436836672 },\n { x: 0.0000023840000000001656, y: -0.6243731301575307 },\n { x: 0.0000023850000000001656, y: -0.6232058288702654 },\n { x: 0.0000023860000000001657, y: -0.6703009953677034 },\n { x: 0.0000023870000000001658, y: -0.6117805120661874 },\n { x: 0.000002388000000000166, y: -0.5917934031444606 },\n { x: 0.000002389000000000166, y: -0.6438296938824454 },\n { x: 0.000002390000000000166, y: -0.598350652587067 },\n { x: 0.000002391000000000166, y: -0.6107921196786794 },\n { x: 0.000002392000000000166, y: -0.6356405832534027 },\n { x: 0.0000023930000000001662, y: -0.5682657158033384 },\n { x: 0.0000023940000000001663, y: -0.5777583586565108 },\n { x: 0.0000023950000000001664, y: -0.5947770260036661 },\n { x: 0.0000023960000000001665, y: -0.5958471707478002 },\n { x: 0.0000023970000000001665, y: -0.5577077602540511 },\n { x: 0.0000023980000000001666, y: -0.5632594072916399 },\n { x: 0.0000023990000000001667, y: -0.5609320363309819 },\n { x: 0.0000024000000000001668, y: -0.5658335784766687 },\n { x: 0.000002401000000000167, y: -0.5929972071078811 },\n { x: 0.000002402000000000167, y: -0.5354208878810454 },\n { x: 0.000002403000000000167, y: -0.5599789084237445 },\n { x: 0.000002404000000000167, y: -0.5242449093053955 },\n { x: 0.000002405000000000167, y: -0.5162730148369371 },\n { x: 0.000002406000000000167, y: -0.5680614304312296 },\n { x: 0.0000024070000000001673, y: -0.5218515715169217 },\n { x: 0.0000024080000000001674, y: -0.5216434385688059 },\n { x: 0.0000024090000000001674, y: -0.5000522615760793 },\n { x: 0.0000024100000000001675, y: -0.49269311908697444 },\n { x: 0.0000024110000000001676, y: -0.5284569477774332 },\n { x: 0.0000024120000000001677, y: -0.5225508255167066 },\n { x: 0.0000024130000000001677, y: -0.48499096544340026 },\n { x: 0.000002414000000000168, y: -0.5071563023105641 },\n { x: 0.000002415000000000168, y: -0.5063415532993574 },\n { x: 0.000002416000000000168, y: -0.49452662679542136 },\n { x: 0.000002417000000000168, y: -0.4597341366445032 },\n { x: 0.000002418000000000168, y: -0.4945018018640034 },\n { x: 0.000002419000000000168, y: -0.4534957207717517 },\n { x: 0.0000024200000000001683, y: -0.4705131894858341 },\n { x: 0.0000024210000000001683, y: -0.431024404227471 },\n { x: 0.0000024220000000001684, y: -0.4828906664039683 },\n { x: 0.0000024230000000001685, y: -0.4754051043691047 },\n { x: 0.0000024240000000001686, y: -0.47416575816968237 },\n { x: 0.0000024250000000001686, y: -0.47753355875265197 },\n { x: 0.0000024260000000001687, y: -0.45398698381985414 },\n { x: 0.0000024270000000001688, y: -0.4180357361647906 },\n { x: 0.000002428000000000169, y: -0.4516942430630965 },\n { x: 0.000002429000000000169, y: -0.45323668107092047 },\n { x: 0.000002430000000000169, y: -0.37998947165494285 },\n { x: 0.000002431000000000169, y: -0.38324799407885485 },\n { x: 0.000002432000000000169, y: -0.4181014651824893 },\n { x: 0.0000024330000000001692, y: -0.3655611066318295 },\n { x: 0.0000024340000000001693, y: -0.3963674545224115 },\n { x: 0.0000024350000000001694, y: -0.4152501067147071 },\n { x: 0.0000024360000000001695, y: -0.3923445582246408 },\n { x: 0.0000024370000000001695, y: -0.41090017228954034 },\n { x: 0.0000024380000000001696, y: -0.3549037198766325 },\n { x: 0.0000024390000000001697, y: -0.37411426024649663 },\n { x: 0.0000024400000000001698, y: -0.3954342754390548 },\n { x: 0.00000244100000000017, y: -0.379693594703644 },\n { x: 0.00000244200000000017, y: -0.3309119560453535 },\n { x: 0.00000244300000000017, y: -0.3276068650374942 },\n { x: 0.00000244400000000017, y: -0.35458878436642977 },\n { x: 0.00000244500000000017, y: -0.34608792563202195 },\n { x: 0.0000024460000000001702, y: -0.3309771636875109 },\n { x: 0.0000024470000000001703, y: -0.3005434980746519 },\n { x: 0.0000024480000000001704, y: -0.31442668415766956 },\n { x: 0.0000024490000000001704, y: -0.2850469754508962 },\n { x: 0.0000024500000000001705, y: -0.30415110571487286 },\n { x: 0.0000024510000000001706, y: -0.3462071153358029 },\n { x: 0.0000024520000000001707, y: -0.2822959911386574 },\n { x: 0.0000024530000000001707, y: -0.3088294167067626 },\n { x: 0.000002454000000000171, y: -0.2947572094272783 },\n { x: 0.000002455000000000171, y: -0.30510576818626395 },\n { x: 0.000002456000000000171, y: -0.3030284542363821 },\n { x: 0.000002457000000000171, y: -0.30656188882895175 },\n { x: 0.000002458000000000171, y: -0.29105234358830595 },\n { x: 0.000002459000000000171, y: -0.28606941189692736 },\n { x: 0.0000024600000000001713, y: -0.2291321457041728 },\n { x: 0.0000024610000000001713, y: -0.2880722088808652 },\n { x: 0.0000024620000000001714, y: -0.28096806307754785 },\n { x: 0.0000024630000000001715, y: -0.22101289464323637 },\n { x: 0.0000024640000000001716, y: -0.26682907979495035 },\n { x: 0.0000024650000000001716, y: -0.22461804644893746 },\n { x: 0.0000024660000000001717, y: -0.26411959533601004 },\n { x: 0.000002467000000000172, y: -0.25241369359838783 },\n { x: 0.000002468000000000172, y: -0.2234563917400324 },\n { x: 0.000002469000000000172, y: -0.18999173911706954 },\n { x: 0.000002470000000000172, y: -0.18021333518928684 },\n { x: 0.000002471000000000172, y: -0.19279176065785986 },\n { x: 0.000002472000000000172, y: -0.20107063030255418 },\n { x: 0.0000024730000000001722, y: -0.17999608780213525 },\n { x: 0.0000024740000000001723, y: -0.18723650947814263 },\n { x: 0.0000024750000000001724, y: -0.16167216750868554 },\n { x: 0.0000024760000000001725, y: -0.18711127289627277 },\n { x: 0.0000024770000000001725, y: -0.16169546018579953 },\n { x: 0.0000024780000000001726, y: -0.16369478259423073 },\n { x: 0.0000024790000000001727, y: -0.18576784473988425 },\n { x: 0.0000024800000000001728, y: -0.17131565828677353 },\n { x: 0.000002481000000000173, y: -0.1546212887442107 },\n { x: 0.000002482000000000173, y: -0.13566243561309224 },\n { x: 0.000002483000000000173, y: -0.17831141609823592 },\n { x: 0.000002484000000000173, y: -0.17179442870317502 },\n { x: 0.000002485000000000173, y: -0.13206003705093278 },\n { x: 0.0000024860000000001732, y: -0.13270009294317633 },\n { x: 0.0000024870000000001733, y: -0.13437298016435997 },\n { x: 0.0000024880000000001734, y: -0.09344525529532807 },\n { x: 0.0000024890000000001734, y: -0.11248741659954725 },\n { x: 0.0000024900000000001735, y: -0.11104782529678112 },\n { x: 0.0000024910000000001736, y: -0.11290746735501864 },\n { x: 0.0000024920000000001737, y: -0.12455405493285901 },\n { x: 0.0000024930000000001737, y: -0.09663488965899512 },\n { x: 0.000002494000000000174, y: -0.07693987525036725 },\n { x: 0.000002495000000000174, y: -0.05517965015024491 },\n { x: 0.000002496000000000174, y: -0.06564972913360982 },\n { x: 0.000002497000000000174, y: -0.07415726055045603 },\n { x: 0.000002498000000000174, y: -0.10890117898470059 },\n { x: 0.000002499000000000174, y: -0.05717810655851217 },\n { x: 0.0000025000000000001743, y: -0.044507267028509295 },\n { x: 0.0000025010000000001743, y: -0.03166149444390001 },\n { x: 0.0000025020000000001744, y: -0.05946737925973119 },\n { x: 0.0000025030000000001745, y: -0.03780260574207762 },\n { x: 0.0000025040000000001746, y: -0.01929642714223637 },\n { x: 0.0000025050000000001746, y: -0.0498784148077263 },\n { x: 0.0000025060000000001747, y: -0.01218401030295406 },\n { x: 0.000002507000000000175, y: -0.017809948692081117 },\n { x: 0.000002508000000000175, y: -0.010990216664137437 },\n { x: 0.000002509000000000175, y: -0.02296580743899924 },\n { x: 0.000002510000000000175, y: -0.04053020068899563 },\n { x: 0.000002511000000000175, y: 0.02169781421810913 },\n { x: 0.000002512000000000175, y: 0.010397988522018373 },\n { x: 0.0000025130000000001752, y: 0.00227231972249545 },\n { x: 0.0000025140000000001753, y: 0.028869025336646478 },\n { x: 0.0000025150000000001754, y: 0.01902856501225133 },\n { x: 0.0000025160000000001755, y: 0.017926343530677586 },\n { x: 0.0000025170000000001755, y: 0.03885327968763129 },\n { x: 0.0000025180000000001756, y: -0.01162658912013808 },\n { x: 0.0000025190000000001757, y: -0.0031947302812319264 },\n { x: 0.0000025200000000001758, y: 0.034856364770516624 },\n { x: 0.000002521000000000176, y: 0.034841968231742154 },\n { x: 0.000002522000000000176, y: 0.021316845251639197 },\n { x: 0.000002523000000000176, y: 0.02696495647258669 },\n { x: 0.000002524000000000176, y: 0.02673217851799009 },\n { x: 0.000002525000000000176, y: 0.07175393683754153 },\n { x: 0.0000025260000000001762, y: 0.031240770974422107 },\n { x: 0.0000025270000000001763, y: 0.0660126897852671 },\n { x: 0.0000025280000000001764, y: 0.07124352645993412 },\n { x: 0.0000025290000000001764, y: 0.06286961362475643 },\n { x: 0.0000025300000000001765, y: 0.11685317728029213 },\n { x: 0.0000025310000000001766, y: 0.07920082948662328 },\n { x: 0.0000025320000000001767, y: 0.055154502035767404 },\n { x: 0.0000025330000000001767, y: 0.10585110764067374 },\n { x: 0.000002534000000000177, y: 0.06187860896225339 },\n { x: 0.000002535000000000177, y: 0.09956613044874507 },\n { x: 0.000002536000000000177, y: 0.13451941085834254 },\n { x: 0.000002537000000000177, y: 0.10075404593254048 },\n { x: 0.000002538000000000177, y: 0.10456551659403011 },\n { x: 0.000002539000000000177, y: 0.09718715020479415 },\n { x: 0.0000025400000000001773, y: 0.10105958985617373 },\n { x: 0.0000025410000000001774, y: 0.19799401508124528 },\n { x: 0.0000025420000000001774, y: 0.15730205881544382 },\n { x: 0.0000025430000000001775, y: 0.14787913165361638 },\n { x: 0.0000025440000000001776, y: 0.13064690543152924 },\n { x: 0.0000025450000000001777, y: 0.15133248739999616 },\n { x: 0.0000025460000000001777, y: 0.15171092480519321 },\n { x: 0.000002547000000000178, y: 0.1430756168127764 },\n { x: 0.000002548000000000178, y: 0.17691330353538567 },\n { x: 0.000002549000000000178, y: 0.20466579408576377 },\n { x: 0.000002550000000000178, y: 0.13802251379639136 },\n { x: 0.000002551000000000178, y: 0.18051156796859189 },\n { x: 0.000002552000000000178, y: 0.15866129045569125 },\n { x: 0.0000025530000000001783, y: 0.21630961329226683 },\n { x: 0.0000025540000000001783, y: 0.19017542432235535 },\n { x: 0.0000025550000000001784, y: 0.21392373766443332 },\n { x: 0.0000025560000000001785, y: 0.1784114243585263 },\n { x: 0.0000025570000000001786, y: 0.21270015198691658 },\n { x: 0.0000025580000000001786, y: 0.22986434961374125 },\n { x: 0.0000025590000000001787, y: 0.19892184999054646 },\n { x: 0.0000025600000000001788, y: 0.23982333589279217 },\n { x: 0.000002561000000000179, y: 0.2310991619474565 },\n { x: 0.000002562000000000179, y: 0.2328379686348432 },\n { x: 0.000002563000000000179, y: 0.22016175467841323 },\n { x: 0.000002564000000000179, y: 0.2215253263906854 },\n { x: 0.000002565000000000179, y: 0.25061875543160295 },\n { x: 0.0000025660000000001792, y: 0.2772938023288315 },\n { x: 0.0000025670000000001793, y: 0.2861226720342499 },\n { x: 0.0000025680000000001794, y: 0.24566325565750188 },\n { x: 0.0000025690000000001795, y: 0.23359821478888176 },\n { x: 0.0000025700000000001795, y: 0.24413574378488537 },\n { x: 0.0000025710000000001796, y: 0.25925409971906455 },\n { x: 0.0000025720000000001797, y: 0.2680102233695851 },\n { x: 0.0000025730000000001798, y: 0.2835187231735638 },\n { x: 0.00000257400000000018, y: 0.25896261696102213 },\n { x: 0.00000257500000000018, y: 0.27728786930336385 },\n { x: 0.00000257600000000018, y: 0.29487327411884984 },\n { x: 0.00000257700000000018, y: 0.2829869503805984 },\n { x: 0.00000257800000000018, y: 0.2785208605542552 },\n { x: 0.00000257900000000018, y: 0.2805574219877335 },\n { x: 0.0000025800000000001803, y: 0.2945417418926183 },\n { x: 0.0000025810000000001804, y: 0.3386860928803425 },\n { x: 0.0000025820000000001804, y: 0.32295701628266055 },\n { x: 0.0000025830000000001805, y: 0.30263879122037435 },\n { x: 0.0000025840000000001806, y: 0.318907693431956 },\n { x: 0.0000025850000000001807, y: 0.3323064662277334 },\n { x: 0.0000025860000000001807, y: 0.31203722079763047 },\n { x: 0.000002587000000000181, y: 0.3250750119397284 },\n { x: 0.000002588000000000181, y: 0.3424634668701344 },\n { x: 0.000002589000000000181, y: 0.344828274713252 },\n { x: 0.000002590000000000181, y: 0.3540132645116023 },\n { x: 0.000002591000000000181, y: 0.3608681390065181 },\n { x: 0.000002592000000000181, y: 0.3485198395584777 },\n { x: 0.0000025930000000001813, y: 0.3506379350663991 },\n { x: 0.0000025940000000001813, y: 0.331915516959402 },\n { x: 0.0000025950000000001814, y: 0.34527735092327994 },\n { x: 0.0000025960000000001815, y: 0.4000351811343407 },\n { x: 0.0000025970000000001816, y: 0.39388941446463327 },\n { x: 0.0000025980000000001816, y: 0.3398543087839083 },\n { x: 0.0000025990000000001817, y: 0.372305564665714 },\n { x: 0.0000026000000000001818, y: 0.3838317633621279 },\n { x: 0.000002601000000000182, y: 0.41529437014667353 },\n { x: 0.000002602000000000182, y: 0.41304834547927105 },\n { x: 0.000002603000000000182, y: 0.4041870055323724 },\n { x: 0.000002604000000000182, y: 0.43587020295938855 },\n { x: 0.000002605000000000182, y: 0.4310568971971567 },\n { x: 0.0000026060000000001822, y: 0.43714794523535655 },\n { x: 0.0000026070000000001823, y: 0.40886668072126864 },\n { x: 0.0000026080000000001824, y: 0.4433694137108774 },\n { x: 0.0000026090000000001825, y: 0.4050889122740359 },\n { x: 0.0000026100000000001825, y: 0.4310772621906473 },\n { x: 0.0000026110000000001826, y: 0.4006271206163106 },\n { x: 0.0000026120000000001827, y: 0.3962460208615274 },\n { x: 0.0000026130000000001828, y: 0.3975686990296928 },\n { x: 0.000002614000000000183, y: 0.4667753352533014 },\n { x: 0.000002615000000000183, y: 0.46286901552752735 },\n { x: 0.000002616000000000183, y: 0.4692490057551146 },\n { x: 0.000002617000000000183, y: 0.42994799435188014 },\n { x: 0.000002618000000000183, y: 0.4634064627849226 },\n { x: 0.000002619000000000183, y: 0.4301614556194292 },\n { x: 0.0000026200000000001833, y: 0.44504568636494807 },\n { x: 0.0000026210000000001834, y: 0.465746434910619 },\n { x: 0.0000026220000000001834, y: 0.43157760113541255 },\n { x: 0.0000026230000000001835, y: 0.46456271138277544 },\n { x: 0.0000026240000000001836, y: 0.4473545111102838 },\n { x: 0.0000026250000000001837, y: 0.45581795130307107 },\n { x: 0.0000026260000000001837, y: 0.5166751972213512 },\n { x: 0.000002627000000000184, y: 0.48019312519732454 },\n { x: 0.000002628000000000184, y: 0.46975464117309257 },\n { x: 0.000002629000000000184, y: 0.4926981334934373 },\n { x: 0.000002630000000000184, y: 0.47934119963743727 },\n { x: 0.000002631000000000184, y: 0.5039408718465962 },\n { x: 0.000002632000000000184, y: 0.49937969688982364 },\n { x: 0.0000026330000000001843, y: 0.49529023474703376 },\n { x: 0.0000026340000000001843, y: 0.5009090133767484 },\n { x: 0.0000026350000000001844, y: 0.5232374406992164 },\n { x: 0.0000026360000000001845, y: 0.4991756250779322 },\n { x: 0.0000026370000000001846, y: 0.5031570010570516 },\n { x: 0.0000026380000000001846, y: 0.5325824248998609 },\n { x: 0.0000026390000000001847, y: 0.5551110810471244 },\n { x: 0.0000026400000000001848, y: 0.4917482604186644 },\n { x: 0.000002641000000000185, y: 0.5244546057444699 },\n { x: 0.000002642000000000185, y: 0.5116575105128615 },\n { x: 0.000002643000000000185, y: 0.5180018668401769 },\n { x: 0.000002644000000000185, y: 0.5728935876234474 },\n { x: 0.000002645000000000185, y: 0.571021578576603 },\n { x: 0.0000026460000000001852, y: 0.5391673816733841 },\n { x: 0.0000026470000000001853, y: 0.5233207093244425 },\n { x: 0.0000026480000000001854, y: 0.5790585065793126 },\n { x: 0.0000026490000000001855, y: 0.5266473345654257 },\n { x: 0.0000026500000000001855, y: 0.5299398343837128 },\n { x: 0.0000026510000000001856, y: 0.5503727252229598 },\n { x: 0.0000026520000000001857, y: 0.5890831324182434 },\n { x: 0.0000026530000000001858, y: 0.5434410835149216 },\n { x: 0.000002654000000000186, y: 0.5381805041592544 },\n { x: 0.000002655000000000186, y: 0.5986137865748076 },\n { x: 0.000002656000000000186, y: 0.6109471619427517 },\n { x: 0.000002657000000000186, y: 0.5510079300346555 },\n { x: 0.000002658000000000186, y: 0.5516906368691389 },\n { x: 0.0000026590000000001862, y: 0.5809096403298828 },\n { x: 0.0000026600000000001863, y: 0.6157549680813351 },\n { x: 0.0000026610000000001864, y: 0.5824277458242549 },\n { x: 0.0000026620000000001864, y: 0.5807834397904956 },\n { x: 0.0000026630000000001865, y: 0.6122324203702777 },\n { x: 0.0000026640000000001866, y: 0.5682248787778075 },\n { x: 0.0000026650000000001867, y: 0.6364895547423738 },\n { x: 0.0000026660000000001867, y: 0.6367852849831123 },\n { x: 0.000002667000000000187, y: 0.6301263973616424 },\n { x: 0.000002668000000000187, y: 0.6369228813944692 },\n { x: 0.000002669000000000187, y: 0.6129163568466053 },\n { x: 0.000002670000000000187, y: 0.5803002292933409 },\n { x: 0.000002671000000000187, y: 0.5988221700276009 },\n { x: 0.000002672000000000187, y: 0.6354143321436927 },\n { x: 0.0000026730000000001873, y: 0.6581870758899424 },\n { x: 0.0000026740000000001873, y: 0.6145825823815865 },\n { x: 0.0000026750000000001874, y: 0.6036896789836707 },\n { x: 0.0000026760000000001875, y: 0.6644893156241612 },\n { x: 0.0000026770000000001876, y: 0.6211856028677928 },\n { x: 0.0000026780000000001876, y: 0.634166865042745 },\n { x: 0.0000026790000000001877, y: 0.6391570014951409 },\n { x: 0.000002680000000000188, y: 0.6235583799678183 },\n { x: 0.000002681000000000188, y: 0.661715153993567 },\n { x: 0.000002682000000000188, y: 0.6130362967431036 },\n { x: 0.000002683000000000188, y: 0.6163290608816756 },\n { x: 0.000002684000000000188, y: 0.621920638205098 },\n { x: 0.000002685000000000188, y: 0.6571183173838694 },\n { x: 0.0000026860000000001882, y: 0.6202144778072248 },\n { x: 0.0000026870000000001883, y: 0.6740649438969156 },\n { x: 0.0000026880000000001884, y: 0.6963333587536268 },\n { x: 0.0000026890000000001885, y: 0.6868713715811054 },\n { x: 0.0000026900000000001885, y: 0.6801575174287627 },\n { x: 0.0000026910000000001886, y: 0.6303386948017062 },\n { x: 0.0000026920000000001887, y: 0.681160569708664 },\n { x: 0.0000026930000000001888, y: 0.6960124695125789 },\n { x: 0.000002694000000000189, y: 0.6959992053417199 },\n { x: 0.000002695000000000189, y: 0.665865778332864 },\n { x: 0.000002696000000000189, y: 0.6776158496887771 },\n { x: 0.000002697000000000189, y: 0.7008951886731878 },\n { x: 0.000002698000000000189, y: 0.6675595996175626 },\n { x: 0.0000026990000000001892, y: 0.7117689624781781 },\n { x: 0.0000027000000000001893, y: 0.6545064997667815 },\n { x: 0.0000027010000000001894, y: 0.7230932420436397 },\n { x: 0.0000027020000000001894, y: 0.7152655516321059 },\n { x: 0.0000027030000000001895, y: 0.7001993852036024 },\n { x: 0.0000027040000000001896, y: 0.7170472339005718 },\n { x: 0.0000027050000000001897, y: 0.7342749728528719 },\n { x: 0.0000027060000000001897, y: 0.6655142590877691 },\n { x: 0.00000270700000000019, y: 0.6641503747559637 },\n { x: 0.00000270800000000019, y: 0.7267693077856443 },\n { x: 0.00000270900000000019, y: 0.7371590014488312 },\n { x: 0.00000271000000000019, y: 0.6822593061619309 },\n { x: 0.00000271100000000019, y: 0.6916652631795677 },\n { x: 0.00000271200000000019, y: 0.6794633711571757 },\n { x: 0.0000027130000000001903, y: 0.7376521218068873 },\n { x: 0.0000027140000000001903, y: 0.7220004566269178 },\n { x: 0.0000027150000000001904, y: 0.7037104569394929 },\n { x: 0.0000027160000000001905, y: 0.7356446439838722 },\n { x: 0.0000027170000000001906, y: 0.7340941761495073 },\n { x: 0.0000027180000000001906, y: 0.7124752155844226 },\n { x: 0.0000027190000000001907, y: 0.7397050665323006 },\n { x: 0.000002720000000000191, y: 0.7169108115717007 },\n { x: 0.000002721000000000191, y: 0.7336679215398737 },\n { x: 0.000002722000000000191, y: 0.7347476000524897 },\n { x: 0.000002723000000000191, y: 0.7214815051889556 },\n { x: 0.000002724000000000191, y: 0.7084638455258885 },\n { x: 0.000002725000000000191, y: 0.7024557472716381 },\n { x: 0.0000027260000000001912, y: 0.7118278674174795 },\n { x: 0.0000027270000000001913, y: 0.7697487965677479 },\n { x: 0.0000027280000000001914, y: 0.7118320029072236 },\n { x: 0.0000027290000000001915, y: 0.7340378553864686 },\n { x: 0.0000027300000000001915, y: 0.7564257793349525 },\n { x: 0.0000027310000000001916, y: 0.7443729205646559 },\n { x: 0.0000027320000000001917, y: 0.7082096243602418 },\n { x: 0.0000027330000000001918, y: 0.7347467168308663 },\n { x: 0.000002734000000000192, y: 0.7193104500238281 },\n { x: 0.000002735000000000192, y: 0.7217556796192299 },\n { x: 0.000002736000000000192, y: 0.7602814158498283 },\n { x: 0.000002737000000000192, y: 0.7237963434152892 },\n { x: 0.000002738000000000192, y: 0.7354313096162569 },\n { x: 0.0000027390000000001922, y: 0.7695296873312432 },\n { x: 0.0000027400000000001923, y: 0.7473876554680158 },\n { x: 0.0000027410000000001924, y: 0.7887672527897815 },\n { x: 0.0000027420000000001925, y: 0.7365271719313455 },\n { x: 0.0000027430000000001925, y: 0.7622104476183755 },\n { x: 0.0000027440000000001926, y: 0.759922239111059 },\n { x: 0.0000027450000000001927, y: 0.7716827285287791 },\n { x: 0.0000027460000000001928, y: 0.7760312155155824 },\n { x: 0.000002747000000000193, y: 0.7375188084834007 },\n { x: 0.000002748000000000193, y: 0.75771266711046 },\n { x: 0.000002749000000000193, y: 0.7899635933795764 },\n { x: 0.000002750000000000193, y: 0.7371939551663986 },\n { x: 0.000002751000000000193, y: 0.801014572705638 },\n { x: 0.000002752000000000193, y: 0.7346419747151698 },\n { x: 0.0000027530000000001933, y: 0.7730448978953918 },\n { x: 0.0000027540000000001934, y: 0.7878243977099655 },\n { x: 0.0000027550000000001934, y: 0.8013602086474488 },\n { x: 0.0000027560000000001935, y: 0.7376080214635072 },\n { x: 0.0000027570000000001936, y: 0.793891213850553 },\n { x: 0.0000027580000000001937, y: 0.7481157293669828 },\n { x: 0.0000027590000000001937, y: 0.7510456402610325 },\n { x: 0.000002760000000000194, y: 0.8054082490322473 },\n { x: 0.000002761000000000194, y: 0.7816317125000892 },\n { x: 0.000002762000000000194, y: 0.737728876700332 },\n { x: 0.000002763000000000194, y: 0.7739004551931284 },\n { x: 0.000002764000000000194, y: 0.7633930901102277 },\n { x: 0.000002765000000000194, y: 0.7897011603827734 },\n { x: 0.0000027660000000001943, y: 0.7560328367101616 },\n { x: 0.0000027670000000001943, y: 0.7939422073459839 },\n { x: 0.0000027680000000001944, y: 0.7827372074588763 },\n { x: 0.0000027690000000001945, y: 0.7573586343124319 },\n { x: 0.0000027700000000001946, y: 0.798323615372741 },\n { x: 0.0000027710000000001946, y: 0.7546747165305211 },\n { x: 0.0000027720000000001947, y: 0.7482248385133946 },\n { x: 0.0000027730000000001948, y: 0.7567888508853853 },\n { x: 0.000002774000000000195, y: 0.753604845528295 },\n { x: 0.000002775000000000195, y: 0.7934727902343959 },\n { x: 0.000002776000000000195, y: 0.810676252400137 },\n { x: 0.000002777000000000195, y: 0.7956199857452727 },\n { x: 0.000002778000000000195, y: 0.8230095453118499 },\n { x: 0.0000027790000000001952, y: 0.8217849927519632 },\n { x: 0.0000027800000000001953, y: 0.7631604408415177 },\n { x: 0.0000027810000000001954, y: 0.8213208187341712 },\n { x: 0.0000027820000000001955, y: 0.7734683985868821 },\n { x: 0.0000027830000000001955, y: 0.782203586554138 },\n { x: 0.0000027840000000001956, y: 0.8151991220550522 },\n { x: 0.0000027850000000001957, y: 0.8107903365350744 },\n { x: 0.0000027860000000001958, y: 0.7739831625092467 },\n { x: 0.000002787000000000196, y: 0.7688714286812638 },\n { x: 0.000002788000000000196, y: 0.7944913708372867 },\n { x: 0.000002789000000000196, y: 0.7864705280363402 },\n { x: 0.000002790000000000196, y: 0.7591993208217006 },\n { x: 0.000002791000000000196, y: 0.7895889136712934 },\n { x: 0.000002792000000000196, y: 0.8182349759965467 },\n { x: 0.0000027930000000001963, y: 0.7846041242554446 },\n { x: 0.0000027940000000001964, y: 0.7951279045333552 },\n { x: 0.0000027950000000001964, y: 0.7981406989521761 },\n { x: 0.0000027960000000001965, y: 0.7815773167617462 },\n { x: 0.0000027970000000001966, y: 0.7663759216374127 },\n { x: 0.0000027980000000001967, y: 0.7838290871940248 },\n { x: 0.0000027990000000001967, y: 0.7983593381803468 },\n { x: 0.000002800000000000197, y: 0.7525548828869657 },\n { x: 0.000002801000000000197, y: 0.8212197474672228 },\n { x: 0.000002802000000000197, y: 0.7749962002326138 },\n { x: 0.000002803000000000197, y: 0.76638181540985 },\n { x: 0.000002804000000000197, y: 0.7802293181223559 },\n { x: 0.000002805000000000197, y: 0.7769220521634627 },\n { x: 0.0000028060000000001973, y: 0.786587797159431 },\n { x: 0.0000028070000000001973, y: 0.7827700742639933 },\n { x: 0.0000028080000000001974, y: 0.7591626865548814 },\n { x: 0.0000028090000000001975, y: 0.7863620802702915 },\n { x: 0.0000028100000000001976, y: 0.7567615295701122 },\n { x: 0.0000028110000000001976, y: 0.8512174564692979 },\n { x: 0.0000028120000000001977, y: 0.7508603274861254 },\n { x: 0.0000028130000000001978, y: 0.771509410383711 },\n { x: 0.000002814000000000198, y: 0.7841360817289958 },\n { x: 0.000002815000000000198, y: 0.781330448283536 },\n { x: 0.000002816000000000198, y: 0.7668814952450571 },\n { x: 0.000002817000000000198, y: 0.7852339002863445 },\n { x: 0.000002818000000000198, y: 0.8045854330291735 },\n { x: 0.0000028190000000001982, y: 0.8117118789267445 },\n { x: 0.0000028200000000001983, y: 0.7964819608750886 },\n { x: 0.0000028210000000001984, y: 0.7642314732771622 },\n { x: 0.0000028220000000001985, y: 0.767788701575244 },\n { x: 0.0000028230000000001985, y: 0.7545896273185719 },\n { x: 0.0000028240000000001986, y: 0.7670135719361161 },\n { x: 0.0000028250000000001987, y: 0.776489768698379 },\n { x: 0.0000028260000000001988, y: 0.7707513477197501 },\n { x: 0.000002827000000000199, y: 0.7956990289629834 },\n { x: 0.000002828000000000199, y: 0.7464042723655999 },\n { x: 0.000002829000000000199, y: 0.7630537764135136 },\n { x: 0.000002830000000000199, y: 0.8112271560025841 },\n { x: 0.000002831000000000199, y: 0.7482093728408432 },\n { x: 0.0000028320000000001992, y: 0.7971430465769822 },\n { x: 0.0000028330000000001993, y: 0.7427053120890292 },\n { x: 0.0000028340000000001994, y: 0.7720169130016905 },\n { x: 0.0000028350000000001994, y: 0.7864622512674394 },\n { x: 0.0000028360000000001995, y: 0.7717803923168035 },\n { x: 0.0000028370000000001996, y: 0.7658028092752694 },\n { x: 0.0000028380000000001997, y: 0.7392771088737514 },\n { x: 0.0000028390000000001997, y: 0.7924686585526886 },\n { x: 0.0000028400000000002, y: 0.7474299100430132 },\n { x: 0.0000028410000000002, y: 0.7430508775093344 },\n { x: 0.0000028420000000002, y: 0.7637892187832406 },\n { x: 0.0000028430000000002, y: 0.7621379094589217 },\n { x: 0.0000028440000000002, y: 0.7691954236060945 },\n { x: 0.0000028450000000002, y: 0.7604740781957471 },\n { x: 0.0000028460000000002003, y: 0.7533316213397995 },\n { x: 0.0000028470000000002003, y: 0.733534496514143 },\n { x: 0.0000028480000000002004, y: 0.7406852856007478 },\n { x: 0.0000028490000000002005, y: 0.8024655695950724 },\n { x: 0.0000028500000000002006, y: 0.7765870306601449 },\n { x: 0.0000028510000000002006, y: 0.7570494947784607 },\n { x: 0.0000028520000000002007, y: 0.7772564645890533 },\n { x: 0.000002853000000000201, y: 0.7338847289490747 },\n { x: 0.000002854000000000201, y: 0.7344372554879921 },\n { x: 0.000002855000000000201, y: 0.760865899145752 },\n { x: 0.000002856000000000201, y: 0.728391935157656 },\n { x: 0.000002857000000000201, y: 0.7297036663397427 },\n { x: 0.000002858000000000201, y: 0.7595273521720526 },\n { x: 0.0000028590000000002012, y: 0.7630994243495298 },\n { x: 0.0000028600000000002013, y: 0.7768321326373545 },\n { x: 0.0000028610000000002014, y: 0.7371941853307857 },\n { x: 0.0000028620000000002015, y: 0.7718452236971518 },\n { x: 0.0000028630000000002015, y: 0.7255050772966469 },\n { x: 0.0000028640000000002016, y: 0.7595980974960304 },\n { x: 0.0000028650000000002017, y: 0.7443690761485993 },\n { x: 0.0000028660000000002018, y: 0.7763706035093906 },\n { x: 0.000002867000000000202, y: 0.765830136812253 },\n { x: 0.000002868000000000202, y: 0.7832203021729911 },\n { x: 0.000002869000000000202, y: 0.7641234591714927 },\n { x: 0.000002870000000000202, y: 0.7155313199497109 },\n { x: 0.000002871000000000202, y: 0.7688497258272269 },\n { x: 0.0000028720000000002022, y: 0.7500660338112418 },\n { x: 0.0000028730000000002023, y: 0.7125848850884627 },\n { x: 0.0000028740000000002024, y: 0.7392716584564772 },\n { x: 0.0000028750000000002024, y: 0.7485035309834968 },\n { x: 0.0000028760000000002025, y: 0.7437759238901553 },\n { x: 0.0000028770000000002026, y: 0.7250862500058989 },\n { x: 0.0000028780000000002027, y: 0.7343829198329125 },\n { x: 0.0000028790000000002027, y: 0.7348355290801867 },\n { x: 0.000002880000000000203, y: 0.6913486874814634 },\n { x: 0.000002881000000000203, y: 0.7122497839547313 },\n { x: 0.000002882000000000203, y: 0.7180340610111401 },\n { x: 0.000002883000000000203, y: 0.751442300197788 },\n { x: 0.000002884000000000203, y: 0.7064022082389504 },\n { x: 0.000002885000000000203, y: 0.6915746554626758 },\n { x: 0.0000028860000000002033, y: 0.7403966100026745 },\n { x: 0.0000028870000000002033, y: 0.7502800199449855 },\n { x: 0.0000028880000000002034, y: 0.6954108060963011 },\n { x: 0.0000028890000000002035, y: 0.7399438902519763 },\n { x: 0.0000028900000000002036, y: 0.6881611386264651 },\n { x: 0.0000028910000000002036, y: 0.6883583927942954 },\n { x: 0.0000028920000000002037, y: 0.673649669089998 },\n { x: 0.000002893000000000204, y: 0.7373819783907827 },\n { x: 0.000002894000000000204, y: 0.6775216753790888 },\n { x: 0.000002895000000000204, y: 0.6911629701200532 },\n { x: 0.000002896000000000204, y: 0.7211812124276452 },\n { x: 0.000002897000000000204, y: 0.7160704162569042 },\n { x: 0.000002898000000000204, y: 0.676371455922578 },\n { x: 0.0000028990000000002042, y: 0.7274802956547528 },\n { x: 0.0000029000000000002043, y: 0.683049828459433 },\n { x: 0.0000029010000000002044, y: 0.6900989360913905 },\n { x: 0.0000029020000000002045, y: 0.7047533973435269 },\n { x: 0.0000029030000000002045, y: 0.654995021504275 },\n { x: 0.0000029040000000002046, y: 0.6841284222377781 },\n { x: 0.0000029050000000002047, y: 0.6732941982214122 },\n { x: 0.0000029060000000002048, y: 0.7145912334252882 },\n { x: 0.000002907000000000205, y: 0.6543401172757951 },\n { x: 0.000002908000000000205, y: 0.6573577029992239 },\n { x: 0.000002909000000000205, y: 0.7159432289690105 },\n { x: 0.000002910000000000205, y: 0.6807836422776883 },\n { x: 0.000002911000000000205, y: 0.7027154560636988 },\n { x: 0.0000029120000000002052, y: 0.6370273563736593 },\n { x: 0.0000029130000000002053, y: 0.6566650252651687 },\n { x: 0.0000029140000000002054, y: 0.6856754434755157 },\n { x: 0.0000029150000000002054, y: 0.6638956828455864 },\n { x: 0.0000029160000000002055, y: 0.6710147421919256 },\n { x: 0.0000029170000000002056, y: 0.6411098021431326 },\n { x: 0.0000029180000000002057, y: 0.6337515667537542 },\n { x: 0.0000029190000000002057, y: 0.6398758362740098 },\n { x: 0.000002920000000000206, y: 0.628361373202968 },\n { x: 0.000002921000000000206, y: 0.639388149374006 },\n { x: 0.000002922000000000206, y: 0.6782883947274078 },\n { x: 0.000002923000000000206, y: 0.6662133348476065 },\n { x: 0.000002924000000000206, y: 0.6744458143446771 },\n { x: 0.000002925000000000206, y: 0.6272141899122543 },\n { x: 0.0000029260000000002063, y: 0.6767808075628621 },\n { x: 0.0000029270000000002063, y: 0.6317346435211388 },\n { x: 0.0000029280000000002064, y: 0.6142931046884369 },\n { x: 0.0000029290000000002065, y: 0.6704631244999428 },\n { x: 0.0000029300000000002066, y: 0.6454744499613985 },\n { x: 0.0000029310000000002067, y: 0.647884465580466 },\n { x: 0.0000029320000000002067, y: 0.6602338925118152 },\n { x: 0.000002933000000000207, y: 0.6570589958671212 },\n { x: 0.000002934000000000207, y: 0.6294987704334325 },\n { x: 0.000002935000000000207, y: 0.6116801020597763 },\n { x: 0.000002936000000000207, y: 0.6067150106325837 },\n { x: 0.000002937000000000207, y: 0.6547845991396 },\n { x: 0.000002938000000000207, y: 0.6035587204656251 },\n { x: 0.0000029390000000002073, y: 0.5959623011526646 },\n { x: 0.0000029400000000002073, y: 0.5833899099901261 },\n { x: 0.0000029410000000002074, y: 0.6090903670216657 },\n { x: 0.0000029420000000002075, y: 0.5814380814901917 },\n { x: 0.0000029430000000002076, y: 0.5793610114770555 },\n { x: 0.0000029440000000002076, y: 0.5789968660799116 },\n { x: 0.0000029450000000002077, y: 0.5965906954287372 },\n { x: 0.0000029460000000002078, y: 0.5670538449442795 },\n { x: 0.000002947000000000208, y: 0.6142534090183384 },\n { x: 0.000002948000000000208, y: 0.6026167411490274 },\n { x: 0.000002949000000000208, y: 0.5943573490926507 },\n { x: 0.000002950000000000208, y: 0.5498448938835222 },\n { x: 0.000002951000000000208, y: 0.6088917707690311 },\n { x: 0.0000029520000000002082, y: 0.5979286662901565 },\n { x: 0.0000029530000000002083, y: 0.5622730106011163 },\n { x: 0.0000029540000000002084, y: 0.5978847405075455 },\n { x: 0.0000029550000000002085, y: 0.5898867450354877 },\n { x: 0.0000029560000000002085, y: 0.5461274076217086 },\n { x: 0.0000029570000000002086, y: 0.5884938191684874 },\n { x: 0.0000029580000000002087, y: 0.5322519093592583 },\n { x: 0.0000029590000000002088, y: 0.5807437680860508 },\n { x: 0.000002960000000000209, y: 0.5755296480271369 },\n { x: 0.000002961000000000209, y: 0.5388641482130897 },\n { x: 0.000002962000000000209, y: 0.5752632018518571 },\n { x: 0.000002963000000000209, y: 0.5841578412925744 },\n { x: 0.000002964000000000209, y: 0.5430249955723269 },\n { x: 0.000002965000000000209, y: 0.5824291534609394 },\n { x: 0.0000029660000000002093, y: 0.5561377114144416 },\n { x: 0.0000029670000000002094, y: 0.5421408760660786 },\n { x: 0.0000029680000000002094, y: 0.516956242642722 },\n { x: 0.0000029690000000002095, y: 0.5085039910663094 },\n { x: 0.0000029700000000002096, y: 0.5432745215003134 },\n { x: 0.0000029710000000002097, y: 0.5454138528011845 },\n { x: 0.0000029720000000002097, y: 0.5444944025437624 },\n { x: 0.00000297300000000021, y: 0.5286257810686109 },\n { x: 0.00000297400000000021, y: 0.5335532863301974 },\n { x: 0.00000297500000000021, y: 0.5292786379623816 },\n { x: 0.00000297600000000021, y: 0.516595821862428 },\n { x: 0.00000297700000000021, y: 0.4859324145829592 },\n { x: 0.00000297800000000021, y: 0.477941976665393 },\n { x: 0.0000029790000000002103, y: 0.47986034219660234 },\n { x: 0.0000029800000000002103, y: 0.5060507586110323 },\n { x: 0.0000029810000000002104, y: 0.4778975077271498 },\n { x: 0.0000029820000000002105, y: 0.4691837223074389 },\n { x: 0.0000029830000000002106, y: 0.5075898545995766 },\n { x: 0.0000029840000000002106, y: 0.48040006902527277 },\n { x: 0.0000029850000000002107, y: 0.5317976252175001 },\n { x: 0.0000029860000000002108, y: 0.47680761518300735 },\n { x: 0.000002987000000000211, y: 0.5224380218575002 },\n { x: 0.000002988000000000211, y: 0.5222136614842324 },\n { x: 0.000002989000000000211, y: 0.47389238552249097 },\n { x: 0.000002990000000000211, y: 0.4759162597189827 },\n { x: 0.000002991000000000211, y: 0.47912804901123773 },\n { x: 0.0000029920000000002112, y: 0.4588463479524858 },\n { x: 0.0000029930000000002113, y: 0.46526456215875195 },\n { x: 0.0000029940000000002114, y: 0.43082664205776344 },\n { x: 0.0000029950000000002115, y: 0.4801621072398747 },\n { x: 0.0000029960000000002115, y: 0.5003611506617719 },\n { x: 0.0000029970000000002116, y: 0.4831648614513115 },\n { x: 0.0000029980000000002117, y: 0.44195977831877975 },\n { x: 0.0000029990000000002118, y: 0.47500237700587694 },\n { x: 0.000003000000000000212, y: 0.4244825155255506 },\n { x: 0.000003001000000000212, y: 0.42755284866998156 },\n { x: 0.000003002000000000212, y: 0.4265718841461743 },\n { x: 0.000003003000000000212, y: 0.41928193320163487 },\n { x: 0.000003004000000000212, y: 0.44176186732101363 },\n { x: 0.000003005000000000212, y: 0.4164076866246498 },\n { x: 0.0000030060000000002123, y: 0.425678186355341 },\n { x: 0.0000030070000000002124, y: 0.4462372169845525 },\n { x: 0.0000030080000000002124, y: 0.39675661931254375 },\n { x: 0.0000030090000000002125, y: 0.3914044780508257 },\n { x: 0.0000030100000000002126, y: 0.40984744356451946 },\n { x: 0.0000030110000000002127, y: 0.452676165162442 },\n { x: 0.0000030120000000002127, y: 0.3958842444578926 },\n { x: 0.000003013000000000213, y: 0.43114323684229805 },\n { x: 0.000003014000000000213, y: 0.3859004752949258 },\n { x: 0.000003015000000000213, y: 0.4201885559702521 },\n { x: 0.000003016000000000213, y: 0.35320206431373663 },\n { x: 0.000003017000000000213, y: 0.3981953454814002 },\n { x: 0.000003018000000000213, y: 0.41164190173657245 },\n { x: 0.0000030190000000002133, y: 0.4227552980741416 },\n { x: 0.0000030200000000002133, y: 0.406813496279932 },\n { x: 0.0000030210000000002134, y: 0.3768096416917782 },\n { x: 0.0000030220000000002135, y: 0.3844141254178605 },\n { x: 0.0000030230000000002136, y: 0.4120649435874568 },\n { x: 0.0000030240000000002136, y: 0.3549973675704156 },\n { x: 0.0000030250000000002137, y: 0.3708898309822203 },\n { x: 0.0000030260000000002138, y: 0.3969391553780458 },\n { x: 0.000003027000000000214, y: 0.382377320147376 },\n { x: 0.000003028000000000214, y: 0.3300701749194839 },\n { x: 0.000003029000000000214, y: 0.3837147712648412 },\n { x: 0.000003030000000000214, y: 0.3403755084052608 },\n { x: 0.000003031000000000214, y: 0.3568162204362457 },\n { x: 0.0000030320000000002142, y: 0.3368821910534986 },\n { x: 0.0000030330000000002143, y: 0.34056802282976156 },\n { x: 0.0000030340000000002144, y: 0.366115653732448 },\n { x: 0.0000030350000000002145, y: 0.3572496096572387 },\n { x: 0.0000030360000000002145, y: 0.3646709559649993 },\n { x: 0.0000030370000000002146, y: 0.33690657991855305 },\n { x: 0.0000030380000000002147, y: 0.3154571049118399 },\n { x: 0.0000030390000000002148, y: 0.29966414252641754 },\n { x: 0.000003040000000000215, y: 0.3362027599470729 },\n { x: 0.000003041000000000215, y: 0.31900528983251136 },\n { x: 0.000003042000000000215, y: 0.28361854565106387 },\n { x: 0.000003043000000000215, y: 0.2846837575856401 },\n { x: 0.000003044000000000215, y: 0.35317431278448663 },\n { x: 0.0000030450000000002152, y: 0.34046490327067497 },\n { x: 0.0000030460000000002153, y: 0.30641420057902785 },\n { x: 0.0000030470000000002154, y: 0.33581770419394125 },\n { x: 0.0000030480000000002154, y: 0.2797312092284034 },\n { x: 0.0000030490000000002155, y: 0.31169218424863704 },\n { x: 0.0000030500000000002156, y: 0.3038207935241333 },\n { x: 0.0000030510000000002157, y: 0.31065702776559545 },\n { x: 0.0000030520000000002157, y: 0.2653983856317658 },\n { x: 0.000003053000000000216, y: 0.3160817165427984 },\n { x: 0.000003054000000000216, y: 0.2453988156782372 },\n { x: 0.000003055000000000216, y: 0.27364301833569293 },\n { x: 0.000003056000000000216, y: 0.28978325353957424 },\n { x: 0.000003057000000000216, y: 0.289429138374783 },\n { x: 0.000003058000000000216, y: 0.23388856311114992 },\n { x: 0.0000030590000000002163, y: 0.2625998887443979 },\n { x: 0.0000030600000000002163, y: 0.2550752269456489 },\n { x: 0.0000030610000000002164, y: 0.23716040829134868 },\n { x: 0.0000030620000000002165, y: 0.29067004616959263 },\n { x: 0.0000030630000000002166, y: 0.2545833654292316 },\n { x: 0.0000030640000000002166, y: 0.2785915493959754 },\n { x: 0.0000030650000000002167, y: 0.2594440596024477 },\n { x: 0.000003066000000000217, y: 0.2344098605281155 },\n { x: 0.000003067000000000217, y: 0.278049466724588 },\n { x: 0.000003068000000000217, y: 0.24142552610205575 },\n { x: 0.000003069000000000217, y: 0.22238654980395367 },\n { x: 0.000003070000000000217, y: 0.22484840033692724 },\n { x: 0.000003071000000000217, y: 0.25421372980977963 },\n { x: 0.0000030720000000002172, y: 0.1928002931157382 },\n { x: 0.0000030730000000002173, y: 0.20258772263072228 },\n { x: 0.0000030740000000002174, y: 0.19215242906985752 },\n { x: 0.0000030750000000002175, y: 0.22943751667200368 },\n { x: 0.0000030760000000002175, y: 0.22831532027045068 },\n { x: 0.0000030770000000002176, y: 0.2247274319007439 },\n { x: 0.0000030780000000002177, y: 0.2016165212043213 },\n { x: 0.0000030790000000002178, y: 0.19032976695301407 },\n { x: 0.000003080000000000218, y: 0.2217947058632726 },\n { x: 0.000003081000000000218, y: 0.16607318625043044 },\n { x: 0.000003082000000000218, y: 0.2145097898847822 },\n { x: 0.000003083000000000218, y: 0.18801612072921656 },\n { x: 0.000003084000000000218, y: 0.15364446770212092 },\n { x: 0.0000030850000000002182, y: 0.1725105958329209 },\n { x: 0.0000030860000000002183, y: 0.202508031742956 },\n { x: 0.0000030870000000002184, y: 0.16338077907630066 },\n { x: 0.0000030880000000002184, y: 0.20201724445617755 },\n { x: 0.0000030890000000002185, y: 0.1825555719353004 },\n { x: 0.0000030900000000002186, y: 0.13946235909936458 },\n { x: 0.0000030910000000002187, y: 0.19983230002089208 },\n { x: 0.0000030920000000002187, y: 0.1652563963940007 },\n { x: 0.000003093000000000219, y: 0.18850838876568207 },\n { x: 0.000003094000000000219, y: 0.15775721975836268 },\n { x: 0.000003095000000000219, y: 0.14748094851278684 },\n { x: 0.000003096000000000219, y: 0.14613755989528324 },\n { x: 0.000003097000000000219, y: 0.16243007746773336 },\n { x: 0.000003098000000000219, y: 0.11614392897373835 },\n { x: 0.0000030990000000002193, y: 0.17391857629837398 },\n { x: 0.0000031000000000002193, y: 0.16846458721919216 },\n { x: 0.0000031010000000002194, y: 0.11098314924543644 },\n { x: 0.0000031020000000002195, y: 0.12013235672924903 },\n { x: 0.0000031030000000002196, y: 0.15592045758735146 },\n { x: 0.0000031040000000002196, y: 0.113103604715051 },\n { x: 0.0000031050000000002197, y: 0.0867237665088789 },\n { x: 0.00000310600000000022, y: 0.14164331754798234 },\n { x: 0.00000310700000000022, y: 0.1018105913832894 },\n { x: 0.00000310800000000022, y: 0.08423680859228798 },\n { x: 0.00000310900000000022, y: 0.1279367232241345 },\n { x: 0.00000311000000000022, y: 0.13631131677937594 },\n { x: 0.00000311100000000022, y: 0.07196775478411119 },\n { x: 0.0000031120000000002202, y: 0.08182340242199586 },\n { x: 0.0000031130000000002203, y: 0.12444093968135209 },\n { x: 0.0000031140000000002204, y: 0.0618410973485449 },\n { x: 0.0000031150000000002205, y: 0.048277954160244614 },\n { x: 0.0000031160000000002205, y: 0.10348031539114594 },\n { x: 0.0000031170000000002206, y: 0.0745442289465314 },\n { x: 0.0000031180000000002207, y: 0.0928040707381595 },\n { x: 0.0000031190000000002208, y: 0.046277708687501945 },\n { x: 0.000003120000000000221, y: 0.036817760413822995 },\n { x: 0.000003121000000000221, y: 0.08695253367671232 },\n { x: 0.000003122000000000221, y: 0.0537961620201841 },\n { x: 0.000003123000000000221, y: 0.024145482030201747 },\n { x: 0.000003124000000000221, y: 0.07338781921525296 },\n { x: 0.0000031250000000002212, y: 0.04330730800186565 },\n { x: 0.0000031260000000002213, y: 0.080496789266035 },\n { x: 0.0000031270000000002214, y: 0.06582864789115775 },\n { x: 0.0000031280000000002215, y: 0.07159475266312759 },\n { x: 0.0000031290000000002215, y: 0.023615505076275092 },\n { x: 0.0000031300000000002216, y: 0.016119445946327686 },\n { x: 0.0000031310000000002217, y: 0.02547184777855657 },\n { x: 0.0000031320000000002218, y: 0.008070974411649744 },\n { x: 0.000003133000000000222, y: 0.004521425242816637 },\n { x: 0.000003134000000000222, y: -0.013867774518376393 },\n { x: 0.000003135000000000222, y: -0.008258604704503274 },\n { x: 0.000003136000000000222, y: 0.019756518011564528 },\n { x: 0.000003137000000000222, y: 0.05038942016178094 },\n { x: 0.000003138000000000222, y: 0.003561422443045455 },\n { x: 0.0000031390000000002223, y: -0.01607364358614714 },\n { x: 0.0000031400000000002224, y: 0.011048160535796086 },\n { x: 0.0000031410000000002224, y: 0.036217591204177134 },\n { x: 0.0000031420000000002225, y: -0.025929114482559707 },\n { x: 0.0000031430000000002226, y: 0.012088845376476424 },\n { x: 0.0000031440000000002227, y: -0.007841197225508486 },\n { x: 0.0000031450000000002227, y: -0.04765121447935222 },\n { x: 0.000003146000000000223, y: -0.029045177792323792 },\n { x: 0.000003147000000000223, y: -0.0163386052260965 },\n { x: 0.000003148000000000223, y: -0.0178068154921195 },\n { x: 0.000003149000000000223, y: -0.007577665339170293 },\n { x: 0.000003150000000000223, y: -0.007326213493127887 },\n { x: 0.000003151000000000223, y: 0.0011282456736075239 },\n { x: 0.0000031520000000002233, y: 0.002399233538437559 },\n { x: 0.0000031530000000002233, y: -0.006291535141147612 },\n { x: 0.0000031540000000002234, y: -0.0421436779611103 },\n { x: 0.0000031550000000002235, y: -0.006046438340959581 },\n { x: 0.0000031560000000002236, y: -0.03597101074862402 },\n { x: 0.0000031570000000002236, y: -0.04776129862803823 },\n { x: 0.0000031580000000002237, y: -0.060324307299293806 },\n { x: 0.0000031590000000002238, y: -0.018506424829098006 },\n { x: 0.000003160000000000224, y: -0.032096243208094975 },\n { x: 0.000003161000000000224, y: -0.053102077048914176 },\n { x: 0.000003162000000000224, y: -0.03461389170152358 },\n { x: 0.000003163000000000224, y: -0.08464352030781938 },\n { x: 0.000003164000000000224, y: -0.08792258285212184 },\n { x: 0.0000031650000000002242, y: -0.07262222209721945 },\n { x: 0.0000031660000000002243, y: -0.07251984658163221 },\n { x: 0.0000031670000000002244, y: -0.07781332517361249 },\n { x: 0.0000031680000000002245, y: -0.061821279456793665 },\n { x: 0.0000031690000000002245, y: -0.09001150305994736 },\n { x: 0.0000031700000000002246, y: -0.09825695025331492 },\n { x: 0.0000031710000000002247, y: -0.07868441470995279 },\n { x: 0.0000031720000000002248, y: -0.069302611157724 },\n { x: 0.000003173000000000225, y: -0.09709571531145915 },\n { x: 0.000003174000000000225, y: -0.112223450186691 },\n { x: 0.000003175000000000225, y: -0.10558021348087042 },\n { x: 0.000003176000000000225, y: -0.11338631420887024 },\n { x: 0.000003177000000000225, y: -0.10723865185474873 },\n { x: 0.000003178000000000225, y: -0.1178664527555659 },\n { x: 0.0000031790000000002253, y: -0.12841569597506372 },\n { x: 0.0000031800000000002254, y: -0.10505018771706184 },\n { x: 0.0000031810000000002254, y: -0.11819145667385055 },\n { x: 0.0000031820000000002255, y: -0.10513848579865771 },\n { x: 0.0000031830000000002256, y: -0.09629801219207604 },\n { x: 0.0000031840000000002257, y: -0.11920849849795624 },\n { x: 0.0000031850000000002257, y: -0.11432382067114388 },\n { x: 0.000003186000000000226, y: -0.17158180299775455 },\n { x: 0.000003187000000000226, y: -0.14631068979621983 },\n { x: 0.000003188000000000226, y: -0.14270220554174176 },\n { x: 0.000003189000000000226, y: -0.10869801972527274 },\n { x: 0.000003190000000000226, y: -0.11965933142540354 },\n { x: 0.000003191000000000226, y: -0.14328080467863588 },\n { x: 0.0000031920000000002263, y: -0.13703113271202907 },\n { x: 0.0000031930000000002263, y: -0.14955609660598396 },\n { x: 0.0000031940000000002264, y: -0.12958856676034555 },\n { x: 0.0000031950000000002265, y: -0.17636690253678883 },\n { x: 0.0000031960000000002266, y: -0.1957297799135637 },\n { x: 0.0000031970000000002266, y: -0.1328556618146467 },\n { x: 0.0000031980000000002267, y: -0.20238190689265145 },\n { x: 0.0000031990000000002268, y: -0.19986361088632915 },\n { x: 0.000003200000000000227, y: -0.15245731354563163 },\n { x: 0.000003201000000000227, y: -0.18309185171994816 },\n { x: 0.000003202000000000227, y: -0.15592967224768 },\n { x: 0.000003203000000000227, y: -0.1833397941682141 },\n { x: 0.000003204000000000227, y: -0.14848274561176203 },\n { x: 0.0000032050000000002272, y: -0.21293252990119588 },\n { x: 0.0000032060000000002273, y: -0.20670089846435358 },\n { x: 0.0000032070000000002274, y: -0.2250640988538285 },\n { x: 0.0000032080000000002275, y: -0.18063215680097144 },\n { x: 0.0000032090000000002275, y: -0.19657189098040953 },\n { x: 0.0000032100000000002276, y: -0.1825096349941638 },\n { x: 0.0000032110000000002277, y: -0.22987309390072364 },\n { x: 0.0000032120000000002278, y: -0.1727401626466551 },\n { x: 0.000003213000000000228, y: -0.2032694780972531 },\n { x: 0.000003214000000000228, y: -0.22349687504640525 },\n { x: 0.000003215000000000228, y: -0.21559768469535429 },\n { x: 0.000003216000000000228, y: -0.20044419893195242 },\n { x: 0.000003217000000000228, y: -0.22494299668589535 },\n { x: 0.0000032180000000002282, y: -0.19810179838688674 },\n { x: 0.0000032190000000002283, y: -0.2065850147813204 },\n { x: 0.0000032200000000002284, y: -0.263883990696103 },\n { x: 0.0000032210000000002284, y: -0.19668290494141746 },\n { x: 0.0000032220000000002285, y: -0.23766348863440098 },\n { x: 0.0000032230000000002286, y: -0.23929596781323995 },\n { x: 0.0000032240000000002287, y: -0.2628584084615896 },\n { x: 0.0000032250000000002287, y: -0.23019862167073676 },\n { x: 0.000003226000000000229, y: -0.20962296928612104 },\n { x: 0.000003227000000000229, y: -0.2402771797941383 },\n { x: 0.000003228000000000229, y: -0.23453381220240455 },\n { x: 0.000003229000000000229, y: -0.21835872143803414 },\n { x: 0.000003230000000000229, y: -0.24320153679802786 },\n { x: 0.000003231000000000229, y: -0.21995426407035332 },\n { x: 0.0000032320000000002293, y: -0.23317596411649277 },\n { x: 0.0000032330000000002293, y: -0.24335524815207946 },\n { x: 0.0000032340000000002294, y: -0.2575702837710187 },\n { x: 0.0000032350000000002295, y: -0.24750473097698494 },\n { x: 0.0000032360000000002296, y: -0.26549117799091665 },\n { x: 0.0000032370000000002296, y: -0.3005802998467446 },\n { x: 0.0000032380000000002297, y: -0.2560173130055039 },\n { x: 0.00000323900000000023, y: -0.26255952415041833 },\n { x: 0.00000324000000000023, y: -0.26787977321275974 },\n { x: 0.00000324100000000023, y: -0.3128612839672932 },\n { x: 0.00000324200000000023, y: -0.25363439741186045 },\n { x: 0.00000324300000000023, y: -0.2681249756672638 },\n { x: 0.00000324400000000023, y: -0.28766066198157186 },\n { x: 0.0000032450000000002302, y: -0.31026900725854684 },\n { x: 0.0000032460000000002303, y: -0.26197857745283765 },\n { x: 0.0000032470000000002304, y: -0.28605978731504556 },\n { x: 0.0000032480000000002305, y: -0.2757398766915066 },\n { x: 0.0000032490000000002305, y: -0.2940890564747056 },\n { x: 0.0000032500000000002306, y: -0.30220323602330446 },\n { x: 0.0000032510000000002307, y: -0.31187971075659926 },\n { x: 0.0000032520000000002308, y: -0.2711151105613403 },\n { x: 0.000003253000000000231, y: -0.2819339857522497 },\n { x: 0.000003254000000000231, y: -0.320950666299713 },\n { x: 0.000003255000000000231, y: -0.3011302478983241 },\n { x: 0.000003256000000000231, y: -0.30392750928871703 },\n { x: 0.000003257000000000231, y: -0.3066540546928292 },\n { x: 0.0000032580000000002312, y: -0.28315074253011896 },\n { x: 0.0000032590000000002313, y: -0.3446284481543926 },\n { x: 0.0000032600000000002314, y: -0.33369180319692887 },\n { x: 0.0000032610000000002314, y: -0.35171585021294194 },\n { x: 0.0000032620000000002315, y: -0.35587190183813217 },\n { x: 0.0000032630000000002316, y: -0.3551912691799734 },\n { x: 0.0000032640000000002317, y: -0.3047312489526631 },\n { x: 0.0000032650000000002317, y: -0.3695141056737187 },\n { x: 0.000003266000000000232, y: -0.29773854277882816 },\n { x: 0.000003267000000000232, y: -0.3234624836000543 },\n { x: 0.000003268000000000232, y: -0.31303395251938476 },\n { x: 0.000003269000000000232, y: -0.3094279994146796 },\n { x: 0.000003270000000000232, y: -0.3078721814054921 },\n { x: 0.000003271000000000232, y: -0.3644995182120665 },\n { x: 0.0000032720000000002323, y: -0.32052497644139016 },\n { x: 0.0000032730000000002323, y: -0.3612296918116466 },\n { x: 0.0000032740000000002324, y: -0.3845514084133653 },\n { x: 0.0000032750000000002325, y: -0.3352647633035219 },\n { x: 0.0000032760000000002326, y: -0.38629194706877706 },\n { x: 0.0000032770000000002326, y: -0.33646038849190724 },\n { x: 0.0000032780000000002327, y: -0.33771439821716404 },\n { x: 0.000003279000000000233, y: -0.3625537403021551 },\n { x: 0.000003280000000000233, y: -0.3597311040206693 },\n { x: 0.000003281000000000233, y: -0.39072950317698646 },\n { x: 0.000003282000000000233, y: -0.39623566299201884 },\n { x: 0.000003283000000000233, y: -0.38215208143277896 },\n { x: 0.000003284000000000233, y: -0.3917836292581149 },\n { x: 0.0000032850000000002332, y: -0.36567290155416365 },\n { x: 0.0000032860000000002333, y: -0.3861388181125698 },\n { x: 0.0000032870000000002334, y: -0.3523647937978871 },\n { x: 0.0000032880000000002335, y: -0.3805280394428058 },\n { x: 0.0000032890000000002335, y: -0.3601980786089182 },\n { x: 0.0000032900000000002336, y: -0.4069788986463119 },\n { x: 0.0000032910000000002337, y: -0.3785712104587992 },\n { x: 0.0000032920000000002338, y: -0.39830714084951396 },\n { x: 0.000003293000000000234, y: -0.36558462711917594 },\n { x: 0.000003294000000000234, y: -0.37060109999113494 },\n { x: 0.000003295000000000234, y: -0.39075817549185976 },\n { x: 0.000003296000000000234, y: -0.4098639912715285 },\n { x: 0.000003297000000000234, y: -0.42514301238466623 },\n { x: 0.0000032980000000002342, y: -0.41381132713806307 },\n { x: 0.0000032990000000002343, y: -0.3940111248717238 },\n { x: 0.0000033000000000002344, y: -0.3656879597311707 },\n { x: 0.0000033010000000002344, y: -0.39988472434384853 },\n { x: 0.0000033020000000002345, y: -0.3843851746879992 },\n { x: 0.0000033030000000002346, y: -0.4139074208607734 },\n { x: 0.0000033040000000002347, y: -0.43210466402937187 },\n { x: 0.0000033050000000002347, y: -0.4270867612755586 },\n { x: 0.000003306000000000235, y: -0.38795782943102686 },\n { x: 0.000003307000000000235, y: -0.44407180305114 },\n { x: 0.000003308000000000235, y: -0.39236277165585937 },\n { x: 0.000003309000000000235, y: -0.40936804930321896 },\n { x: 0.000003310000000000235, y: -0.4533937391137786 },\n { x: 0.000003311000000000235, y: -0.4457371309648657 },\n { x: 0.0000033120000000002353, y: -0.4518031233377471 },\n { x: 0.0000033130000000002353, y: -0.39121414235564894 },\n { x: 0.0000033140000000002354, y: -0.41304048490929246 },\n { x: 0.0000033150000000002355, y: -0.42432168322533526 },\n { x: 0.0000033160000000002356, y: -0.4190628299984415 },\n { x: 0.0000033170000000002357, y: -0.42603303616051974 },\n { x: 0.0000033180000000002357, y: -0.40321975394738696 },\n { x: 0.000003319000000000236, y: -0.458900665567852 },\n { x: 0.000003320000000000236, y: -0.4465875197416527 },\n { x: 0.000003321000000000236, y: -0.4319538881855717 },\n { x: 0.000003322000000000236, y: -0.4012601474818814 },\n { x: 0.000003323000000000236, y: -0.46349198131654906 },\n { x: 0.000003324000000000236, y: -0.40260077434299296 },\n { x: 0.0000033250000000002363, y: -0.41759161301765846 },\n { x: 0.0000033260000000002363, y: -0.4564701345365595 },\n { x: 0.0000033270000000002364, y: -0.42929664513164184 },\n { x: 0.0000033280000000002365, y: -0.44934059186737174 },\n { x: 0.0000033290000000002366, y: -0.40992085894860364 },\n { x: 0.0000033300000000002366, y: -0.45899672179313145 },\n { x: 0.0000033310000000002367, y: -0.46187235042490177 },\n { x: 0.0000033320000000002368, y: -0.4359261883539441 },\n { x: 0.000003333000000000237, y: -0.4552694730507883 },\n { x: 0.000003334000000000237, y: -0.46914201535026984 },\n { x: 0.000003335000000000237, y: -0.4506924755248122 },\n { x: 0.000003336000000000237, y: -0.4230892515715711 },\n { x: 0.000003337000000000237, y: -0.43896077663713096 },\n { x: 0.0000033380000000002372, y: -0.44355802269292366 },\n { x: 0.0000033390000000002373, y: -0.41985931681295474 },\n { x: 0.0000033400000000002374, y: -0.42487617145748297 },\n { x: 0.0000033410000000002375, y: -0.4906351271915709 },\n { x: 0.0000033420000000002375, y: -0.4322946262621722 },\n { x: 0.0000033430000000002376, y: -0.4392522710798343 },\n { x: 0.0000033440000000002377, y: -0.48224643296253833 },\n { x: 0.0000033450000000002378, y: -0.4445783971653301 },\n { x: 0.000003346000000000238, y: -0.47998888745389084 },\n { x: 0.000003347000000000238, y: -0.48352992227983355 },\n { x: 0.000003348000000000238, y: -0.4776838334682925 },\n { x: 0.000003349000000000238, y: -0.46020099686273125 },\n { x: 0.000003350000000000238, y: -0.4889175344431014 },\n { x: 0.000003351000000000238, y: -0.5080130640643018 },\n { x: 0.0000033520000000002383, y: -0.4570187752743036 },\n { x: 0.0000033530000000002384, y: -0.44019251394662606 },\n { x: 0.0000033540000000002384, y: -0.48940086737649385 },\n { x: 0.0000033550000000002385, y: -0.5042097214121938 },\n { x: 0.0000033560000000002386, y: -0.4592499172029625 },\n { x: 0.0000033570000000002387, y: -0.48132900169488396 },\n { x: 0.0000033580000000002387, y: -0.47273307843874096 },\n { x: 0.000003359000000000239, y: -0.47338698808537516 },\n { x: 0.000003360000000000239, y: -0.47596175388950285 },\n { x: 0.000003361000000000239, y: -0.4491708936328956 },\n { x: 0.000003362000000000239, y: -0.4880457437460077 },\n { x: 0.000003363000000000239, y: -0.4699143829924888 },\n { x: 0.000003364000000000239, y: -0.48143039502553003 },\n { x: 0.0000033650000000002393, y: -0.4995556689188391 },\n { x: 0.0000033660000000002393, y: -0.5028351419291084 },\n { x: 0.0000033670000000002394, y: -0.45841223340669646 },\n { x: 0.0000033680000000002395, y: -0.4651918188206114 },\n { x: 0.0000033690000000002396, y: -0.5162724889876089 },\n { x: 0.0000033700000000002396, y: -0.5039806482194678 },\n { x: 0.0000033710000000002397, y: -0.48341429460868873 },\n { x: 0.0000033720000000002398, y: -0.4853878765314375 },\n { x: 0.00000337300000000024, y: -0.4851549312033639 },\n { x: 0.00000337400000000024, y: -0.48846185523069485 },\n { x: 0.00000337500000000024, y: -0.5265970638481733 },\n { x: 0.00000337600000000024, y: -0.4663972157548419 },\n { x: 0.00000337700000000024, y: -0.47227015825980817 },\n { x: 0.0000033780000000002402, y: -0.48303384495975865 },\n { x: 0.0000033790000000002403, y: -0.4617097551322422 },\n { x: 0.0000033800000000002404, y: -0.46327308251596017 },\n { x: 0.0000033810000000002405, y: -0.5323201871797948 },\n { x: 0.0000033820000000002405, y: -0.48123870037568717 },\n { x: 0.0000033830000000002406, y: -0.4698039281641798 },\n { x: 0.0000033840000000002407, y: -0.4678571682602047 },\n { x: 0.0000033850000000002408, y: -0.497385865650122 },\n { x: 0.000003386000000000241, y: -0.4620324985512965 },\n { x: 0.000003387000000000241, y: -0.4945356794423756 },\n { x: 0.000003388000000000241, y: -0.5046073428147386 },\n { x: 0.000003389000000000241, y: -0.5208774151540554 },\n { x: 0.000003390000000000241, y: -0.46267487501891547 },\n { x: 0.000003391000000000241, y: -0.5130503052074072 },\n { x: 0.0000033920000000002413, y: -0.46667050386247094 },\n { x: 0.0000033930000000002414, y: -0.5121424223169877 },\n { x: 0.0000033940000000002414, y: -0.5356740779090764 },\n { x: 0.0000033950000000002415, y: -0.49574614119425703 },\n { x: 0.0000033960000000002416, y: -0.5200768662370949 },\n { x: 0.0000033970000000002417, y: -0.47816794007455543 },\n { x: 0.0000033980000000002417, y: -0.48187589039332557 },\n { x: 0.000003399000000000242, y: -0.4895635602555801 },\n { x: 0.000003400000000000242, y: -0.4708707234203284 },\n { x: 0.000003401000000000242, y: -0.48662368910263176 },\n { x: 0.000003402000000000242, y: -0.4737487090341167 },\n { x: 0.000003403000000000242, y: -0.5359646637329821 },\n { x: 0.000003404000000000242, y: -0.5010467308251905 },\n { x: 0.0000034050000000002423, y: -0.5430969129956867 },\n { x: 0.0000034060000000002423, y: -0.5217820996677304 },\n { x: 0.0000034070000000002424, y: -0.46803470881806003 },\n { x: 0.0000034080000000002425, y: -0.5092035959067122 },\n { x: 0.0000034090000000002426, y: -0.5324984696629461 },\n { x: 0.0000034100000000002426, y: -0.47356140853013473 },\n { x: 0.0000034110000000002427, y: -0.4699484150184648 },\n { x: 0.0000034120000000002428, y: -0.5061056341797864 },\n { x: 0.000003413000000000243, y: -0.5220315411680886 },\n { x: 0.000003414000000000243, y: -0.5344556708890145 },\n { x: 0.000003415000000000243, y: -0.5105210568076236 },\n { x: 0.000003416000000000243, y: -0.5058322289759033 },\n { x: 0.000003417000000000243, y: -0.4749915890034718 },\n { x: 0.0000034180000000002432, y: -0.4830163408410244 },\n { x: 0.0000034190000000002433, y: -0.500120757881822 },\n { x: 0.0000034200000000002434, y: -0.5183813308321358 },\n { x: 0.0000034210000000002435, y: -0.5083635160491194 },\n { x: 0.0000034220000000002435, y: -0.5111336946392137 },\n { x: 0.0000034230000000002436, y: -0.5216465973073167 },\n { x: 0.0000034240000000002437, y: -0.4725649568070156 },\n { x: 0.0000034250000000002438, y: -0.4820619153910591 },\n { x: 0.000003426000000000244, y: -0.48346102957121456 },\n { x: 0.000003427000000000244, y: -0.4892946731753036 },\n { x: 0.000003428000000000244, y: -0.5450338605682216 },\n { x: 0.000003429000000000244, y: -0.48959027268535804 },\n { x: 0.000003430000000000244, y: -0.50472994888099 },\n { x: 0.0000034310000000002442, y: -0.5135689790534533 },\n { x: 0.0000034320000000002443, y: -0.4728151076186395 },\n { x: 0.0000034330000000002444, y: -0.5031203456151376 },\n { x: 0.0000034340000000002444, y: -0.5120911610624209 },\n { x: 0.0000034350000000002445, y: -0.51298601836823 },\n { x: 0.0000034360000000002446, y: -0.481967249319706 },\n { x: 0.0000034370000000002447, y: -0.5133655741441281 },\n { x: 0.0000034380000000002447, y: -0.49720719887826503 },\n { x: 0.000003439000000000245, y: -0.49778833678371104 },\n { x: 0.000003440000000000245, y: -0.5035301219618319 },\n { x: 0.000003441000000000245, y: -0.4857897399439753 },\n { x: 0.000003442000000000245, y: -0.5433254539273844 },\n { x: 0.000003443000000000245, y: -0.47332055408714946 },\n { x: 0.000003444000000000245, y: -0.49267424280923644 },\n { x: 0.0000034450000000002453, y: -0.48890168449127547 },\n { x: 0.0000034460000000002453, y: -0.5256139383265327 },\n { x: 0.0000034470000000002454, y: -0.49984946873105185 },\n { x: 0.0000034480000000002455, y: -0.47658034946026606 },\n { x: 0.0000034490000000002456, y: -0.4812121899614879 },\n { x: 0.0000034500000000002456, y: -0.5246701603561381 },\n { x: 0.0000034510000000002457, y: -0.48245242932259336 },\n { x: 0.000003452000000000246, y: -0.5104302529328206 },\n { x: 0.000003453000000000246, y: -0.5279744240133445 },\n { x: 0.000003454000000000246, y: -0.53868042739691 },\n { x: 0.000003455000000000246, y: -0.5124553082017602 },\n { x: 0.000003456000000000246, y: -0.5055019346625338 },\n { x: 0.000003457000000000246, y: -0.48255370881578524 },\n { x: 0.0000034580000000002462, y: -0.477159364636299 },\n { x: 0.0000034590000000002463, y: -0.5092100952193521 },\n { x: 0.0000034600000000002464, y: -0.46933562982000465 },\n { x: 0.0000034610000000002465, y: -0.48304966980503167 },\n { x: 0.0000034620000000002465, y: -0.5386474112103674 },\n { x: 0.0000034630000000002466, y: -0.47739558950233807 },\n { x: 0.0000034640000000002467, y: -0.5238820088670073 },\n { x: 0.0000034650000000002468, y: -0.5032957578884067 },\n { x: 0.000003466000000000247, y: -0.5133049718659941 },\n { x: 0.000003467000000000247, y: -0.46391888156022615 },\n { x: 0.000003468000000000247, y: -0.5260654126593264 },\n { x: 0.000003469000000000247, y: -0.47342561988462284 },\n { x: 0.000003470000000000247, y: -0.532666635371735 },\n { x: 0.0000034710000000002472, y: -0.4928412794931368 },\n { x: 0.0000034720000000002473, y: -0.4881621009023802 },\n { x: 0.0000034730000000002474, y: -0.48056713580290095 },\n { x: 0.0000034740000000002474, y: -0.5278160091834466 },\n { x: 0.0000034750000000002475, y: -0.5265244163484548 },\n { x: 0.0000034760000000002476, y: -0.5120194064018518 },\n { x: 0.0000034770000000002477, y: -0.48062304036662823 },\n { x: 0.0000034780000000002477, y: -0.4951684941951898 },\n { x: 0.000003479000000000248, y: -0.46300134956831474 },\n { x: 0.000003480000000000248, y: -0.4936239389524993 },\n { x: 0.000003481000000000248, y: -0.5282890262751992 },\n { x: 0.000003482000000000248, y: -0.4927372239091787 },\n { x: 0.000003483000000000248, y: -0.45963135150194434 },\n { x: 0.000003484000000000248, y: -0.4799386086758681 },\n { x: 0.0000034850000000002483, y: -0.4741355191067588 },\n { x: 0.0000034860000000002483, y: -0.5056293345535302 },\n { x: 0.0000034870000000002484, y: -0.46620443716361404 },\n { x: 0.0000034880000000002485, y: -0.48545971890883177 },\n { x: 0.0000034890000000002486, y: -0.46527067363364866 },\n { x: 0.0000034900000000002486, y: -0.4831903162716123 },\n { x: 0.0000034910000000002487, y: -0.44715006433764426 },\n { x: 0.000003492000000000249, y: -0.44918297891699044 },\n { x: 0.000003493000000000249, y: -0.5028049864953128 },\n { x: 0.000003494000000000249, y: -0.47481660347534466 },\n { x: 0.000003495000000000249, y: -0.4585100146196142 },\n { x: 0.000003496000000000249, y: -0.5007301933732508 },\n { x: 0.000003497000000000249, y: -0.49530624110010585 },\n { x: 0.0000034980000000002492, y: -0.4886066863321506 },\n { x: 0.0000034990000000002493, y: -0.46181468369258627 },\n { x: 0.0000035000000000002494, y: -0.4414797612982536 },\n { x: 0.0000035010000000002495, y: -0.48761326669803884 },\n { x: 0.0000035020000000002495, y: -0.45523858038352677 },\n { x: 0.0000035030000000002496, y: -0.48751556058423334 },\n { x: 0.0000035040000000002497, y: -0.47293139780081983 },\n { x: 0.0000035050000000002498, y: -0.4727365413504359 },\n { x: 0.00000350600000000025, y: -0.494384143450404 },\n { x: 0.00000350700000000025, y: -0.5020347011411954 },\n { x: 0.00000350800000000025, y: -0.4854032546445812 },\n { x: 0.00000350900000000025, y: -0.4378126710250092 },\n { x: 0.00000351000000000025, y: -0.4870794009111852 },\n { x: 0.0000035110000000002502, y: -0.4421357932399356 },\n { x: 0.0000035120000000002503, y: -0.4407106811481119 },\n { x: 0.0000035130000000002504, y: -0.43705624681269606 },\n { x: 0.0000035140000000002505, y: -0.47823457672802244 },\n { x: 0.0000035150000000002505, y: -0.44238240809045537 },\n { x: 0.0000035160000000002506, y: -0.4954458579680961 },\n { x: 0.0000035170000000002507, y: -0.48700039320880223 },\n { x: 0.0000035180000000002508, y: -0.4418755065564143 },\n { x: 0.000003519000000000251, y: -0.48374262136466056 },\n { x: 0.000003520000000000251, y: -0.42831307036376315 },\n { x: 0.000003521000000000251, y: -0.4931125632016287 },\n { x: 0.000003522000000000251, y: -0.42298332736388555 },\n { x: 0.000003523000000000251, y: -0.41921811446590773 },\n { x: 0.000003524000000000251, y: -0.4443428252129152 },\n { x: 0.0000035250000000002513, y: -0.4275281969079634 },\n { x: 0.0000035260000000002514, y: -0.4216176969865052 },\n { x: 0.0000035270000000002514, y: -0.47657910850479945 },\n { x: 0.0000035280000000002515, y: -0.48414135220180166 },\n { x: 0.0000035290000000002516, y: -0.4224316935851882 },\n { x: 0.0000035300000000002517, y: -0.4340089251878088 },\n { x: 0.0000035310000000002517, y: -0.45696771258156077 },\n { x: 0.000003532000000000252, y: -0.4723654128481427 },\n { x: 0.000003533000000000252, y: -0.4250142480003609 },\n { x: 0.000003534000000000252, y: -0.46463966171388654 },\n { x: 0.000003535000000000252, y: -0.4642531239227323 },\n { x: 0.000003536000000000252, y: -0.4227637029382053 },\n { x: 0.000003537000000000252, y: -0.41372880806107465 },\n { x: 0.0000035380000000002523, y: -0.42003325226386423 },\n { x: 0.0000035390000000002523, y: -0.43369314130179293 },\n { x: 0.0000035400000000002524, y: -0.4464395469045033 },\n { x: 0.0000035410000000002525, y: -0.43744871583252454 },\n { x: 0.0000035420000000002526, y: -0.4045531914155711 },\n { x: 0.0000035430000000002526, y: -0.417723569708116 },\n { x: 0.0000035440000000002527, y: -0.42307309466591725 },\n { x: 0.0000035450000000002528, y: -0.43096106808602325 },\n { x: 0.000003546000000000253, y: -0.4384196413078245 },\n { x: 0.000003547000000000253, y: -0.4094897236894357 },\n { x: 0.000003548000000000253, y: -0.40827562283307 },\n { x: 0.000003549000000000253, y: -0.43892307840916434 },\n { x: 0.000003550000000000253, y: -0.4495668105210173 },\n { x: 0.0000035510000000002532, y: -0.4437937572875227 },\n { x: 0.0000035520000000002533, y: -0.44101229955160387 },\n { x: 0.0000035530000000002534, y: -0.414484788430339 },\n { x: 0.0000035540000000002535, y: -0.4207343911274903 },\n { x: 0.0000035550000000002535, y: -0.41017657922288625 },\n { x: 0.0000035560000000002536, y: -0.40033580209028563 },\n { x: 0.0000035570000000002537, y: -0.43270020968328615 },\n { x: 0.0000035580000000002538, y: -0.3957656045788688 },\n { x: 0.000003559000000000254, y: -0.4086050468784142 },\n { x: 0.000003560000000000254, y: -0.38708944896985537 },\n { x: 0.000003561000000000254, y: -0.3778883059082055 },\n { x: 0.000003562000000000254, y: -0.41155123943530275 },\n { x: 0.000003563000000000254, y: -0.4201518677611237 },\n { x: 0.000003564000000000254, y: -0.411451642593377 },\n { x: 0.0000035650000000002543, y: -0.40073518374551265 },\n { x: 0.0000035660000000002544, y: -0.38463669291867275 },\n { x: 0.0000035670000000002544, y: -0.36792649443565906 },\n { x: 0.0000035680000000002545, y: -0.37121912023541276 },\n { x: 0.0000035690000000002546, y: -0.3780521088974908 },\n { x: 0.0000035700000000002547, y: -0.41922496455085995 },\n { x: 0.0000035710000000002547, y: -0.3598788971001736 },\n { x: 0.000003572000000000255, y: -0.3576593851382572 },\n { x: 0.000003573000000000255, y: -0.37838148784026215 },\n { x: 0.000003574000000000255, y: -0.39305476937277106 },\n { x: 0.000003575000000000255, y: -0.3692740279028207 },\n { x: 0.000003576000000000255, y: -0.3524498339546062 },\n { x: 0.000003577000000000255, y: -0.3607024972073173 },\n { x: 0.0000035780000000002553, y: -0.34694233262463503 },\n { x: 0.0000035790000000002553, y: -0.4030693051818707 },\n { x: 0.0000035800000000002554, y: -0.34855468096083875 },\n { x: 0.0000035810000000002555, y: -0.4111570819537663 },\n { x: 0.0000035820000000002556, y: -0.3827894007463801 },\n { x: 0.0000035830000000002556, y: -0.36248214901864145 },\n { x: 0.0000035840000000002557, y: -0.39250965308524993 },\n { x: 0.0000035850000000002558, y: -0.33866768369186984 },\n { x: 0.000003586000000000256, y: -0.36670883733409976 },\n { x: 0.000003587000000000256, y: -0.38529160309611027 },\n { x: 0.000003588000000000256, y: -0.3694312142353537 },\n { x: 0.000003589000000000256, y: -0.3588401829077657 },\n { x: 0.000003590000000000256, y: -0.37426738167768786 },\n { x: 0.0000035910000000002562, y: -0.3298212056752513 },\n { x: 0.0000035920000000002563, y: -0.3721072097648827 },\n { x: 0.0000035930000000002564, y: -0.33561113826302136 },\n { x: 0.0000035940000000002565, y: -0.3402560732496043 },\n { x: 0.0000035950000000002565, y: -0.32990161610473756 },\n { x: 0.0000035960000000002566, y: -0.3359725140646908 },\n { x: 0.0000035970000000002567, y: -0.3329339805505544 },\n { x: 0.0000035980000000002568, y: -0.35354569369080197 },\n { x: 0.000003599000000000257, y: -0.3685534624418669 },\n { x: 0.000003600000000000257, y: -0.32619655000741493 },\n { x: 0.000003601000000000257, y: -0.31579671439314805 },\n { x: 0.000003602000000000257, y: -0.3546636311581846 },\n { x: 0.000003603000000000257, y: -0.34935332915164097 },\n { x: 0.0000036040000000002572, y: -0.30638394515008566 },\n { x: 0.0000036050000000002573, y: -0.34564983882546896 },\n { x: 0.0000036060000000002574, y: -0.3075908962299332 },\n { x: 0.0000036070000000002574, y: -0.3482621030863398 },\n { x: 0.0000036080000000002575, y: -0.32401141902757324 },\n { x: 0.0000036090000000002576, y: -0.32210123078909003 },\n { x: 0.0000036100000000002577, y: -0.3601064861979281 },\n { x: 0.0000036110000000002577, y: -0.35994246540699526 },\n { x: 0.000003612000000000258, y: -0.31026024721790463 },\n { x: 0.000003613000000000258, y: -0.3468661461519508 },\n { x: 0.000003614000000000258, y: -0.34696531869246944 },\n { x: 0.000003615000000000258, y: -0.2939104035331667 },\n { x: 0.000003616000000000258, y: -0.29927713591841876 },\n { x: 0.000003617000000000258, y: -0.2978802850986503 },\n { x: 0.0000036180000000002583, y: -0.32739006619406275 },\n { x: 0.0000036190000000002583, y: -0.3432618211548486 },\n { x: 0.0000036200000000002584, y: -0.32962241289739336 },\n { x: 0.0000036210000000002585, y: -0.333000396896873 },\n { x: 0.0000036220000000002586, y: -0.27187342488646077 },\n { x: 0.0000036230000000002586, y: -0.32310677145593636 },\n { x: 0.0000036240000000002587, y: -0.31138243406721333 },\n { x: 0.000003625000000000259, y: -0.2781419232513508 },\n { x: 0.000003626000000000259, y: -0.32534764665539856 },\n { x: 0.000003627000000000259, y: -0.2887942310638763 },\n { x: 0.000003628000000000259, y: -0.3177000763587596 },\n { x: 0.000003629000000000259, y: -0.2702926364032007 },\n { x: 0.000003630000000000259, y: -0.2594343788403857 },\n { x: 0.0000036310000000002592, y: -0.29421208722767156 },\n { x: 0.0000036320000000002593, y: -0.2627682461366655 },\n { x: 0.0000036330000000002594, y: -0.2555084706475671 },\n { x: 0.0000036340000000002595, y: -0.2532145307590628 },\n { x: 0.0000036350000000002595, y: -0.28650509330706775 },\n { x: 0.0000036360000000002596, y: -0.25954227477010483 },\n { x: 0.0000036370000000002597, y: -0.26726641110326715 },\n { x: 0.0000036380000000002598, y: -0.2448949747942874 },\n { x: 0.00000363900000000026, y: -0.2541127466898014 },\n { x: 0.00000364000000000026, y: -0.23804057402761264 },\n { x: 0.00000364100000000026, y: -0.30197860546408584 },\n { x: 0.00000364200000000026, y: -0.23636164774994223 },\n { x: 0.00000364300000000026, y: -0.2825543030568763 },\n { x: 0.0000036440000000002602, y: -0.2462358330935048 },\n { x: 0.0000036450000000002603, y: -0.25298696589684283 },\n { x: 0.0000036460000000002604, y: -0.28632157433387756 },\n { x: 0.0000036470000000002604, y: -0.24189613071708943 },\n { x: 0.0000036480000000002605, y: -0.27929765100481707 },\n { x: 0.0000036490000000002606, y: -0.24538113269853357 },\n { x: 0.0000036500000000002607, y: -0.30671804232370703 },\n { x: 0.0000036510000000002607, y: -0.27011607694196776 },\n { x: 0.000003652000000000261, y: -0.2704556345261621 },\n { x: 0.000003653000000000261, y: -0.20846417085623825 },\n { x: 0.000003654000000000261, y: -0.24955499373783827 },\n { x: 0.000003655000000000261, y: -0.23966322472828874 },\n { x: 0.000003656000000000261, y: -0.20217928635807403 },\n { x: 0.000003657000000000261, y: -0.2331115638985148 },\n { x: 0.0000036580000000002613, y: -0.2518084692635158 },\n { x: 0.0000036590000000002613, y: -0.1967162632898379 },\n { x: 0.0000036600000000002614, y: -0.229230772125001 },\n { x: 0.0000036610000000002615, y: -0.24155952779605738 },\n { x: 0.0000036620000000002616, y: -0.19270218586418894 },\n { x: 0.0000036630000000002616, y: -0.20403264636119314 },\n { x: 0.0000036640000000002617, y: -0.21169111740173982 },\n { x: 0.000003665000000000262, y: -0.2065747463751475 },\n { x: 0.000003666000000000262, y: -0.19891970538654696 },\n { x: 0.000003667000000000262, y: -0.17887093561196377 },\n { x: 0.000003668000000000262, y: -0.2291886517264323 },\n { x: 0.000003669000000000262, y: -0.23654613045993622 },\n { x: 0.000003670000000000262, y: -0.20729525999690526 },\n { x: 0.0000036710000000002622, y: -0.2115888538305148 },\n { x: 0.0000036720000000002623, y: -0.1704036367750172 },\n { x: 0.0000036730000000002624, y: -0.23452835792419793 },\n { x: 0.0000036740000000002625, y: -0.17070056448078622 },\n { x: 0.0000036750000000002625, y: -0.20989690052347934 },\n { x: 0.0000036760000000002626, y: -0.19692221732919457 },\n { x: 0.0000036770000000002627, y: -0.20226596597948124 },\n { x: 0.0000036780000000002628, y: -0.20522115224395693 },\n { x: 0.000003679000000000263, y: -0.19483299544647903 },\n { x: 0.000003680000000000263, y: -0.19388613010249903 },\n { x: 0.000003681000000000263, y: -0.19639733680596577 },\n { x: 0.000003682000000000263, y: -0.1689390503621976 },\n { x: 0.000003683000000000263, y: -0.17044731403759816 },\n { x: 0.0000036840000000002632, y: -0.19374204089790645 },\n { x: 0.0000036850000000002633, y: -0.1675409975689446 },\n { x: 0.0000036860000000002634, y: -0.20660545043739661 },\n { x: 0.0000036870000000002634, y: -0.13681171288243932 },\n { x: 0.0000036880000000002635, y: -0.15826465425074074 },\n { x: 0.0000036890000000002636, y: -0.16916622588979255 },\n { x: 0.0000036900000000002637, y: -0.14023553121659668 },\n { x: 0.0000036910000000002637, y: -0.13912450403781482 },\n { x: 0.000003692000000000264, y: -0.13067589983627853 },\n { x: 0.000003693000000000264, y: -0.15337280039374465 },\n { x: 0.000003694000000000264, y: -0.15825999611915012 },\n { x: 0.000003695000000000264, y: -0.13281732910952154 },\n { x: 0.000003696000000000264, y: -0.17229501014605386 },\n { x: 0.000003697000000000264, y: -0.1806662620280943 },\n { x: 0.0000036980000000002643, y: -0.12499329559714006 },\n { x: 0.0000036990000000002643, y: -0.11543293729059019 },\n { x: 0.0000037000000000002644, y: -0.12316933529103916 },\n { x: 0.0000037010000000002645, y: -0.1701944322110603 },\n { x: 0.0000037020000000002646, y: -0.10769377268663166 },\n { x: 0.0000037030000000002646, y: -0.11406562621180977 },\n { x: 0.0000037040000000002647, y: -0.17386146748736747 },\n { x: 0.000003705000000000265, y: -0.11012940213678613 },\n { x: 0.000003706000000000265, y: -0.12978672581222384 },\n { x: 0.000003707000000000265, y: -0.13296115344051507 },\n { x: 0.000003708000000000265, y: -0.11691147963342609 },\n { x: 0.000003709000000000265, y: -0.13230472974168364 },\n { x: 0.000003710000000000265, y: -0.10915405048248283 },\n { x: 0.0000037110000000002653, y: -0.10909443635017188 },\n { x: 0.0000037120000000002653, y: -0.09826664037124794 },\n { x: 0.0000037130000000002654, y: -0.09970068231943655 },\n { x: 0.0000037140000000002655, y: -0.13809769724192994 },\n { x: 0.0000037150000000002656, y: -0.14594921961839072 },\n { x: 0.0000037160000000002656, y: -0.09675638822372708 },\n { x: 0.0000037170000000002657, y: -0.1063050068762987 },\n { x: 0.0000037180000000002658, y: -0.10376056800360725 },\n { x: 0.000003719000000000266, y: -0.1160081568326403 },\n { x: 0.000003720000000000266, y: -0.10346434330894624 },\n { x: 0.000003721000000000266, y: -0.13201970316289074 },\n { x: 0.000003722000000000266, y: -0.11913973872356406 },\n { x: 0.000003723000000000266, y: -0.06720063689900498 },\n { x: 0.0000037240000000002662, y: -0.14048725943224846 },\n { x: 0.0000037250000000002663, y: -0.1292530467843626 },\n { x: 0.0000037260000000002664, y: -0.08110569186208576 },\n { x: 0.0000037270000000002665, y: -0.0890413296838159 },\n { x: 0.0000037280000000002665, y: -0.1231985482901011 },\n { x: 0.0000037290000000002666, y: -0.11458837147206197 },\n { x: 0.0000037300000000002667, y: -0.07381400603750093 },\n { x: 0.0000037310000000002668, y: -0.053400397120431195 },\n { x: 0.000003732000000000267, y: -0.08266182157026147 },\n { x: 0.000003733000000000267, y: -0.04833001388380807 },\n { x: 0.000003734000000000267, y: -0.10066452203602488 },\n { x: 0.000003735000000000267, y: -0.08349254783591059 },\n { x: 0.000003736000000000267, y: -0.06895652785001928 },\n { x: 0.000003737000000000267, y: -0.06260617030120882 },\n { x: 0.0000037380000000002673, y: -0.042518965883061186 },\n { x: 0.0000037390000000002674, y: -0.07414478435452504 },\n { x: 0.0000037400000000002674, y: -0.02933329573022457 },\n { x: 0.0000037410000000002675, y: -0.0770531356666485 },\n { x: 0.0000037420000000002676, y: -0.043785869233870366 },\n { x: 0.0000037430000000002677, y: -0.06717708245934167 },\n { x: 0.0000037440000000002677, y: -0.08227591141091063 },\n { x: 0.000003745000000000268, y: -0.026727511228420688 },\n { x: 0.000003746000000000268, y: -0.05100667317384938 },\n { x: 0.000003747000000000268, y: -0.015177963684023923 },\n { x: 0.000003748000000000268, y: -0.07262077600333502 },\n { x: 0.000003749000000000268, y: -0.06624364896262364 },\n { x: 0.000003750000000000268, y: -0.00483025732210484 },\n { x: 0.0000037510000000002683, y: -0.05989242276732176 },\n { x: 0.0000037520000000002683, y: -0.002843924380259495 },\n { x: 0.0000037530000000002684, y: -0.03294526433995804 },\n { x: 0.0000037540000000002685, y: -0.045118598256665504 },\n { x: 0.0000037550000000002686, y: -0.06369476170307739 },\n { x: 0.0000037560000000002686, y: -0.04017565357806448 },\n { x: 0.0000037570000000002687, y: -0.015220180587088093 },\n { x: 0.0000037580000000002688, y: 0.001802477434737524 },\n { x: 0.000003759000000000269, y: -0.054372537874282846 },\n { x: 0.000003760000000000269, y: 0.010110012768363763 },\n { x: 0.000003761000000000269, y: -0.048776544057665364 },\n { x: 0.000003762000000000269, y: -0.016792919789972743 },\n { x: 0.000003763000000000269, y: -0.025340107766488127 },\n { x: 0.0000037640000000002692, y: -0.046065697723910344 },\n { x: 0.0000037650000000002693, y: 0.012686814325215911 },\n { x: 0.0000037660000000002694, y: -0.00771890781037642 },\n { x: 0.0000037670000000002695, y: -0.03206562652826235 },\n { x: 0.0000037680000000002695, y: -0.0015275663406866232 },\n { x: 0.0000037690000000002696, y: -0.03429512017916918 },\n { x: 0.0000037700000000002697, y: 0.016452602495524053 },\n { x: 0.0000037710000000002698, y: 0.031139428404530524 },\n { x: 0.00000377200000000027, y: 0.009649702869944404 },\n { x: 0.00000377300000000027, y: 0.02165727378920746 },\n { x: 0.00000377400000000027, y: -0.02294559677736318 },\n { x: 0.00000377500000000027, y: 0.0260090215557899 },\n { x: 0.00000377600000000027, y: -0.012429611934390298 },\n { x: 0.00000377700000000027, y: -0.0007193451913712484 },\n { x: 0.0000037780000000002703, y: 0.0318007177951392 },\n { x: 0.0000037790000000002704, y: -0.011244818065019896 },\n { x: 0.0000037800000000002704, y: -0.01526988306237366 },\n { x: 0.0000037810000000002705, y: -0.00821774264395219 },\n { x: 0.0000037820000000002706, y: -0.013105767542221858 },\n { x: 0.0000037830000000002707, y: 0.03754767946904605 },\n { x: 0.0000037840000000002707, y: 0.029533656322265095 },\n { x: 0.000003785000000000271, y: 0.06489156232485484 },\n { x: 0.000003786000000000271, y: -0.00387258615531557 },\n { x: 0.000003787000000000271, y: 0.06397243280059939 },\n { x: 0.000003788000000000271, y: 0.020436486124118282 },\n { x: 0.000003789000000000271, y: 0.0074974107423625945 },\n { x: 0.000003790000000000271, y: 0.07326347961668889 },\n { x: 0.0000037910000000002713, y: 0.018585166744699667 },\n { x: 0.0000037920000000002713, y: 0.0760775610069449 },\n { x: 0.0000037930000000002714, y: 0.01666436767191911 },\n { x: 0.0000037940000000002715, y: 0.06145317462612715 },\n { x: 0.0000037950000000002716, y: 0.04829386226021341 },\n { x: 0.0000037960000000002716, y: 0.04490458370568937 },\n { x: 0.0000037970000000002717, y: 0.07597543508147978 },\n { x: 0.0000037980000000002718, y: 0.07116136092475545 },\n { x: 0.000003799000000000272, y: 0.005808219499573497 },\n { x: 0.000003800000000000272, y: 0.05276224485842819 },\n { x: 0.000003801000000000272, y: 0.028874560500370405 },\n { x: 0.000003802000000000272, y: 0.04478002584097804 },\n { x: 0.000003803000000000272, y: 0.07871585412749102 },\n { x: 0.0000038040000000002722, y: 0.046958859880951935 },\n { x: 0.0000038050000000002723, y: 0.0776039256859531 },\n { x: 0.0000038060000000002724, y: 0.10532685677571765 },\n { x: 0.0000038070000000002725, y: 0.07076440364962333 },\n { x: 0.0000038080000000002725, y: 0.10230210099760137 },\n { x: 0.0000038090000000002726, y: 0.1135899831592243 },\n { x: 0.0000038100000000002727, y: 0.08391379724999577 },\n { x: 0.0000038110000000002728, y: 0.1115640950006993 },\n { x: 0.000003812000000000273, y: 0.07091348807832315 },\n { x: 0.000003813000000000273, y: 0.1086826776812232 },\n { x: 0.000003814000000000273, y: 0.11105224572607775 },\n { x: 0.000003815000000000273, y: 0.07731906479005708 },\n { x: 0.000003816000000000272, y: 0.08715848089043139 },\n { x: 0.000003817000000000272, y: 0.056640798980936505 },\n { x: 0.000003818000000000272, y: 0.10287571788139943 },\n { x: 0.000003819000000000271, y: 0.06119234123740106 },\n { x: 0.000003820000000000271, y: 0.06397675982326925 },\n { x: 0.0000038210000000002706, y: 0.09203401659943122 },\n { x: 0.00000382200000000027, y: 0.11312228500053674 },\n { x: 0.00000382300000000027, y: 0.14002531803300985 },\n { x: 0.0000038240000000002695, y: 0.08497534411378144 },\n { x: 0.000003825000000000269, y: 0.0858097096668864 },\n { x: 0.000003826000000000269, y: 0.07123891760835813 },\n { x: 0.0000038270000000002685, y: 0.049347380300456774 },\n { x: 0.000003828000000000268, y: 0.13862914417678432 },\n { x: 0.000003829000000000268, y: 0.11483591049615212 },\n { x: 0.000003830000000000267, y: 0.10705597948527867 },\n { x: 0.000003831000000000267, y: 0.1402268057406815 },\n { x: 0.000003832000000000267, y: 0.11056001501760651 },\n { x: 0.000003833000000000266, y: 0.14751743115344665 },\n { x: 0.000003834000000000266, y: 0.10029696799255243 },\n { x: 0.000003835000000000266, y: 0.09257080616606486 },\n { x: 0.000003836000000000265, y: 0.08829811528522333 },\n { x: 0.000003837000000000265, y: 0.09716784316015845 },\n { x: 0.000003838000000000265, y: 0.14736460895078715 },\n { x: 0.000003839000000000264, y: 0.11708640541053147 },\n { x: 0.000003840000000000264, y: 0.1403477066434798 },\n { x: 0.000003841000000000264, y: 0.16249826777799295 },\n { x: 0.000003842000000000263, y: 0.10725341147147689 },\n { x: 0.000003843000000000263, y: 0.1599500489651751 },\n { x: 0.0000038440000000002625, y: 0.15348589512435795 },\n { x: 0.000003845000000000262, y: 0.15616786052220136 },\n { x: 0.000003846000000000262, y: 0.11929751969112422 },\n { x: 0.0000038470000000002615, y: 0.15878084276588464 },\n { x: 0.000003848000000000261, y: 0.17105464271665977 },\n { x: 0.000003849000000000261, y: 0.1289403054900729 },\n { x: 0.0000038500000000002604, y: 0.18283198399244455 },\n { x: 0.00000385100000000026, y: 0.18097604588431326 },\n { x: 0.00000385200000000026, y: 0.12682878264972203 },\n { x: 0.000003853000000000259, y: 0.16355800125735143 },\n { x: 0.000003854000000000259, y: 0.1509092017288921 },\n { x: 0.000003855000000000259, y: 0.13808921212691533 },\n { x: 0.000003856000000000258, y: 0.13132946130058273 },\n { x: 0.000003857000000000258, y: 0.14951675067794729 },\n { x: 0.000003858000000000258, y: 0.187779399064356 },\n { x: 0.000003859000000000257, y: 0.19915737915780304 },\n { x: 0.000003860000000000257, y: 0.13190700260731733 },\n { x: 0.000003861000000000257, y: 0.164841759517776 },\n { x: 0.000003862000000000256, y: 0.176515087745802 },\n { x: 0.000003863000000000256, y: 0.16222479410417287 },\n { x: 0.0000038640000000002556, y: 0.13732543716610482 },\n { x: 0.000003865000000000255, y: 0.16678724026455302 },\n { x: 0.000003866000000000255, y: 0.18906531880529184 },\n { x: 0.0000038670000000002545, y: 0.1781885697234449 },\n { x: 0.000003868000000000254, y: 0.19683666242754405 },\n { x: 0.000003869000000000254, y: 0.2156003861530912 },\n { x: 0.0000038700000000002535, y: 0.15546713749533556 },\n { x: 0.000003871000000000253, y: 0.16426159288706357 },\n { x: 0.000003872000000000253, y: 0.16688687412384265 },\n { x: 0.0000038730000000002524, y: 0.17010253336067568 },\n { x: 0.000003874000000000252, y: 0.1811382032127123 },\n { x: 0.000003875000000000252, y: 0.18742345737547758 },\n { x: 0.000003876000000000251, y: 0.20647237237574914 },\n { x: 0.000003877000000000251, y: 0.21245489307524304 },\n { x: 0.000003878000000000251, y: 0.19999310263799502 },\n { x: 0.00000387900000000025, y: 0.23069017609041784 },\n { x: 0.00000388000000000025, y: 0.22585792893376067 },\n { x: 0.00000388100000000025, y: 0.20405585569881896 },\n { x: 0.000003882000000000249, y: 0.22571343413267697 },\n { x: 0.000003883000000000249, y: 0.1821274212266734 },\n { x: 0.000003884000000000249, y: 0.20266850259056965 },\n { x: 0.000003885000000000248, y: 0.21951932844832867 },\n { x: 0.000003886000000000248, y: 0.237354950317896 },\n { x: 0.0000038870000000002476, y: 0.23823016763106175 },\n { x: 0.000003888000000000247, y: 0.17066206490107963 },\n { x: 0.000003889000000000247, y: 0.24482465919028346 },\n { x: 0.0000038900000000002465, y: 0.22426345829299338 },\n { x: 0.000003891000000000246, y: 0.20455399033507282 },\n { x: 0.000003892000000000246, y: 0.22885939676625072 },\n { x: 0.0000038930000000002455, y: 0.19361735935302135 },\n { x: 0.000003894000000000245, y: 0.22332636310680162 },\n { x: 0.000003895000000000245, y: 0.19284531068228294 },\n { x: 0.000003896000000000244, y: 0.20365087774992216 },\n { x: 0.000003897000000000244, y: 0.24955030517911717 },\n { x: 0.000003898000000000244, y: 0.25046713806857407 },\n { x: 0.000003899000000000243, y: 0.1906027253273096 },\n { x: 0.000003900000000000243, y: 0.24095190069761946 },\n { x: 0.000003901000000000243, y: 0.25909361403634457 },\n { x: 0.000003902000000000242, y: 0.21846878615554152 },\n { x: 0.000003903000000000242, y: 0.26004066163073547 },\n { x: 0.000003904000000000242, y: 0.2365220832157309 },\n { x: 0.000003905000000000241, y: 0.25524244941855867 },\n { x: 0.000003906000000000241, y: 0.22617139638491685 },\n { x: 0.000003907000000000241, y: 0.25294493085461245 },\n { x: 0.00000390800000000024, y: 0.2356879098969712 },\n { x: 0.00000390900000000024, y: 0.2712195241889297 },\n { x: 0.0000039100000000002395, y: 0.24902038542873603 },\n { x: 0.000003911000000000239, y: 0.256834949545172 },\n { x: 0.000003912000000000239, y: 0.21593483454336798 },\n { x: 0.0000039130000000002385, y: 0.207946740672267 },\n { x: 0.000003914000000000238, y: 0.22112392424859914 },\n { x: 0.000003915000000000238, y: 0.23602298927008508 },\n { x: 0.0000039160000000002375, y: 0.24749596895126755 },\n { x: 0.000003917000000000237, y: 0.24662394406520857 },\n { x: 0.000003918000000000237, y: 0.22788109473926815 },\n { x: 0.000003919000000000236, y: 0.2315760541341182 },\n { x: 0.000003920000000000236, y: 0.22688726835610262 },\n { x: 0.000003921000000000236, y: 0.21718473617578068 },\n { x: 0.000003922000000000235, y: 0.2753480836058232 },\n { x: 0.000003923000000000235, y: 0.23022057390042344 },\n { x: 0.000003924000000000235, y: 0.22132307559394876 },\n { x: 0.000003925000000000234, y: 0.23986304778703177 },\n { x: 0.000003926000000000234, y: 0.23588125213618022 },\n { x: 0.000003927000000000234, y: 0.2381327081360886 },\n { x: 0.000003928000000000233, y: 0.2699992863971873 },\n { x: 0.000003929000000000233, y: 0.22095722644745924 },\n { x: 0.0000039300000000002326, y: 0.29691962032816877 },\n { x: 0.000003931000000000232, y: 0.2332812010583422 },\n { x: 0.000003932000000000232, y: 0.2697119646366144 },\n { x: 0.0000039330000000002315, y: 0.2836801921842508 },\n { x: 0.000003934000000000231, y: 0.257749416804988 },\n { x: 0.000003935000000000231, y: 0.235641898115553 },\n { x: 0.0000039360000000002305, y: 0.2951186014708261 },\n { x: 0.00000393700000000023, y: 0.2701076565792924 },\n { x: 0.00000393800000000023, y: 0.25372482973947696 },\n { x: 0.0000039390000000002294, y: 0.2731422399865056 },\n { x: 0.000003940000000000229, y: 0.24908123546636854 },\n { x: 0.000003941000000000229, y: 0.2827896632338716 },\n { x: 0.000003942000000000228, y: 0.27723750906049843 },\n { x: 0.000003943000000000228, y: 0.29731718904158544 },\n { x: 0.000003944000000000228, y: 0.3119657046844713 },\n { x: 0.000003945000000000227, y: 0.3077605156384501 },\n { x: 0.000003946000000000227, y: 0.24506538429052305 },\n { x: 0.000003947000000000227, y: 0.2660542241684431 },\n { x: 0.000003948000000000226, y: 0.28931788653636853 },\n { x: 0.000003949000000000226, y: 0.2829600520139954 },\n { x: 0.000003950000000000226, y: 0.24550170706886448 },\n { x: 0.000003951000000000225, y: 0.2566977406375457 },\n { x: 0.000003952000000000225, y: 0.29996800172204136 },\n { x: 0.0000039530000000002246, y: 0.2932443953012048 },\n { x: 0.000003954000000000224, y: 0.2802408129586989 },\n { x: 0.000003955000000000224, y: 0.27222080097789864 },\n { x: 0.0000039560000000002235, y: 0.2999817718696296 },\n { x: 0.000003957000000000223, y: 0.2486093044265007 },\n { x: 0.000003958000000000223, y: 0.3243828265603146 },\n { x: 0.0000039590000000002225, y: 0.2589558120162996 },\n { x: 0.000003960000000000222, y: 0.3065967261610589 },\n { x: 0.000003961000000000222, y: 0.30061194324161555 },\n { x: 0.0000039620000000002214, y: 0.2604416383131553 },\n { x: 0.000003963000000000221, y: 0.295481595872502 },\n { x: 0.000003964000000000221, y: 0.31160085443318536 },\n { x: 0.00000396500000000022, y: 0.3045149539113448 },\n { x: 0.00000396600000000022, y: 0.298803037543689 },\n { x: 0.00000396700000000022, y: 0.261506194513889 },\n { x: 0.000003968000000000219, y: 0.2766012118181859 },\n { x: 0.000003969000000000219, y: 0.33097169997672404 },\n { x: 0.000003970000000000219, y: 0.2793473685981499 },\n { x: 0.000003971000000000218, y: 0.262161497760936 },\n { x: 0.000003972000000000218, y: 0.3126806367572568 },\n { x: 0.000003973000000000218, y: 0.2814864069064685 },\n { x: 0.000003974000000000217, y: 0.32208444644381456 },\n { x: 0.000003975000000000217, y: 0.31238103864584366 },\n { x: 0.0000039760000000002166, y: 0.2927671341251896 },\n { x: 0.000003977000000000216, y: 0.2680932099612712 },\n { x: 0.000003978000000000216, y: 0.312118337698919 },\n { x: 0.0000039790000000002155, y: 0.2770845333330829 },\n { x: 0.000003980000000000215, y: 0.2849134186659972 },\n { x: 0.000003981000000000215, y: 0.2811576706237539 },\n { x: 0.0000039820000000002145, y: 0.30152808046471263 },\n { x: 0.000003983000000000214, y: 0.2749363630168921 },\n { x: 0.000003984000000000214, y: 0.32380804118333906 },\n { x: 0.000003985000000000213, y: 0.2744281771569975 },\n { x: 0.000003986000000000213, y: 0.3333489248885281 },\n { x: 0.000003987000000000213, y: 0.3199531556665767 },\n { x: 0.000003988000000000212, y: 0.30298622743647985 },\n { x: 0.000003989000000000212, y: 0.2775506071658868 },\n { x: 0.000003990000000000212, y: 0.32834200980805067 },\n { x: 0.000003991000000000211, y: 0.28061834420608794 },\n { x: 0.000003992000000000211, y: 0.32536447344878244 },\n { x: 0.000003993000000000211, y: 0.3395079551066617 },\n { x: 0.00000399400000000021, y: 0.28742308921087417 },\n { x: 0.00000399500000000021, y: 0.28734831560210633 },\n { x: 0.00000399600000000021, y: 0.29946355110392747 },\n { x: 0.000003997000000000209, y: 0.2943922872962459 },\n { x: 0.000003998000000000209, y: 0.3151724677333371 },\n { x: 0.0000039990000000002085, y: 0.29099808928701176 },\n { x: 0.000004000000000000208, y: 0.28340280595764616 },\n { x: 0.000004001000000000208, y: 0.3422715322548612 },\n { x: 0.0000040020000000002075, y: 0.30187033980900085 },\n { x: 0.000004003000000000207, y: 0.34492871377833345 },\n { x: 0.000004004000000000207, y: 0.317686638017795 },\n { x: 0.0000040050000000002064, y: 0.31162185107005064 },\n { x: 0.000004006000000000206, y: 0.3015063948557598 },\n { x: 0.000004007000000000206, y: 0.31769137936352204 },\n { x: 0.000004008000000000205, y: 0.29745675018269324 },\n { x: 0.000004009000000000205, y: 0.32967674333254005 },\n { x: 0.000004010000000000205, y: 0.30495116756365953 },\n { x: 0.000004011000000000204, y: 0.3423999663491054 },\n { x: 0.000004012000000000204, y: 0.328172835054873 },\n { x: 0.000004013000000000204, y: 0.283977614666415 },\n { x: 0.000004014000000000203, y: 0.3144810181605132 },\n { x: 0.000004015000000000203, y: 0.38328983726262034 },\n { x: 0.000004016000000000203, y: 0.34060241045676604 },\n { x: 0.000004017000000000202, y: 0.3002736565357097 },\n { x: 0.000004018000000000202, y: 0.32929999902266477 },\n { x: 0.0000040190000000002016, y: 0.2857738486662874 },\n { x: 0.000004020000000000201, y: 0.3288446902785198 },\n { x: 0.000004021000000000201, y: 0.3407966533358474 },\n { x: 0.0000040220000000002005, y: 0.2861152100268766 },\n { x: 0.0000040230000000002, y: 0.3271032701370034 },\n { x: 0.0000040240000000002, y: 0.29725590727265644 },\n { x: 0.0000040250000000001995, y: 0.2957762403506275 },\n { x: 0.000004026000000000199, y: 0.33966310713422404 },\n { x: 0.000004027000000000199, y: 0.36096201287710894 },\n { x: 0.0000040280000000001984, y: 0.35729034558791334 },\n { x: 0.000004029000000000198, y: 0.3124090652959692 },\n { x: 0.000004030000000000198, y: 0.33408174508051514 },\n { x: 0.000004031000000000197, y: 0.2950126154364728 },\n { x: 0.000004032000000000197, y: 0.3142967918930977 },\n { x: 0.000004033000000000197, y: 0.29206159333072185 },\n { x: 0.000004034000000000196, y: 0.2947008791127249 },\n { x: 0.000004035000000000196, y: 0.3398102425902416 },\n { x: 0.000004036000000000196, y: 0.3460630553593029 },\n { x: 0.000004037000000000195, y: 0.3141006873647608 },\n { x: 0.000004038000000000195, y: 0.35586167474648384 },\n { x: 0.000004039000000000195, y: 0.3485147196606129 },\n { x: 0.000004040000000000194, y: 0.3490019547840109 },\n { x: 0.000004041000000000194, y: 0.3210659656263639 },\n { x: 0.0000040420000000001936, y: 0.2931472864148488 },\n { x: 0.000004043000000000193, y: 0.3474972967907737 },\n { x: 0.000004044000000000193, y: 0.31802863199692205 },\n { x: 0.0000040450000000001925, y: 0.37709378836391627 },\n { x: 0.000004046000000000192, y: 0.2896363310600595 },\n { x: 0.000004047000000000192, y: 0.29798749838992117 },\n { x: 0.0000040480000000001915, y: 0.3552511512225615 },\n { x: 0.000004049000000000191, y: 0.3653601251154573 },\n { x: 0.000004050000000000191, y: 0.30223740393356713 },\n { x: 0.00000405100000000019, y: 0.33297814352369504 },\n { x: 0.00000405200000000019, y: 0.34314943266453635 },\n { x: 0.00000405300000000019, y: 0.3243056620796294 },\n { x: 0.000004054000000000189, y: 0.34959610945369457 },\n { x: 0.000004055000000000189, y: 0.34250077433766457 },\n { x: 0.000004056000000000189, y: 0.35505464072555626 },\n { x: 0.000004057000000000188, y: 0.32690676455837 },\n { x: 0.000004058000000000188, y: 0.3660747431632196 },\n { x: 0.000004059000000000188, y: 0.3615097254596732 },\n { x: 0.000004060000000000187, y: 0.34531676639100123 },\n { x: 0.000004061000000000187, y: 0.35682792899331395 },\n { x: 0.000004062000000000187, y: 0.31388688355642863 },\n { x: 0.000004063000000000186, y: 0.31295555883694015 },\n { x: 0.000004064000000000186, y: 0.3658041684694592 },\n { x: 0.0000040650000000001855, y: 0.3509468195438988 },\n { x: 0.000004066000000000185, y: 0.3346270001207663 },\n { x: 0.000004067000000000185, y: 0.3278174309867702 },\n { x: 0.0000040680000000001845, y: 0.3271524745190602 },\n { x: 0.000004069000000000184, y: 0.3399040303374648 },\n { x: 0.000004070000000000184, y: 0.36065816849987253 },\n { x: 0.0000040710000000001835, y: 0.2892205309483447 },\n { x: 0.000004072000000000183, y: 0.30752530118261684 },\n { x: 0.000004073000000000183, y: 0.3478386327640257 },\n { x: 0.000004074000000000182, y: 0.3019679550439449 },\n { x: 0.000004075000000000182, y: 0.3191150592098787 },\n { x: 0.000004076000000000182, y: 0.3626369938899318 },\n { x: 0.000004077000000000181, y: 0.3601093301647171 },\n { x: 0.000004078000000000181, y: 0.36246721544608235 },\n { x: 0.000004079000000000181, y: 0.3432884100260415 },\n { x: 0.00000408000000000018, y: 0.31877152700123657 },\n { x: 0.00000408100000000018, y: 0.35788771360499283 },\n { x: 0.00000408200000000018, y: 0.3093204907844644 },\n { x: 0.000004083000000000179, y: 0.29666535367393415 },\n { x: 0.000004084000000000179, y: 0.360970452148224 },\n { x: 0.0000040850000000001786, y: 0.34554986408595434 },\n { x: 0.000004086000000000178, y: 0.29454771039585925 },\n { x: 0.000004087000000000178, y: 0.35821987546650286 },\n { x: 0.0000040880000000001775, y: 0.2938160063722 },\n { x: 0.000004089000000000177, y: 0.3604864105624299 },\n { x: 0.000004090000000000177, y: 0.3124656376390679 },\n { x: 0.0000040910000000001765, y: 0.2849200104262758 },\n { x: 0.000004092000000000176, y: 0.33944348077477526 },\n { x: 0.000004093000000000176, y: 0.29174335423889747 },\n { x: 0.0000040940000000001754, y: 0.29951354609913 },\n { x: 0.000004095000000000175, y: 0.35724000082751667 },\n { x: 0.000004096000000000175, y: 0.3283230671036082 },\n { x: 0.000004097000000000174, y: 0.3522231936853684 },\n { x: 0.000004098000000000174, y: 0.29996857475406735 },\n { x: 0.000004099000000000174, y: 0.3006383368854904 },\n { x: 0.000004100000000000173, y: 0.33937777049021517 },\n { x: 0.000004101000000000173, y: 0.29586928620024366 },\n { x: 0.000004102000000000173, y: 0.30757305070060775 },\n { x: 0.000004103000000000172, y: 0.32645161200537803 },\n { x: 0.000004104000000000172, y: 0.33623725264246135 },\n { x: 0.000004105000000000172, y: 0.2815048406339397 },\n { x: 0.000004106000000000171, y: 0.3034415864677118 },\n { x: 0.000004107000000000171, y: 0.33929007613649487 },\n { x: 0.0000041080000000001706, y: 0.3188050660842236 },\n { x: 0.00000410900000000017, y: 0.3169601994501379 },\n { x: 0.00000411000000000017, y: 0.32253528090780664 },\n { x: 0.0000041110000000001695, y: 0.3062493577079485 },\n { x: 0.000004112000000000169, y: 0.3304689212384934 },\n { x: 0.000004113000000000169, y: 0.2827148071281308 },\n { x: 0.0000041140000000001685, y: 0.28784364190422307 },\n { x: 0.000004115000000000168, y: 0.314776859785628 },\n { x: 0.000004116000000000168, y: 0.27819425768339046 },\n { x: 0.0000041170000000001674, y: 0.29968243532794836 },\n { x: 0.000004118000000000167, y: 0.35079321292278703 },\n { x: 0.000004119000000000167, y: 0.3266872226749194 },\n { x: 0.000004120000000000166, y: 0.3292060806693942 },\n { x: 0.000004121000000000166, y: 0.3287372130429182 },\n { x: 0.000004122000000000166, y: 0.31366107578749985 },\n { x: 0.000004123000000000165, y: 0.30147312498007645 },\n { x: 0.000004124000000000165, y: 0.28688326200791414 },\n { x: 0.000004125000000000165, y: 0.3008962095460737 },\n { x: 0.000004126000000000164, y: 0.3454115627701336 },\n { x: 0.000004127000000000164, y: 0.2999771018349369 },\n { x: 0.000004128000000000164, y: 0.24712321707103477 },\n { x: 0.000004129000000000163, y: 0.2880825966992047 },\n { x: 0.000004130000000000163, y: 0.3418357437789369 },\n { x: 0.0000041310000000001626, y: 0.3381489157375517 },\n { x: 0.000004132000000000162, y: 0.31024847819304036 },\n { x: 0.000004133000000000162, y: 0.31519254082685777 },\n { x: 0.0000041340000000001615, y: 0.3302995497118496 },\n { x: 0.000004135000000000161, y: 0.3186009699338797 },\n { x: 0.000004136000000000161, y: 0.26606897018268044 },\n { x: 0.0000041370000000001605, y: 0.28903869403793364 },\n { x: 0.00000413800000000016, y: 0.33367298480128865 },\n { x: 0.00000413900000000016, y: 0.30204178281278937 },\n { x: 0.000004140000000000159, y: 0.3272953173021922 },\n { x: 0.000004141000000000159, y: 0.32026960550840106 },\n { x: 0.000004142000000000159, y: 0.29846181505400665 },\n { x: 0.000004143000000000158, y: 0.2710365530621206 },\n { x: 0.000004144000000000158, y: 0.2595526987001278 },\n { x: 0.000004145000000000158, y: 0.29223479234322386 },\n { x: 0.000004146000000000157, y: 0.274935221356404 },\n { x: 0.000004147000000000157, y: 0.321280217210252 },\n { x: 0.000004148000000000157, y: 0.32500978741382525 },\n { x: 0.000004149000000000156, y: 0.26133413197528554 },\n { x: 0.000004150000000000156, y: 0.30185642607768326 },\n { x: 0.000004151000000000156, y: 0.2883337123613331 },\n { x: 0.000004152000000000155, y: 0.3109934137893497 },\n { x: 0.000004153000000000155, y: 0.2768449799905698 },\n { x: 0.0000041540000000001545, y: 0.3016692803484889 },\n { x: 0.000004155000000000154, y: 0.3038029317239212 },\n { x: 0.000004156000000000154, y: 0.26779097994536893 },\n { x: 0.0000041570000000001535, y: 0.2601611567705239 },\n { x: 0.000004158000000000153, y: 0.34829336129431965 },\n { x: 0.000004159000000000153, y: 0.2748186263793167 },\n { x: 0.0000041600000000001524, y: 0.26513368619261984 },\n { x: 0.000004161000000000152, y: 0.32057708454817924 },\n { x: 0.000004162000000000152, y: 0.2606249385869175 },\n { x: 0.000004163000000000151, y: 0.2750139415711119 },\n { x: 0.000004164000000000151, y: 0.3207568452778675 },\n { x: 0.000004165000000000151, y: 0.30027014878419644 },\n { x: 0.00000416600000000015, y: 0.2734393771458872 },\n { x: 0.00000416700000000015, y: 0.314543710437143 },\n { x: 0.00000416800000000015, y: 0.2655705677714055 },\n { x: 0.000004169000000000149, y: 0.2944002222014817 },\n { x: 0.000004170000000000149, y: 0.2723351647153971 },\n { x: 0.000004171000000000149, y: 0.30883708207603056 },\n { x: 0.000004172000000000148, y: 0.2797275304124689 },\n { x: 0.000004173000000000148, y: 0.2472797856518716 },\n { x: 0.0000041740000000001476, y: 0.27953123666601287 },\n { x: 0.000004175000000000147, y: 0.28291965261150304 },\n { x: 0.000004176000000000147, y: 0.27186963503698425 },\n { x: 0.0000041770000000001465, y: 0.27456006397270294 },\n { x: 0.000004178000000000146, y: 0.2647037813966166 },\n { x: 0.000004179000000000146, y: 0.25783019403355195 },\n { x: 0.0000041800000000001455, y: 0.3058920754230025 },\n { x: 0.000004181000000000145, y: 0.25761362340127414 },\n { x: 0.000004182000000000145, y: 0.2382819755607477 },\n { x: 0.0000041830000000001444, y: 0.2778913000129344 },\n { x: 0.000004184000000000144, y: 0.30338646181174156 },\n { x: 0.000004185000000000144, y: 0.2292683099058369 },\n { x: 0.000004186000000000143, y: 0.23936823127933687 },\n { x: 0.000004187000000000143, y: 0.24354821922455636 },\n { x: 0.000004188000000000143, y: 0.30028417547403735 },\n { x: 0.000004189000000000142, y: 0.2383135215495772 },\n { x: 0.000004190000000000142, y: 0.23212826275582604 },\n { x: 0.000004191000000000142, y: 0.2546818345092802 },\n { x: 0.000004192000000000141, y: 0.2961027770875351 },\n { x: 0.000004193000000000141, y: 0.2928101899940667 },\n { x: 0.000004194000000000141, y: 0.22070527048465552 },\n { x: 0.00000419500000000014, y: 0.24429257890590503 },\n { x: 0.00000419600000000014, y: 0.2373063644096479 },\n { x: 0.0000041970000000001396, y: 0.2553542710967861 },\n { x: 0.000004198000000000139, y: 0.2582336950314104 },\n { x: 0.000004199000000000139, y: 0.24001843932770395 },\n { x: 0.0000042000000000001385, y: 0.22697619314476405 },\n { x: 0.000004201000000000138, y: 0.23767382861571706 },\n { x: 0.000004202000000000138, y: 0.28686973796591725 },\n { x: 0.0000042030000000001375, y: 0.27195732910402926 },\n { x: 0.000004204000000000137, y: 0.25156327661549976 },\n { x: 0.000004205000000000137, y: 0.24955415104548256 },\n { x: 0.000004206000000000136, y: 0.22347024930452125 },\n { x: 0.000004207000000000136, y: 0.21793680389674783 },\n { x: 0.000004208000000000136, y: 0.22372499196585466 },\n { x: 0.000004209000000000135, y: 0.24179044209520523 },\n { x: 0.000004210000000000135, y: 0.20222356243268153 },\n { x: 0.000004211000000000135, y: 0.2152411401506903 },\n { x: 0.000004212000000000134, y: 0.2270829581751008 },\n { x: 0.000004213000000000134, y: 0.18647217122326848 },\n { x: 0.000004214000000000134, y: 0.23297886740746357 },\n { x: 0.000004215000000000133, y: 0.2561343606351684 },\n { x: 0.000004216000000000133, y: 0.20090129381185096 },\n { x: 0.000004217000000000133, y: 0.2558120862659981 },\n { x: 0.000004218000000000132, y: 0.23310990254643485 },\n { x: 0.000004219000000000132, y: 0.2688110815214907 },\n { x: 0.0000042200000000001315, y: 0.24018266371518207 },\n { x: 0.000004221000000000131, y: 0.20766953665529314 },\n { x: 0.000004222000000000131, y: 0.22513938659217325 },\n { x: 0.0000042230000000001305, y: 0.23356047621965914 },\n { x: 0.00000422400000000013, y: 0.20277467702433738 },\n { x: 0.00000422500000000013, y: 0.22790260141481103 },\n { x: 0.0000042260000000001295, y: 0.19654857272764104 },\n { x: 0.000004227000000000129, y: 0.1873712435222703 },\n { x: 0.000004228000000000129, y: 0.22221579765000743 },\n { x: 0.000004229000000000128, y: 0.2193491965344589 },\n { x: 0.000004230000000000128, y: 0.25399192372856777 },\n { x: 0.000004231000000000128, y: 0.24363502736284717 },\n { x: 0.000004232000000000127, y: 0.17892048918442582 },\n { x: 0.000004233000000000127, y: 0.19671806997380567 },\n { x: 0.000004234000000000127, y: 0.1821587215137482 },\n { x: 0.000004235000000000126, y: 0.18548135354182982 },\n { x: 0.000004236000000000126, y: 0.21283920073611234 },\n { x: 0.000004237000000000126, y: 0.20236417698613043 },\n { x: 0.000004238000000000125, y: 0.18635103831189095 },\n { x: 0.000004239000000000125, y: 0.20998163028402456 },\n { x: 0.0000042400000000001246, y: 0.23419664386908426 },\n { x: 0.000004241000000000124, y: 0.2067023208668631 },\n { x: 0.000004242000000000124, y: 0.1782632116925454 },\n { x: 0.0000042430000000001235, y: 0.17907832396593507 },\n { x: 0.000004244000000000123, y: 0.19542106205048176 },\n { x: 0.000004245000000000123, y: 0.19070513269350756 },\n { x: 0.0000042460000000001225, y: 0.21461149723223688 },\n { x: 0.000004247000000000122, y: 0.21352789021977517 },\n { x: 0.000004248000000000122, y: 0.18803332531344147 },\n { x: 0.0000042490000000001214, y: 0.1616408097184573 },\n { x: 0.000004250000000000121, y: 0.18228897891741028 },\n { x: 0.000004251000000000121, y: 0.1776526683241611 },\n { x: 0.00000425200000000012, y: 0.17531842286266935 },\n { x: 0.00000425300000000012, y: 0.17650653212167858 },\n { x: 0.00000425400000000012, y: 0.2020222680810568 },\n { x: 0.000004255000000000119, y: 0.18770466365712682 },\n { x: 0.000004256000000000119, y: 0.17783037052412898 },\n { x: 0.000004257000000000119, y: 0.15536286436244168 },\n { x: 0.000004258000000000118, y: 0.21656348542041054 },\n { x: 0.000004259000000000118, y: 0.15309110442555518 },\n { x: 0.000004260000000000118, y: 0.14713620992430998 },\n { x: 0.000004261000000000117, y: 0.18769171558725903 },\n { x: 0.000004262000000000117, y: 0.19048505007538724 },\n { x: 0.0000042630000000001166, y: 0.2144122124418425 },\n { x: 0.000004264000000000116, y: 0.20105979271127863 },\n { x: 0.000004265000000000116, y: 0.19167626746805821 },\n { x: 0.0000042660000000001155, y: 0.14241100787789035 },\n { x: 0.000004267000000000115, y: 0.16857751191507228 },\n { x: 0.000004268000000000115, y: 0.205013595133306 },\n { x: 0.0000042690000000001145, y: 0.16344811066667475 },\n { x: 0.000004270000000000114, y: 0.20548807710483846 },\n { x: 0.000004271000000000114, y: 0.149987496107719 },\n { x: 0.0000042720000000001134, y: 0.15223168518747812 },\n { x: 0.000004273000000000113, y: 0.17115602753663375 },\n { x: 0.000004274000000000113, y: 0.13463487398994745 },\n { x: 0.000004275000000000112, y: 0.2015221751132012 },\n { x: 0.000004276000000000112, y: 0.18148287593247617 },\n { x: 0.000004277000000000112, y: 0.185542636601977 },\n { x: 0.000004278000000000111, y: 0.16639551597011448 },\n { x: 0.000004279000000000111, y: 0.1565987571789668 },\n { x: 0.000004280000000000111, y: 0.1650629576360599 },\n { x: 0.00000428100000000011, y: 0.15998266772151187 },\n { x: 0.00000428200000000011, y: 0.15581326547980034 },\n { x: 0.00000428300000000011, y: 0.1207875491276767 },\n { x: 0.000004284000000000109, y: 0.149673801751392 },\n { x: 0.000004285000000000109, y: 0.141257454570004 },\n { x: 0.0000042860000000001086, y: 0.13552674355602248 },\n { x: 0.000004287000000000108, y: 0.14113229102832187 },\n { x: 0.000004288000000000108, y: 0.15552660461017007 },\n { x: 0.0000042890000000001075, y: 0.1142003637643833 },\n { x: 0.000004290000000000107, y: 0.17668621246775368 },\n { x: 0.000004291000000000107, y: 0.13820176632298573 },\n { x: 0.0000042920000000001065, y: 0.1086975990560053 },\n { x: 0.000004293000000000106, y: 0.1753359432997467 },\n { x: 0.000004294000000000106, y: 0.14122852658706625 },\n { x: 0.000004295000000000105, y: 0.11020271586603601 },\n { x: 0.000004296000000000105, y: 0.15685428539564644 },\n { x: 0.000004297000000000105, y: 0.1364433370049846 },\n { x: 0.000004298000000000104, y: 0.16053036701288367 },\n { x: 0.000004299000000000104, y: 0.12610621976950012 },\n { x: 0.000004300000000000104, y: 0.16011467633194026 },\n { x: 0.000004301000000000103, y: 0.11595471557987604 },\n { x: 0.000004302000000000103, y: 0.12506918636756298 },\n { x: 0.000004303000000000103, y: 0.1348087135948512 },\n { x: 0.000004304000000000102, y: 0.12626561025503852 },\n { x: 0.000004305000000000102, y: 0.15135545902956177 },\n { x: 0.000004306000000000102, y: 0.09128700517162773 },\n { x: 0.000004307000000000101, y: 0.15245002987141595 },\n { x: 0.000004308000000000101, y: 0.06873410525652271 },\n { x: 0.0000043090000000001005, y: 0.14129092581504543 },\n { x: 0.0000043100000000001, y: 0.13470422827119907 },\n { x: 0.0000043110000000001, y: 0.11598815403264948 },\n { x: 0.0000043120000000000995, y: 0.08237576741915076 },\n { x: 0.000004313000000000099, y: 0.14399603425330929 },\n { x: 0.000004314000000000099, y: 0.0908113511131135 },\n { x: 0.0000043150000000000984, y: 0.09935390988828743 },\n { x: 0.000004316000000000098, y: 0.13180087147404893 },\n { x: 0.000004317000000000098, y: 0.1357918271303708 },\n { x: 0.000004318000000000097, y: 0.07158566215184109 },\n { x: 0.000004319000000000097, y: 0.07917374154915047 },\n { x: 0.000004320000000000097, y: 0.1063633628171095 },\n { x: 0.000004321000000000096, y: 0.1286166161043339 },\n { x: 0.000004322000000000096, y: 0.07017351129604626 },\n { x: 0.000004323000000000096, y: 0.07035148653951795 },\n { x: 0.000004324000000000095, y: 0.07852562994636646 },\n { x: 0.000004325000000000095, y: 0.11207775574627944 },\n { x: 0.000004326000000000095, y: 0.11036776922661914 },\n { x: 0.000004327000000000094, y: 0.09045549193124772 },\n { x: 0.000004328000000000094, y: 0.08449560919857263 },\n { x: 0.0000043290000000000936, y: 0.09966711067313214 },\n { x: 0.000004330000000000093, y: 0.08746110978349644 },\n { x: 0.000004331000000000093, y: 0.09971865458417072 },\n { x: 0.0000043320000000000925, y: 0.08912241748992299 },\n { x: 0.000004333000000000092, y: 0.10952864346146796 },\n { x: 0.000004334000000000092, y: 0.058999989447568194 },\n { x: 0.0000043350000000000915, y: 0.08978161643976343 },\n { x: 0.000004336000000000091, y: 0.05462358713207488 },\n { x: 0.000004337000000000091, y: 0.05309040053378791 },\n { x: 0.0000043380000000000904, y: 0.07041407137381508 },\n { x: 0.00000433900000000009, y: 0.08571514854010397 },\n { x: 0.00000434000000000009, y: 0.03987556357581434 },\n { x: 0.000004341000000000089, y: 0.06483450322360867 },\n { x: 0.000004342000000000089, y: 0.04183408434868576 },\n { x: 0.000004343000000000089, y: 0.059144956937461066 },\n { x: 0.000004344000000000088, y: 0.0743436750345493 },\n { x: 0.000004345000000000088, y: 0.04120694464393407 },\n { x: 0.000004346000000000088, y: 0.0661386635432381 },\n { x: 0.000004347000000000087, y: 0.041238553854118905 },\n { x: 0.000004348000000000087, y: 0.08401168205110598 },\n { x: 0.000004349000000000087, y: 0.09518777269379462 },\n { x: 0.000004350000000000086, y: 0.03566645403837755 },\n { x: 0.000004351000000000086, y: 0.08708444702519236 },\n { x: 0.0000043520000000000856, y: 0.047351433032996874 },\n { x: 0.000004353000000000085, y: 0.072312108750855 },\n { x: 0.000004354000000000085, y: 0.0972794303616991 },\n { x: 0.0000043550000000000845, y: 0.0347609201677046 },\n { x: 0.000004356000000000084, y: 0.027262985254025988 },\n { x: 0.000004357000000000084, y: 0.059733524345797075 },\n { x: 0.0000043580000000000835, y: 0.047264559799169006 },\n { x: 0.000004359000000000083, y: 0.03022019743754538 },\n { x: 0.000004360000000000083, y: 0.01605317823616126 },\n { x: 0.000004361000000000082, y: 0.055019131309623784 },\n { x: 0.000004362000000000082, y: 0.010761492187868774 },\n { x: 0.000004363000000000082, y: 0.06875911256771178 },\n { x: 0.000004364000000000081, y: 0.0622167294663115 },\n { x: 0.000004365000000000081, y: 0.03251503985285033 },\n { x: 0.000004366000000000081, y: 0.033563627120785894 },\n { x: 0.00000436700000000008, y: 0.037507560203690615 },\n { x: 0.00000436800000000008, y: 0.037474655218908755 },\n { x: 0.00000436900000000008, y: 0.01212101586127362 },\n { x: 0.000004370000000000079, y: 0.026031174524743676 },\n { x: 0.000004371000000000079, y: 0.06785978070774584 },\n { x: 0.000004372000000000079, y: -0.0030962602358450275 },\n { x: 0.000004373000000000078, y: 0.018932267923982792 },\n { x: 0.000004374000000000078, y: 0.04047327416141266 },\n { x: 0.0000043750000000000775, y: 0.048638800424388964 },\n { x: 0.000004376000000000077, y: 0.03418495150735163 },\n { x: 0.000004377000000000077, y: 0.02001989673478126 },\n { x: 0.0000043780000000000765, y: 0.007396412578202536 },\n { x: 0.000004379000000000076, y: 0.01028909899249882 },\n { x: 0.000004380000000000076, y: 0.05349238032107542 },\n { x: 0.0000043810000000000755, y: 0.054775652144337356 },\n { x: 0.000004382000000000075, y: 0.03349337859889623 },\n { x: 0.000004383000000000075, y: 0.022682065116819156 },\n { x: 0.000004384000000000074, y: -0.011316022304403664 },\n { x: 0.000004385000000000074, y: -0.01203778014906668 },\n { x: 0.000004386000000000074, y: 0.050247477852514294 },\n { x: 0.000004387000000000073, y: 0.0038443772434490486 },\n { x: 0.000004388000000000073, y: 0.044145533677051416 },\n { x: 0.000004389000000000073, y: 0.034649366909434196 },\n { x: 0.000004390000000000072, y: 0.04071079001590427 },\n { x: 0.000004391000000000072, y: 0.03317864136001323 },\n { x: 0.000004392000000000072, y: 0.02369913733336782 },\n { x: 0.000004393000000000071, y: 0.0409301364946526 },\n { x: 0.000004394000000000071, y: -0.025188821428706733 },\n { x: 0.0000043950000000000706, y: -0.004541859021987236 },\n { x: 0.00000439600000000007, y: -0.012278767795145439 },\n { x: 0.00000439700000000007, y: 0.009391891558085189 },\n { x: 0.0000043980000000000695, y: 0.007733494959605235 },\n { x: 0.000004399000000000069, y: 0.030439099234344687 },\n { x: 0.000004400000000000069, y: -0.016409630491783025 },\n { x: 0.0000044010000000000685, y: -0.019735463352103057 },\n { x: 0.000004402000000000068, y: -0.03460968924691703 },\n { x: 0.000004403000000000068, y: -0.03311480687500664 },\n { x: 0.0000044040000000000674, y: -0.015895008749546375 },\n { x: 0.000004405000000000067, y: 0.0061986953282571755 },\n { x: 0.000004406000000000067, y: -0.016844282998778725 },\n { x: 0.000004407000000000066, y: -0.0058568939824834585 },\n { x: 0.000004408000000000066, y: -0.03286191330271045 },\n { x: 0.000004409000000000066, y: -0.01836579402368211 },\n { x: 0.000004410000000000065, y: -0.03131416038425245 },\n { x: 0.000004411000000000065, y: -0.001036086450301895 },\n { x: 0.000004412000000000065, y: -0.051189455301565254 },\n { x: 0.000004413000000000064, y: -0.02944416604923323 },\n { x: 0.000004414000000000064, y: 0.01225529509436378 },\n { x: 0.000004415000000000064, y: -0.03694284158795072 },\n { x: 0.000004416000000000063, y: -0.028714645427504643 },\n { x: 0.000004417000000000063, y: -0.05109888134136388 },\n { x: 0.0000044180000000000626, y: -0.02278802991887542 },\n { x: 0.000004419000000000062, y: -0.03367919185147912 },\n { x: 0.000004420000000000062, y: 0.008179044941779234 },\n { x: 0.0000044210000000000615, y: -0.02283378464263354 },\n { x: 0.000004422000000000061, y: -0.022276079790017285 },\n { x: 0.000004423000000000061, y: -0.017352653199888355 },\n { x: 0.0000044240000000000605, y: -0.044770630942360626 },\n { x: 0.00000442500000000006, y: -0.022507504505039053 },\n { x: 0.00000442600000000006, y: -0.018968508059095945 },\n { x: 0.0000044270000000000594, y: -0.0324474282081161 },\n { x: 0.000004428000000000059, y: -0.03251417949414384 },\n { x: 0.000004429000000000059, y: -0.014332986370471645 },\n { x: 0.000004430000000000058, y: -0.025656736963981727 },\n { x: 0.000004431000000000058, y: -0.019651160203069826 },\n { x: 0.000004432000000000058, y: -0.014305785701883542 },\n { x: 0.000004433000000000057, y: -0.029336859094932125 },\n { x: 0.000004434000000000057, y: -0.05754251335481238 },\n { x: 0.000004435000000000057, y: -0.08406083679038032 },\n { x: 0.000004436000000000056, y: -0.0307567442405767 },\n { x: 0.000004437000000000056, y: -0.02759736236731739 },\n { x: 0.000004438000000000056, y: -0.08644623578824348 },\n { x: 0.000004439000000000055, y: -0.029646572008271435 },\n { x: 0.000004440000000000055, y: -0.08465330229926016 },\n { x: 0.0000044410000000000546, y: -0.048453858029903166 },\n { x: 0.000004442000000000054, y: -0.04039365570506378 },\n { x: 0.000004443000000000054, y: -0.03742693381950518 },\n { x: 0.0000044440000000000535, y: -0.020941428163004705 },\n { x: 0.000004445000000000053, y: -0.025597328007457863 },\n { x: 0.000004446000000000053, y: -0.05303533194151276 },\n { x: 0.0000044470000000000525, y: -0.03254856063521485 },\n { x: 0.000004448000000000052, y: -0.08091527014204297 },\n { x: 0.000004449000000000052, y: -0.059300899444425764 },\n { x: 0.000004450000000000051, y: -0.09090816154832285 },\n { x: 0.000004451000000000051, y: -0.10243622184986592 },\n { x: 0.000004452000000000051, y: -0.07780068489824843 },\n { x: 0.00000445300000000005, y: -0.07401890904842322 },\n { x: 0.00000445400000000005, y: -0.06385031213668561 },\n { x: 0.00000445500000000005, y: -0.0369395715874065 },\n { x: 0.000004456000000000049, y: -0.04624052304633135 },\n { x: 0.000004457000000000049, y: -0.07255749052518846 },\n { x: 0.000004458000000000049, y: -0.09587591733351258 },\n { x: 0.000004459000000000048, y: -0.08052941459373546 },\n { x: 0.000004460000000000048, y: -0.07546375149805919 },\n { x: 0.000004461000000000048, y: -0.038815039776899124 },\n { x: 0.000004462000000000047, y: -0.05884039964048921 },\n { x: 0.000004463000000000047, y: -0.10873194096694953 },\n { x: 0.0000044640000000000465, y: -0.06653517288369924 },\n { x: 0.000004465000000000046, y: -0.04650819733504982 },\n { x: 0.000004466000000000046, y: -0.06370411554257338 },\n { x: 0.0000044670000000000455, y: -0.07114867401224918 },\n { x: 0.000004468000000000045, y: -0.10874427269709502 },\n { x: 0.000004469000000000045, y: -0.05374449297449803 },\n { x: 0.0000044700000000000444, y: -0.09305542976064944 },\n { x: 0.000004471000000000044, y: -0.06993422555250092 },\n { x: 0.000004472000000000044, y: -0.08076155086148841 },\n { x: 0.000004473000000000043, y: -0.09375752836267148 },\n { x: 0.000004474000000000043, y: -0.06834000106706759 },\n { x: 0.000004475000000000043, y: -0.1285089957266825 },\n { x: 0.000004476000000000042, y: -0.08309467570449197 },\n { x: 0.000004477000000000042, y: -0.09681139061585507 },\n { x: 0.000004478000000000042, y: -0.08823125514299994 },\n { x: 0.000004479000000000041, y: -0.12780694782131158 },\n { x: 0.000004480000000000041, y: -0.07207408574963284 },\n { x: 0.000004481000000000041, y: -0.06830748837620107 },\n { x: 0.00000448200000000004, y: -0.0968144565147273 },\n { x: 0.00000448300000000004, y: -0.12452567659502442 },\n { x: 0.0000044840000000000396, y: -0.12244716206611114 },\n { x: 0.000004485000000000039, y: -0.10738434715904249 },\n { x: 0.000004486000000000039, y: -0.09069820014577216 },\n { x: 0.0000044870000000000385, y: -0.11274927915774811 },\n { x: 0.000004488000000000038, y: -0.10232949816068293 },\n { x: 0.000004489000000000038, y: -0.12085948320795117 },\n { x: 0.0000044900000000000375, y: -0.07693655156307819 },\n { x: 0.000004491000000000037, y: -0.13058262018517797 },\n { x: 0.000004492000000000037, y: -0.1050188254544194 },\n { x: 0.0000044930000000000364, y: -0.13542757802306188 },\n { x: 0.000004494000000000036, y: -0.13837817846426426 },\n { x: 0.000004495000000000036, y: -0.11356779333513836 },\n { x: 0.000004496000000000035, y: -0.15166387392774347 },\n { x: 0.000004497000000000035, y: -0.13577402758702942 },\n { x: 0.000004498000000000035, y: -0.14971412722281802 },\n { x: 0.000004499000000000034, y: -0.11897512139382997 },\n { x: 0.000004500000000000034, y: -0.11438381277360571 },\n { x: 0.000004501000000000034, y: -0.10070877050182117 },\n { x: 0.000004502000000000033, y: -0.10313393024443825 },\n { x: 0.000004503000000000033, y: -0.0985986833828442 },\n { x: 0.000004504000000000033, y: -0.10908010587794445 },\n { x: 0.000004505000000000032, y: -0.10613995494427787 },\n { x: 0.000004506000000000032, y: -0.10423249553572772 },\n { x: 0.0000045070000000000316, y: -0.1445428829116194 },\n { x: 0.000004508000000000031, y: -0.14846339390964555 },\n { x: 0.000004509000000000031, y: -0.09449777275172647 },\n { x: 0.0000045100000000000305, y: -0.1363310372930019 },\n { x: 0.00000451100000000003, y: -0.10780279414382662 },\n { x: 0.00000451200000000003, y: -0.10910751225579243 },\n { x: 0.0000045130000000000295, y: -0.15703960710406548 },\n { x: 0.000004514000000000029, y: -0.15237303637262323 },\n { x: 0.000004515000000000029, y: -0.13473584982307496 },\n { x: 0.000004516000000000028, y: -0.09875269569754389 },\n { x: 0.000004517000000000028, y: -0.09720188691666903 },\n { x: 0.000004518000000000028, y: -0.15006556148600886 },\n { x: 0.000004519000000000027, y: -0.1637403076487485 },\n { x: 0.000004520000000000027, y: -0.11504520626707926 },\n { x: 0.000004521000000000027, y: -0.16907052176194426 },\n { x: 0.000004522000000000026, y: -0.15707043955824332 },\n { x: 0.000004523000000000026, y: -0.11438857955664553 },\n { x: 0.000004524000000000026, y: -0.10443228489684468 },\n { x: 0.000004525000000000025, y: -0.15301717606205142 },\n { x: 0.000004526000000000025, y: -0.1408374568352197 },\n { x: 0.000004527000000000025, y: -0.11364182694460714 },\n { x: 0.000004528000000000024, y: -0.16509687484639976 },\n { x: 0.000004529000000000024, y: -0.11664731843507468 },\n { x: 0.0000045300000000000235, y: -0.13325631614190875 },\n { x: 0.000004531000000000023, y: -0.16895237877956948 },\n { x: 0.000004532000000000023, y: -0.17402953067457072 },\n { x: 0.0000045330000000000225, y: -0.1221610627346329 },\n { x: 0.000004534000000000022, y: -0.14075575900096557 },\n { x: 0.000004535000000000022, y: -0.11848020408101743 },\n { x: 0.0000045360000000000215, y: -0.1626331498834029 },\n { x: 0.000004537000000000021, y: -0.1291854949657184 },\n { x: 0.000004538000000000021, y: -0.17777330718473172 },\n { x: 0.00000453900000000002, y: -0.12648682078306261 },\n { x: 0.00000454000000000002, y: -0.16799009736051887 },\n { x: 0.00000454100000000002, y: -0.18649243971035206 },\n { x: 0.000004542000000000019, y: -0.1452926594096877 },\n { x: 0.000004543000000000019, y: -0.12632963150907559 },\n { x: 0.000004544000000000019, y: -0.14697749845087704 },\n { x: 0.000004545000000000018, y: -0.15253945073256678 },\n { x: 0.000004546000000000018, y: -0.16174596626010296 },\n { x: 0.000004547000000000018, y: -0.18792141927022998 },\n { x: 0.000004548000000000017, y: -0.15894313009867014 },\n { x: 0.000004549000000000017, y: -0.1665554686897448 },\n { x: 0.0000045500000000000166, y: -0.18333842470620065 },\n { x: 0.000004551000000000016, y: -0.18062173140549392 },\n { x: 0.000004552000000000016, y: -0.1953886797669952 },\n { x: 0.0000045530000000000155, y: -0.1964706979880324 },\n { x: 0.000004554000000000015, y: -0.16410940154159423 },\n { x: 0.000004555000000000015, y: -0.1482845584397377 },\n { x: 0.0000045560000000000145, y: -0.16046417452063638 },\n { x: 0.000004557000000000014, y: -0.19651598819232566 },\n { x: 0.000004558000000000014, y: -0.17589509568281647 },\n { x: 0.0000045590000000000134, y: -0.15164882473045274 },\n { x: 0.000004560000000000013, y: -0.14512287764436593 },\n { x: 0.000004561000000000013, y: -0.18676563242323918 },\n { x: 0.000004562000000000012, y: -0.18518869067462282 },\n { x: 0.000004563000000000012, y: -0.17250923754915956 },\n { x: 0.000004564000000000012, y: -0.1395082836362115 },\n { x: 0.000004565000000000011, y: -0.21551477969500438 },\n { x: 0.000004566000000000011, y: -0.15539114064043152 },\n { x: 0.000004567000000000011, y: -0.18557382147657966 },\n { x: 0.00000456800000000001, y: -0.16905292639288855 },\n { x: 0.00000456900000000001, y: -0.2323753585489058 },\n { x: 0.00000457000000000001, y: -0.15187947286598966 },\n { x: 0.000004571000000000009, y: -0.19513860486063878 },\n { x: 0.000004572000000000009, y: -0.14680765200251045 },\n { x: 0.0000045730000000000086, y: -0.1980141313626623 },\n { x: 0.000004574000000000008, y: -0.19972792853837637 },\n { x: 0.000004575000000000008, y: -0.2111481012489808 },\n { x: 0.0000045760000000000075, y: -0.21355738586889983 },\n { x: 0.000004577000000000007, y: -0.18102591266987136 },\n { x: 0.000004578000000000007, y: -0.20279162099000217 },\n { x: 0.0000045790000000000065, y: -0.18119097518072985 },\n { x: 0.000004580000000000006, y: -0.17000991337520813 },\n { x: 0.000004581000000000006, y: -0.1877444849524141 },\n { x: 0.0000045820000000000054, y: -0.15078192279849487 },\n { x: 0.000004583000000000005, y: -0.18002672248676055 },\n { x: 0.000004584000000000005, y: -0.15579301444151777 },\n { x: 0.000004585000000000004, y: -0.15709872042946224 },\n { x: 0.000004586000000000004, y: -0.14797105333309435 },\n { x: 0.000004587000000000004, y: -0.14907209980362615 },\n { x: 0.000004588000000000003, y: -0.1934247074612179 },\n { x: 0.000004589000000000003, y: -0.15007375095781084 },\n { x: 0.000004590000000000003, y: -0.20310956350071013 },\n { x: 0.000004591000000000002, y: -0.19673176949531415 },\n { x: 0.000004592000000000002, y: -0.15163286033003617 },\n { x: 0.000004593000000000002, y: -0.1561802522971907 },\n { x: 0.000004594000000000001, y: -0.21395528418822773 },\n { x: 0.000004595000000000001, y: -0.2144855816654977 },\n { x: 0.0000045960000000000006, y: -0.1851080266112227 },\n { x: 0.000004597, y: -0.20247365152626745 },\n { x: 0.000004598, y: -0.21112623441505923 },\n { x: 0.0000045989999999999995, y: -0.22459620193688065 },\n { x: 0.000004599999999999999, y: -0.18210168888773165 },\n { x: 0.000004600999999999999, y: -0.17286465815291074 },\n { x: 0.0000046019999999999985, y: -0.22577343441620287 },\n { x: 0.000004602999999999998, y: -0.19717568268109364 },\n { x: 0.000004603999999999998, y: -0.1647798111734493 },\n { x: 0.000004604999999999997, y: -0.2164635751119212 },\n { x: 0.000004605999999999997, y: -0.22208002964527426 },\n { x: 0.000004606999999999997, y: -0.22498637363585147 },\n { x: 0.000004607999999999996, y: -0.16136838482311364 },\n { x: 0.000004608999999999996, y: -0.18583896600093686 },\n { x: 0.000004609999999999996, y: -0.17547696915370042 },\n { x: 0.000004610999999999995, y: -0.17414147240852423 },\n { x: 0.000004611999999999995, y: -0.1637033344171779 },\n { x: 0.000004612999999999995, y: -0.20882503887351947 },\n { x: 0.000004613999999999994, y: -0.16387044625871208 },\n { x: 0.000004614999999999994, y: -0.1767390963027569 },\n { x: 0.000004615999999999994, y: -0.17119321818196312 },\n { x: 0.000004616999999999993, y: -0.21778951451483697 },\n { x: 0.000004617999999999993, y: -0.16402760231019597 },\n { x: 0.0000046189999999999925, y: -0.17438522053867123 },\n { x: 0.000004619999999999992, y: -0.200777693154057 },\n { x: 0.000004620999999999992, y: -0.22384399734445595 },\n { x: 0.0000046219999999999915, y: -0.18013211740166474 },\n { x: 0.000004622999999999991, y: -0.21702822058223198 },\n { x: 0.000004623999999999991, y: -0.221172198782941 },\n { x: 0.0000046249999999999904, y: -0.16333724254332704 },\n { x: 0.00000462599999999999, y: -0.19843099871416528 },\n { x: 0.00000462699999999999, y: -0.1842630535717723 },\n { x: 0.000004627999999999989, y: -0.2290070355901267 },\n { x: 0.000004628999999999989, y: -0.18892340796949067 },\n { x: 0.000004629999999999989, y: -0.2205316139629703 },\n { x: 0.000004630999999999988, y: -0.16710989517499117 },\n { x: 0.000004631999999999988, y: -0.19354970564096444 },\n { x: 0.000004632999999999988, y: -0.22046644715953334 },\n { x: 0.000004633999999999987, y: -0.20847319729145103 },\n { x: 0.000004634999999999987, y: -0.22115178264139743 },\n { x: 0.000004635999999999987, y: -0.23268680301232533 },\n { x: 0.000004636999999999986, y: -0.20811882544137172 },\n { x: 0.000004637999999999986, y: -0.23868111993396282 },\n { x: 0.0000046389999999999856, y: -0.1673710000387146 },\n { x: 0.000004639999999999985, y: -0.2059528755471276 },\n { x: 0.000004640999999999985, y: -0.19556014818492704 },\n { x: 0.0000046419999999999845, y: -0.20508858887643108 },\n { x: 0.000004642999999999984, y: -0.22862183103952904 },\n { x: 0.000004643999999999984, y: -0.18706619515119602 },\n { x: 0.0000046449999999999835, y: -0.20740226391163477 },\n { x: 0.000004645999999999983, y: -0.1835127727831929 },\n { x: 0.000004646999999999983, y: -0.21143964240091664 },\n { x: 0.0000046479999999999824, y: -0.23477790143332308 },\n { x: 0.000004648999999999982, y: -0.22851793807307808 },\n { x: 0.000004649999999999982, y: -0.2403823801924146 },\n { x: 0.000004650999999999981, y: -0.23267371224096148 },\n { x: 0.000004651999999999981, y: -0.24611090533177807 },\n { x: 0.000004652999999999981, y: -0.1858570390336904 },\n { x: 0.00000465399999999998, y: -0.19782970503826008 },\n { x: 0.00000465499999999998, y: -0.22587134150097352 },\n { x: 0.00000465599999999998, y: -0.18734416432482515 },\n { x: 0.000004656999999999979, y: -0.21838763635137723 },\n { x: 0.000004657999999999979, y: -0.1879952080639552 },\n { x: 0.000004658999999999979, y: -0.2396310490028291 },\n { x: 0.000004659999999999978, y: -0.22948122746832111 },\n { x: 0.000004660999999999978, y: -0.20587330716192684 },\n { x: 0.0000046619999999999776, y: -0.21499404676994655 },\n { x: 0.000004662999999999977, y: -0.2080860676222294 },\n { x: 0.000004663999999999977, y: -0.2066396966894304 },\n { x: 0.0000046649999999999765, y: -0.24398954532706382 },\n { x: 0.000004665999999999976, y: -0.2310961811036109 },\n { x: 0.000004666999999999976, y: -0.23651052503834863 },\n { x: 0.0000046679999999999755, y: -0.20107088150603003 },\n { x: 0.000004668999999999975, y: -0.2369518882361267 },\n { x: 0.000004669999999999975, y: -0.23914953145120238 },\n { x: 0.000004670999999999974, y: -0.20499357578621288 },\n { x: 0.000004671999999999974, y: -0.1822571024099909 },\n { x: 0.000004672999999999974, y: -0.23349726025447215 },\n { x: 0.000004673999999999973, y: -0.20680393168703023 },\n { x: 0.000004674999999999973, y: -0.18006358772007572 },\n { x: 0.000004675999999999973, y: -0.21775347986046428 },\n { x: 0.000004676999999999972, y: -0.2419322174551658 },\n { x: 0.000004677999999999972, y: -0.22645496834861117 },\n { x: 0.000004678999999999972, y: -0.18460841843998288 },\n { x: 0.000004679999999999971, y: -0.26928893721141506 },\n { x: 0.000004680999999999971, y: -0.1794197074711376 },\n { x: 0.000004681999999999971, y: -0.22478064423537422 },\n { x: 0.00000468299999999997, y: -0.17945713475187688 },\n { x: 0.00000468399999999997, y: -0.19387013040186674 },\n { x: 0.0000046849999999999695, y: -0.20228076460182445 },\n { x: 0.000004685999999999969, y: -0.20961354350838923 },\n { x: 0.000004686999999999969, y: -0.21570033754098786 },\n { x: 0.0000046879999999999685, y: -0.22527750784728526 },\n { x: 0.000004688999999999968, y: -0.1911870794089433 },\n { x: 0.000004689999999999968, y: -0.1768447145920783 },\n { x: 0.0000046909999999999675, y: -0.17374811880973273 },\n { x: 0.000004691999999999967, y: -0.18461715037149246 },\n { x: 0.000004692999999999967, y: -0.2164497723622435 },\n { x: 0.000004693999999999966, y: -0.21943115770511634 },\n { x: 0.000004694999999999966, y: -0.180450867294585 },\n { x: 0.000004695999999999966, y: -0.20296065473416458 },\n { x: 0.000004696999999999965, y: -0.24359773798155251 },\n { x: 0.000004697999999999965, y: -0.21363392139837156 },\n { x: 0.000004698999999999965, y: -0.22932791900878563 },\n { x: 0.000004699999999999964, y: -0.21950931367695548 },\n { x: 0.000004700999999999964, y: -0.19702472638362833 },\n { x: 0.000004701999999999964, y: -0.1907882526388136 },\n { x: 0.000004702999999999963, y: -0.23554754530174113 },\n { x: 0.000004703999999999963, y: -0.19614586001424192 },\n { x: 0.0000047049999999999626, y: -0.17548260610891864 },\n { x: 0.000004705999999999962, y: -0.1802931095853181 },\n { x: 0.000004706999999999962, y: -0.18937788191912272 },\n { x: 0.0000047079999999999615, y: -0.20506696768389945 },\n { x: 0.000004708999999999961, y: -0.24077472450497855 },\n { x: 0.000004709999999999961, y: -0.23327681340461123 },\n { x: 0.0000047109999999999605, y: -0.19855179013416105 },\n { x: 0.00000471199999999996, y: -0.24504745793025579 },\n { x: 0.00000471299999999996, y: -0.1835805058338445 },\n { x: 0.0000047139999999999594, y: -0.17117419304776266 },\n { x: 0.000004714999999999959, y: -0.1944161580900013 },\n { x: 0.000004715999999999959, y: -0.17735435602176175 },\n { x: 0.000004716999999999958, y: -0.18980986968004357 },\n { x: 0.000004717999999999958, y: -0.17675672693910716 },\n { x: 0.000004718999999999958, y: -0.20406303252394384 },\n { x: 0.000004719999999999957, y: -0.17417277517686236 },\n { x: 0.000004720999999999957, y: -0.2085135018484537 },\n { x: 0.000004721999999999957, y: -0.22291815943630947 },\n { x: 0.000004722999999999956, y: -0.20765851447295466 },\n { x: 0.000004723999999999956, y: -0.20852432996812229 },\n { x: 0.000004724999999999956, y: -0.223654229452862 },\n { x: 0.000004725999999999955, y: -0.20751794985974192 },\n { x: 0.000004726999999999955, y: -0.23001064273035512 },\n { x: 0.0000047279999999999546, y: -0.20836107867048778 },\n { x: 0.000004728999999999954, y: -0.22024976524380394 },\n { x: 0.000004729999999999954, y: -0.19775958172770985 },\n { x: 0.0000047309999999999535, y: -0.20213102539409397 },\n { x: 0.000004731999999999953, y: -0.22564439579340576 },\n { x: 0.000004732999999999953, y: -0.17679705902984255 },\n { x: 0.0000047339999999999525, y: -0.225663681406971 },\n { x: 0.000004734999999999952, y: -0.18660493624890417 },\n { x: 0.000004735999999999952, y: -0.2018646182903631 },\n { x: 0.0000047369999999999514, y: -0.1758034871227055 },\n { x: 0.000004737999999999951, y: -0.20945421851556756 },\n { x: 0.000004738999999999951, y: -0.20407375648706966 },\n { x: 0.00000473999999999995, y: -0.19335211797354876 },\n { x: 0.00000474099999999995, y: -0.22733940136735512 },\n { x: 0.00000474199999999995, y: -0.21494492051230604 },\n { x: 0.000004742999999999949, y: -0.19450113480447492 },\n { x: 0.000004743999999999949, y: -0.1684962871531534 },\n { x: 0.000004744999999999949, y: -0.236358974586646 },\n { x: 0.000004745999999999948, y: -0.18306612897940924 },\n { x: 0.000004746999999999948, y: -0.18950608498279017 },\n { x: 0.000004747999999999948, y: -0.1983439086129326 },\n { x: 0.000004748999999999947, y: -0.22521746323344227 },\n { x: 0.000004749999999999947, y: -0.20931594003229548 },\n { x: 0.0000047509999999999466, y: -0.1947776702431402 },\n { x: 0.000004751999999999946, y: -0.18490488125778162 },\n { x: 0.000004752999999999946, y: -0.22422052957169566 },\n { x: 0.0000047539999999999455, y: -0.1608664960899408 },\n { x: 0.000004754999999999945, y: -0.21314072406737158 },\n { x: 0.000004755999999999945, y: -0.22613514875516533 },\n { x: 0.0000047569999999999445, y: -0.23520427973873745 },\n { x: 0.000004757999999999944, y: -0.1959171346942928 },\n { x: 0.000004758999999999944, y: -0.167921570526336 },\n { x: 0.000004759999999999943, y: -0.21440884565974416 },\n { x: 0.000004760999999999943, y: -0.234280184017242 },\n { x: 0.000004761999999999943, y: -0.1718703321438136 },\n { x: 0.000004762999999999942, y: -0.2062218670619978 },\n { x: 0.000004763999999999942, y: -0.16177007301569504 },\n { x: 0.000004764999999999942, y: -0.2135067355583641 },\n { x: 0.000004765999999999941, y: -0.169713522487619 },\n { x: 0.000004766999999999941, y: -0.19690944541320163 },\n { x: 0.000004767999999999941, y: -0.21542435517989045 },\n { x: 0.00000476899999999994, y: -0.1599090038092127 },\n { x: 0.00000476999999999994, y: -0.18592641214348676 },\n { x: 0.00000477099999999994, y: -0.19662946753571472 },\n { x: 0.000004771999999999939, y: -0.21706635068426916 },\n { x: 0.000004772999999999939, y: -0.17526513643017064 },\n { x: 0.0000047739999999999385, y: -0.20654252549275207 },\n { x: 0.000004774999999999938, y: -0.1631517890367496 },\n { x: 0.000004775999999999938, y: -0.18673698392866397 },\n { x: 0.0000047769999999999375, y: -0.21021363404971802 },\n { x: 0.000004777999999999937, y: -0.21194458824357887 },\n { x: 0.000004778999999999937, y: -0.15963453604460792 },\n { x: 0.0000047799999999999364, y: -0.20277961851973117 },\n { x: 0.000004780999999999936, y: -0.2177409813327441 },\n { x: 0.000004781999999999936, y: -0.2091624898361344 },\n { x: 0.000004782999999999935, y: -0.19590905863790503 },\n { x: 0.000004783999999999935, y: -0.21209886282568485 },\n { x: 0.000004784999999999935, y: -0.22398077592788382 },\n { x: 0.000004785999999999934, y: -0.2203009494501902 },\n { x: 0.000004786999999999934, y: -0.1630880818377324 },\n { x: 0.000004787999999999934, y: -0.1860963990344954 },\n { x: 0.000004788999999999933, y: -0.20794310211730432 },\n { x: 0.000004789999999999933, y: -0.18378025208725715 },\n { x: 0.000004790999999999933, y: -0.17168632724802244 },\n { x: 0.000004791999999999932, y: -0.1558240130518776 },\n { x: 0.000004792999999999932, y: -0.2021555152863579 },\n { x: 0.0000047939999999999316, y: -0.20037923804218785 },\n { x: 0.000004794999999999931, y: -0.19613939082325502 },\n { x: 0.000004795999999999931, y: -0.2007319025709042 },\n { x: 0.0000047969999999999305, y: -0.19254515569478217 },\n { x: 0.00000479799999999993, y: -0.15764900670703727 },\n { x: 0.00000479899999999993, y: -0.16360389398329964 },\n { x: 0.0000047999999999999295, y: -0.19755280863356103 },\n { x: 0.000004800999999999929, y: -0.17213308136425623 },\n { x: 0.000004801999999999929, y: -0.15437152411753743 },\n { x: 0.0000048029999999999284, y: -0.19333674317331187 },\n { x: 0.000004803999999999928, y: -0.2129181764092537 },\n { x: 0.000004804999999999928, y: -0.18031639032246033 },\n { x: 0.000004805999999999927, y: -0.20860942459824838 },\n { x: 0.000004806999999999927, y: -0.17275809913291298 },\n { x: 0.000004807999999999927, y: -0.2113950047144613 },\n { x: 0.000004808999999999926, y: -0.1608856623448324 },\n { x: 0.000004809999999999926, y: -0.14289272634682348 },\n { x: 0.000004810999999999926, y: -0.17513428747592577 },\n { x: 0.000004811999999999925, y: -0.17576132309826628 },\n { x: 0.000004812999999999925, y: -0.20417843271672595 },\n { x: 0.000004813999999999925, y: -0.17501485005419407 },\n { x: 0.000004814999999999924, y: -0.2052600968613352 },\n { x: 0.000004815999999999924, y: -0.1383286747987829 },\n { x: 0.0000048169999999999236, y: -0.18845085094256564 },\n { x: 0.000004817999999999923, y: -0.1373393353637439 },\n { x: 0.000004818999999999923, y: -0.16761729840929637 },\n { x: 0.0000048199999999999225, y: -0.1371386993414808 },\n { x: 0.000004820999999999922, y: -0.17279139552556755 },\n { x: 0.000004821999999999922, y: -0.15436613305972502 },\n { x: 0.0000048229999999999215, y: -0.19928640969627978 },\n { x: 0.000004823999999999921, y: -0.17465878045807076 },\n { x: 0.000004824999999999921, y: -0.17499037100610776 },\n { x: 0.00000482599999999992, y: -0.18164039251446504 },\n { x: 0.00000482699999999992, y: -0.13809857517430163 },\n { x: 0.00000482799999999992, y: -0.19429476716545158 },\n { x: 0.000004828999999999919, y: -0.1538921953207057 },\n { x: 0.000004829999999999919, y: -0.17969911866035268 },\n { x: 0.000004830999999999919, y: -0.1729346234592151 },\n { x: 0.000004831999999999918, y: -0.1718842123427915 },\n { x: 0.000004832999999999918, y: -0.1664882176643573 },\n { x: 0.000004833999999999918, y: -0.18032920382351608 },\n { x: 0.000004834999999999917, y: -0.13780590747723948 },\n { x: 0.000004835999999999917, y: -0.15876079047465555 },\n { x: 0.000004836999999999917, y: -0.14120914648537494 },\n { x: 0.000004837999999999916, y: -0.1866227488934059 },\n { x: 0.000004838999999999916, y: -0.13176445360945166 },\n { x: 0.0000048399999999999155, y: -0.13416564037519066 },\n { x: 0.000004840999999999915, y: -0.14228552841507416 },\n { x: 0.000004841999999999915, y: -0.1574909816944331 },\n { x: 0.0000048429999999999145, y: -0.16205850619713613 },\n { x: 0.000004843999999999914, y: -0.15734418167669875 },\n { x: 0.000004844999999999914, y: -0.13535032864746668 },\n { x: 0.0000048459999999999135, y: -0.12931383706578467 },\n { x: 0.000004846999999999913, y: -0.17880634298436224 },\n { x: 0.000004847999999999913, y: -0.1496302361993294 },\n { x: 0.000004848999999999912, y: -0.13470167311909 },\n { x: 0.000004849999999999912, y: -0.11791902244194963 },\n { x: 0.000004850999999999912, y: -0.18069602286468192 },\n { x: 0.000004851999999999911, y: -0.13547852979310568 },\n { x: 0.000004852999999999911, y: -0.12489085559400731 },\n { x: 0.000004853999999999911, y: -0.12499704030930918 },\n { x: 0.00000485499999999991, y: -0.1720018234815587 },\n { x: 0.00000485599999999991, y: -0.15898138102059034 },\n { x: 0.00000485699999999991, y: -0.1259648214094295 },\n { x: 0.000004857999999999909, y: -0.15422702406169095 },\n { x: 0.000004858999999999909, y: -0.10400333640924503 },\n { x: 0.0000048599999999999086, y: -0.12772808744237163 },\n { x: 0.000004860999999999908, y: -0.17568347478216106 },\n { x: 0.000004861999999999908, y: -0.17012655821641406 },\n { x: 0.0000048629999999999075, y: -0.13248576605255455 },\n { x: 0.000004863999999999907, y: -0.10925693933163909 },\n { x: 0.000004864999999999907, y: -0.11174649933581503 },\n { x: 0.0000048659999999999065, y: -0.15217719429194307 },\n { x: 0.000004866999999999906, y: -0.16529526455950397 },\n { x: 0.000004867999999999906, y: -0.09660573875066847 },\n { x: 0.0000048689999999999054, y: -0.10993291735667422 },\n { x: 0.000004869999999999905, y: -0.09386597403459415 },\n { x: 0.000004870999999999905, y: -0.16129354479120137 },\n { x: 0.000004871999999999904, y: -0.11500147446626671 },\n { x: 0.000004872999999999904, y: -0.11984118171268719 },\n { x: 0.000004873999999999904, y: -0.1345035660099142 },\n { x: 0.000004874999999999903, y: -0.14618719086080473 },\n { x: 0.000004875999999999903, y: -0.11485445424300733 },\n { x: 0.000004876999999999903, y: -0.13436265039834844 },\n { x: 0.000004877999999999902, y: -0.10618028167215987 },\n { x: 0.000004878999999999902, y: -0.15522193103563675 },\n { x: 0.000004879999999999902, y: -0.11603179425186169 },\n { x: 0.000004880999999999901, y: -0.11267148543518876 },\n { x: 0.000004881999999999901, y: -0.14425013561411573 },\n { x: 0.0000048829999999999006, y: -0.1045795343885543 },\n { x: 0.0000048839999999999, y: -0.15728150147030912 },\n { x: 0.0000048849999999999, y: -0.12899113866698708 },\n { x: 0.0000048859999999998995, y: -0.09190574762271779 },\n { x: 0.000004886999999999899, y: -0.1455477249183041 },\n { x: 0.000004887999999999899, y: -0.13988385515254445 },\n { x: 0.0000048889999999998985, y: -0.10692291123069793 },\n { x: 0.000004889999999999898, y: -0.10306987442992198 },\n { x: 0.000004890999999999898, y: -0.11014813447393539 },\n { x: 0.0000048919999999998974, y: -0.08419457003218711 },\n { x: 0.000004892999999999897, y: -0.08379018179709047 },\n { x: 0.000004893999999999897, y: -0.1480267092320591 },\n { x: 0.000004894999999999896, y: -0.13538789770744894 },\n { x: 0.000004895999999999896, y: -0.10247299914430266 },\n { x: 0.000004896999999999896, y: -0.12559969438187232 },\n { x: 0.000004897999999999895, y: -0.08112656075683236 },\n { x: 0.000004898999999999895, y: -0.0997460859233642 },\n { x: 0.000004899999999999895, y: -0.10568721892816163 },\n { x: 0.000004900999999999894, y: -0.07086962161944485 },\n { x: 0.000004901999999999894, y: -0.1284422510140238 },\n { x: 0.000004902999999999894, y: -0.0801746347593161 },\n { x: 0.000004903999999999893, y: -0.14140496011063863 },\n { x: 0.000004904999999999893, y: -0.11131818949341507 },\n { x: 0.0000049059999999998925, y: -0.0973840599783958 },\n { x: 0.000004906999999999892, y: -0.07924227894688163 },\n { x: 0.000004907999999999892, y: -0.12190320380817203 },\n { x: 0.0000049089999999998915, y: -0.09621358489492539 },\n { x: 0.000004909999999999891, y: -0.13075900329111637 },\n { x: 0.000004910999999999891, y: -0.0661101365828696 },\n { x: 0.0000049119999999998905, y: -0.06534845898617356 },\n { x: 0.00000491299999999989, y: -0.09597344025805908 },\n { x: 0.00000491399999999989, y: -0.11872206641726424 },\n { x: 0.000004914999999999889, y: -0.08853031896239191 },\n { x: 0.000004915999999999889, y: -0.06622650754929141 },\n { x: 0.000004916999999999889, y: -0.10309024203862566 },\n { x: 0.000004917999999999888, y: -0.11661611934116448 },\n { x: 0.000004918999999999888, y: -0.05809835228344837 },\n { x: 0.000004919999999999888, y: -0.08655220835499981 },\n { x: 0.000004920999999999887, y: -0.07284919197385525 },\n { x: 0.000004921999999999887, y: -0.057951825795007884 },\n { x: 0.000004922999999999887, y: -0.12157613857581677 },\n { x: 0.000004923999999999886, y: -0.08157155191142763 },\n { x: 0.000004924999999999886, y: -0.059756634727099286 },\n { x: 0.000004925999999999886, y: -0.07213889817804878 },\n { x: 0.000004926999999999885, y: -0.09537269523287686 },\n { x: 0.000004927999999999885, y: -0.11695585184370687 },\n { x: 0.0000049289999999998845, y: -0.12243418539396558 },\n { x: 0.000004929999999999884, y: -0.07713282648976831 },\n { x: 0.000004930999999999884, y: -0.0775727622336692 },\n { x: 0.0000049319999999998835, y: -0.10458387395625092 },\n { x: 0.000004932999999999883, y: -0.08850108896150437 },\n { x: 0.000004933999999999883, y: -0.08423858424803811 },\n { x: 0.0000049349999999998824, y: -0.07445731673555146 },\n { x: 0.000004935999999999882, y: -0.10902936703826094 },\n { x: 0.000004936999999999882, y: -0.06289646778316262 },\n { x: 0.000004937999999999881, y: -0.10821073356373208 },\n { x: 0.000004938999999999881, y: -0.059026477771728675 },\n { x: 0.000004939999999999881, y: -0.09350577582955295 },\n { x: 0.00000494099999999988, y: -0.04173094732713335 },\n { x: 0.00000494199999999988, y: -0.057802373558431354 },\n { x: 0.00000494299999999988, y: -0.03587117309250226 },\n { x: 0.000004943999999999879, y: -0.07829126272716458 },\n { x: 0.000004944999999999879, y: -0.05806479699544798 },\n { x: 0.000004945999999999879, y: -0.055031783109273015 },\n { x: 0.000004946999999999878, y: -0.055795889887519504 },\n { x: 0.000004947999999999878, y: -0.044843089098240946 },\n { x: 0.0000049489999999998776, y: -0.08128360222463271 },\n { x: 0.000004949999999999877, y: -0.033838124279734254 },\n { x: 0.000004950999999999877, y: -0.09576571956912901 },\n { x: 0.0000049519999999998765, y: -0.07044183338199075 },\n { x: 0.000004952999999999876, y: -0.06775003848283538 },\n { x: 0.000004953999999999876, y: -0.08341586804696717 },\n { x: 0.0000049549999999998755, y: -0.026914812352326976 },\n { x: 0.000004955999999999875, y: -0.09911820284206022 },\n { x: 0.000004956999999999875, y: -0.09790415695470989 },\n { x: 0.0000049579999999998744, y: -0.05259349495470582 },\n { x: 0.000004958999999999874, y: -0.045609478376297787 },\n { x: 0.000004959999999999874, y: -0.06785905626139048 },\n { x: 0.000004960999999999873, y: -0.03306905282289534 },\n { x: 0.000004961999999999873, y: -0.02438447707205612 },\n { x: 0.000004962999999999873, y: -0.07199766573081698 },\n { x: 0.000004963999999999872, y: -0.05642485857993181 },\n { x: 0.000004964999999999872, y: -0.03507293642961979 },\n { x: 0.000004965999999999872, y: -0.06892039980153758 },\n { x: 0.000004966999999999871, y: -0.024371528997631384 },\n { x: 0.000004967999999999871, y: -0.057781144891837694 },\n { x: 0.000004968999999999871, y: -0.08445755391245774 },\n { x: 0.00000496999999999987, y: -0.019984754276259096 },\n { x: 0.00000497099999999987, y: -0.04489547533977136 },\n { x: 0.0000049719999999998696, y: -0.022923472714198832 },\n { x: 0.000004972999999999869, y: -0.07022689817687824 },\n { x: 0.000004973999999999869, y: -0.03571407560884077 },\n { x: 0.0000049749999999998685, y: -0.0321685900551716 },\n { x: 0.000004975999999999868, y: -0.028171186581429565 },\n { x: 0.000004976999999999868, y: -0.013141562968891747 },\n { x: 0.0000049779999999998675, y: -0.062217136700027154 },\n { x: 0.000004978999999999867, y: -0.008048890685904801 },\n { x: 0.000004979999999999867, y: -0.002861427427264314 },\n { x: 0.000004980999999999866, y: -0.07080151530840517 },\n { x: 0.000004981999999999866, y: -0.03232752906718989 },\n { x: 0.000004982999999999866, y: -0.027368309128163994 },\n { x: 0.000004983999999999865, y: -0.01483745930429672 },\n { x: 0.000004984999999999865, y: -0.012576606817376813 },\n { x: 0.000004985999999999865, y: -0.0363257857555606 },\n { x: 0.000004986999999999864, y: -0.01608651514883019 },\n { x: 0.000004987999999999864, y: -0.023901584337729195 },\n { x: 0.000004988999999999864, y: -0.06457789657819268 },\n { x: 0.000004989999999999863, y: -0.0411856083797308 },\n { x: 0.000004990999999999863, y: -0.022244764833207593 },\n { x: 0.000004991999999999863, y: -0.04695856198742204 },\n { x: 0.000004992999999999862, y: -0.026737312939246756 },\n { x: 0.000004993999999999862, y: -0.06199909039201966 },\n { x: 0.0000049949999999998615, y: -0.0254147913806117 },\n { x: 0.000004995999999999861, y: -0.04992082129608859 },\n { x: 0.000004996999999999861, y: -0.007418809966423294 },\n { x: 0.0000049979999999998605, y: -0.013678467530334748 },\n { x: 0.00000499899999999986, y: 0.004664434960145333 },\n { x: 0.00000499999999999986, y: 0.009311795051603962 },\n { x: 0.0000050009999999998595, y: -0.0042486979619729415 },\n { x: 0.000005001999999999859, y: -0.051674127876879174 },\n { x: 0.000005002999999999859, y: -0.008037008929684985 },\n { x: 0.000005003999999999858, y: -0.045848084279527024 },\n { x: 0.000005004999999999858, y: -0.0040695178685149665 },\n { x: 0.000005005999999999858, y: -0.005058554328545373 },\n { x: 0.000005006999999999857, y: -0.00835813196174382 },\n { x: 0.000005007999999999857, y: 0.012973121889614858 },\n { x: 0.000005008999999999857, y: 0.008395654434501673 },\n { x: 0.000005009999999999856, y: -0.04505598739126347 },\n { x: 0.000005010999999999856, y: -0.01553069391300424 },\n { x: 0.000005011999999999856, y: 0.006486416147778404 },\n { x: 0.000005012999999999855, y: -0.0195859621508336 },\n { x: 0.000005013999999999855, y: -0.039070141786189956 },\n { x: 0.0000050149999999998546, y: -0.023233986360678506 },\n { x: 0.000005015999999999854, y: 0.025678075043770142 },\n { x: 0.000005016999999999854, y: -0.03625904254495807 },\n { x: 0.0000050179999999998535, y: -0.032912232555061996 },\n { x: 0.000005018999999999853, y: -0.0009306114694812165 },\n { x: 0.000005019999999999853, y: -0.03675606796006399 },\n { x: 0.0000050209999999998525, y: -0.015087048918444389 },\n { x: 0.000005021999999999852, y: -0.021756564405929997 },\n { x: 0.000005022999999999852, y: 0.013326902707929474 },\n { x: 0.0000050239999999998514, y: -0.032311009629343745 },\n { x: 0.000005024999999999851, y: 0.01603544225578032 },\n { x: 0.000005025999999999851, y: -0.005747291352763567 },\n { x: 0.00000502699999999985, y: -0.016044880607822252 },\n { x: 0.00000502799999999985, y: -0.004874847938711399 },\n { x: 0.00000502899999999985, y: 0.015385456467212281 },\n { x: 0.000005029999999999849, y: 0.018514538248983903 },\n { x: 0.000005030999999999849, y: 0.02204240242151138 },\n { x: 0.000005031999999999849, y: 0.02912149766978155 },\n { x: 0.000005032999999999848, y: -0.0021647747080949225 },\n { x: 0.000005033999999999848, y: -0.00922275387973373 },\n { x: 0.000005034999999999848, y: 0.019214525790300273 },\n { x: 0.000005035999999999847, y: 0.038716207912106795 },\n { x: 0.000005036999999999847, y: 0.04369819867637072 },\n { x: 0.0000050379999999998466, y: -0.015473393049577478 },\n { x: 0.000005038999999999846, y: -0.019639489969987364 },\n { x: 0.000005039999999999846, y: 0.016142906541799264 },\n { x: 0.0000050409999999998455, y: -0.00346702658855904 },\n { x: 0.000005041999999999845, y: -0.014906744019370094 },\n { x: 0.000005042999999999845, y: 0.028030675484268117 },\n { x: 0.0000050439999999998445, y: 0.022933229818272005 },\n { x: 0.000005044999999999844, y: 0.03712510844528114 },\n { x: 0.000005045999999999844, y: 0.04115848810097254 },\n { x: 0.0000050469999999998434, y: 0.020494427453857173 },\n { x: 0.000005047999999999843, y: 0.054987634059592866 },\n { x: 0.000005048999999999843, y: -0.010005854733778529 },\n { x: 0.000005049999999999842, y: 0.007476921469571943 },\n { x: 0.000005050999999999842, y: 0.023297925529036572 },\n { x: 0.000005051999999999842, y: 0.04229944762070528 },\n { x: 0.000005052999999999841, y: -0.009948903670665851 },\n { x: 0.000005053999999999841, y: 0.007362581972701886 },\n { x: 0.000005054999999999841, y: 0.025259254816365404 },\n { x: 0.00000505599999999984, y: 0.02872700592043828 },\n { x: 0.00000505699999999984, y: 0.03609191359160033 },\n { x: 0.00000505799999999984, y: 0.029689089836923387 },\n { x: 0.000005058999999999839, y: 0.048208114339134245 },\n { x: 0.000005059999999999839, y: -0.008523067423195096 },\n { x: 0.0000050609999999998385, y: 0.048292231733407985 },\n { x: 0.000005061999999999838, y: 0.002431737869759854 },\n { x: 0.000005062999999999838, y: 0.02578493936285812 },\n { x: 0.0000050639999999998375, y: 0.06295742467028229 },\n { x: 0.000005064999999999837, y: 0.019906756150100697 },\n { x: 0.000005065999999999837, y: 0.052329339908353985 },\n { x: 0.0000050669999999998365, y: 0.07018574749278718 },\n { x: 0.000005067999999999836, y: 0.05263194561358897 },\n { x: 0.000005068999999999836, y: 0.053751372227729126 },\n { x: 0.000005069999999999835, y: 0.05277372355378042 },\n { x: 0.000005070999999999835, y: -0.0002219276410308016 },\n { x: 0.000005071999999999835, y: 0.012348918293527935 },\n { x: 0.000005072999999999834, y: 0.055259019796436756 },\n { x: 0.000005073999999999834, y: 0.06982502704088461 },\n { x: 0.000005074999999999834, y: 0.07613673498357486 },\n { x: 0.000005075999999999833, y: 0.02511433251889668 },\n { x: 0.000005076999999999833, y: 0.11063027313847137 },\n { x: 0.000005077999999999833, y: 0.07912954983301018 },\n { x: 0.000005078999999999832, y: 0.07771869256285084 },\n { x: 0.000005079999999999832, y: 0.036960454964422275 },\n { x: 0.000005080999999999832, y: 0.022026614056307705 },\n { x: 0.000005081999999999831, y: 0.06237263594572377 },\n { x: 0.000005082999999999831, y: 0.02777925946243225 },\n { x: 0.0000050839999999998305, y: 0.07964742387587326 },\n { x: 0.00000508499999999983, y: 0.014329951413496952 },\n { x: 0.00000508599999999983, y: 0.07783588310753868 },\n { x: 0.0000050869999999998295, y: 0.0622488861102068 },\n { x: 0.000005087999999999829, y: 0.045847560820092524 },\n { x: 0.000005088999999999829, y: 0.049778621420333645 },\n { x: 0.0000050899999999998284, y: 0.05355947621525368 },\n { x: 0.000005090999999999828, y: 0.07272768779571191 },\n { x: 0.000005091999999999828, y: 0.10555320918314048 },\n { x: 0.000005092999999999827, y: 0.0396495904457734 },\n { x: 0.000005093999999999827, y: 0.05003553404294465 },\n { x: 0.000005094999999999827, y: 0.047482513835271814 },\n { x: 0.000005095999999999826, y: 0.0466818805349055 },\n { x: 0.000005096999999999826, y: 0.05326596096075535 },\n { x: 0.000005097999999999826, y: 0.035446163154809765 },\n { x: 0.000005098999999999825, y: 0.02244622940723117 },\n { x: 0.000005099999999999825, y: 0.05531826308652162 },\n { x: 0.000005100999999999825, y: 0.037851901604246035 },\n { x: 0.000005101999999999824, y: 0.049331343014018425 },\n { x: 0.000005102999999999824, y: 0.09101446333899887 },\n { x: 0.0000051039999999998236, y: 0.09256805489808356 },\n { x: 0.000005104999999999823, y: 0.09806519317081278 },\n { x: 0.000005105999999999823, y: 0.0953011379164305 },\n { x: 0.0000051069999999998225, y: 0.05021215131488828 },\n { x: 0.000005107999999999822, y: 0.037122411558486466 },\n { x: 0.000005108999999999822, y: 0.07902939931076589 },\n { x: 0.0000051099999999998215, y: 0.09278036520141489 },\n { x: 0.000005110999999999821, y: 0.062259643831213914 },\n { x: 0.000005111999999999821, y: 0.08367015628070588 },\n { x: 0.0000051129999999998204, y: 0.07860438084449084 },\n { x: 0.00000511399999999982, y: 0.07135860742942574 },\n { x: 0.00000511499999999982, y: 0.039912772898280505 },\n { x: 0.000005115999999999819, y: 0.04877454829061288 },\n { x: 0.000005116999999999819, y: 0.07421556396524108 },\n { x: 0.000005117999999999819, y: 0.03403832908981421 },\n { x: 0.000005118999999999818, y: 0.037741265749125265 },\n { x: 0.000005119999999999818, y: 0.08497000270784218 },\n { x: 0.000005120999999999818, y: 0.06425217798980108 },\n { x: 0.000005121999999999817, y: 0.08407762855217268 },\n { x: 0.000005122999999999817, y: 0.03830285420650548 },\n { x: 0.000005123999999999817, y: 0.10801594378923063 },\n { x: 0.000005124999999999816, y: 0.07121389919160076 },\n { x: 0.000005125999999999816, y: 0.10697880651994408 },\n { x: 0.0000051269999999998156, y: 0.06518250871833037 },\n { x: 0.000005127999999999815, y: 0.06821800145062135 },\n { x: 0.000005128999999999815, y: 0.07261921084406753 },\n { x: 0.0000051299999999998145, y: 0.1099127353514906 },\n { x: 0.000005130999999999814, y: 0.05450141146279909 },\n { x: 0.000005131999999999814, y: 0.10520229842147627 },\n { x: 0.0000051329999999998135, y: 0.06777034691543163 },\n { x: 0.000005133999999999813, y: 0.10100012174386644 },\n { x: 0.000005134999999999813, y: 0.10507665907788341 },\n { x: 0.000005135999999999812, y: 0.05907241101024166 },\n { x: 0.000005136999999999812, y: 0.054956879881917234 },\n { x: 0.000005137999999999812, y: 0.0447907242156061 },\n { x: 0.000005138999999999811, y: 0.05456812067749722 },\n { x: 0.000005139999999999811, y: 0.06751787756041984 },\n { x: 0.000005140999999999811, y: 0.0606144573829864 },\n { x: 0.00000514199999999981, y: 0.09934729933583249 },\n { x: 0.00000514299999999981, y: 0.09402765124604553 },\n { x: 0.00000514399999999981, y: 0.07142693325362795 },\n { x: 0.000005144999999999809, y: 0.05433269905475749 },\n { x: 0.000005145999999999809, y: 0.09994568651168137 },\n { x: 0.000005146999999999809, y: 0.09890187355606968 },\n { x: 0.000005147999999999808, y: 0.11053426922339005 },\n { x: 0.000005148999999999808, y: 0.11800045755706048 },\n { x: 0.0000051499999999998075, y: 0.11807685524827202 },\n { x: 0.000005150999999999807, y: 0.06190890114209674 },\n { x: 0.000005151999999999807, y: 0.08674793649090762 },\n { x: 0.0000051529999999998065, y: 0.08834077707493128 },\n { x: 0.000005153999999999806, y: 0.12769692412352746 },\n { x: 0.000005154999999999806, y: 0.05370333792602889 },\n { x: 0.0000051559999999998055, y: 0.06361218386584885 },\n { x: 0.000005156999999999805, y: 0.09323188369342292 },\n { x: 0.000005157999999999805, y: 0.10189292498201202 },\n { x: 0.000005158999999999804, y: 0.1180087498795736 },\n { x: 0.000005159999999999804, y: 0.10999203283057399 },\n { x: 0.000005160999999999804, y: 0.0961533828201746 },\n { x: 0.000005161999999999803, y: 0.0778847597962472 },\n { x: 0.000005162999999999803, y: 0.09366215169995812 },\n { x: 0.000005163999999999803, y: 0.10156957261407087 },\n { x: 0.000005164999999999802, y: 0.08295366338188746 },\n { x: 0.000005165999999999802, y: 0.08224057500477566 },\n { x: 0.000005166999999999802, y: 0.10195143055090067 },\n { x: 0.000005167999999999801, y: 0.11665842699452506 },\n { x: 0.000005168999999999801, y: 0.09348403415969798 },\n { x: 0.0000051699999999998006, y: 0.09957685242186154 },\n { x: 0.0000051709999999998, y: 0.12274585125747074 },\n { x: 0.0000051719999999998, y: 0.10559699566859558 },\n { x: 0.0000051729999999997995, y: 0.06466748724489677 },\n { x: 0.000005173999999999799, y: 0.096323486475568 },\n { x: 0.000005174999999999799, y: 0.11236101522706754 },\n { x: 0.0000051759999999997985, y: 0.09381732092918492 },\n { x: 0.000005176999999999798, y: 0.0872311744847586 },\n { x: 0.000005177999999999798, y: 0.0852245800808161 },\n { x: 0.0000051789999999997974, y: 0.08830962799138656 },\n { x: 0.000005179999999999797, y: 0.08460790771045605 },\n { x: 0.000005180999999999797, y: 0.12720540797328467 },\n { x: 0.000005181999999999796, y: 0.07699078547094725 },\n { x: 0.000005182999999999796, y: 0.09824306248149246 },\n { x: 0.000005183999999999796, y: 0.11076507818971758 },\n { x: 0.000005184999999999795, y: 0.11779833471534458 },\n { x: 0.000005185999999999795, y: 0.07683612056418618 },\n { x: 0.000005186999999999795, y: 0.14081570731652182 },\n { x: 0.000005187999999999794, y: 0.12298077350057046 },\n { x: 0.000005188999999999794, y: 0.12531931777997332 },\n { x: 0.000005189999999999794, y: 0.12664059706265998 },\n { x: 0.000005190999999999793, y: 0.07928187092681617 },\n { x: 0.000005191999999999793, y: 0.1142035308140135 },\n { x: 0.0000051929999999997926, y: 0.12577064151821116 },\n { x: 0.000005193999999999792, y: 0.11949188873286824 },\n { x: 0.000005194999999999792, y: 0.09101084306623014 },\n { x: 0.0000051959999999997915, y: 0.07500252478446773 },\n { x: 0.000005196999999999791, y: 0.14661125252193297 },\n { x: 0.000005197999999999791, y: 0.13250934140356968 },\n { x: 0.0000051989999999997905, y: 0.08932982512663858 },\n { x: 0.00000519999999999979, y: 0.08550548082835481 },\n { x: 0.00000520099999999979, y: 0.10394532841800222 },\n { x: 0.0000052019999999997894, y: 0.08265343108013151 },\n { x: 0.000005202999999999789, y: 0.14809193673165025 },\n { x: 0.000005203999999999789, y: 0.13463090787814644 },\n { x: 0.000005204999999999788, y: 0.1294325313271355 },\n { x: 0.000005205999999999788, y: 0.09282342066156792 },\n { x: 0.000005206999999999788, y: 0.1436312786928314 },\n { x: 0.000005207999999999787, y: 0.12566020468116226 },\n { x: 0.000005208999999999787, y: 0.09078305845011876 },\n { x: 0.000005209999999999787, y: 0.13795540585649466 },\n { x: 0.000005210999999999786, y: 0.11733663514416333 },\n { x: 0.000005211999999999786, y: 0.09477740060529853 },\n { x: 0.000005212999999999786, y: 0.10041928771568914 },\n { x: 0.000005213999999999785, y: 0.10238393002534794 },\n { x: 0.000005214999999999785, y: 0.1567992318032028 },\n { x: 0.0000052159999999997845, y: 0.09563800486141057 },\n { x: 0.000005216999999999784, y: 0.08979321892744155 },\n { x: 0.000005217999999999784, y: 0.10973426506834066 },\n { x: 0.0000052189999999997835, y: 0.09223711840687873 },\n { x: 0.000005219999999999783, y: 0.1383544362026468 },\n { x: 0.000005220999999999783, y: 0.0999367725571895 },\n { x: 0.0000052219999999997825, y: 0.08446118492175768 },\n { x: 0.000005222999999999782, y: 0.12950412885256435 },\n { x: 0.000005223999999999782, y: 0.13628042682666983 },\n { x: 0.000005224999999999781, y: 0.08984945006414219 },\n { x: 0.000005225999999999781, y: 0.12237407006093978 },\n { x: 0.000005226999999999781, y: 0.08705699683887953 },\n { x: 0.00000522799999999978, y: 0.14547049589356686 },\n { x: 0.00000522899999999978, y: 0.0926629971955555 },\n { x: 0.00000522999999999978, y: 0.1608524254356898 },\n { x: 0.000005230999999999779, y: 0.12057652608288888 },\n { x: 0.000005231999999999779, y: 0.1416197905690594 },\n { x: 0.000005232999999999779, y: 0.09425682403721321 },\n { x: 0.000005233999999999778, y: 0.12141028769661823 },\n { x: 0.000005234999999999778, y: 0.15674823006218022 },\n { x: 0.000005235999999999778, y: 0.10646827407257134 },\n { x: 0.000005236999999999777, y: 0.12312708332119715 },\n { x: 0.000005237999999999777, y: 0.15120748448339894 },\n { x: 0.0000052389999999997765, y: 0.1644637004857692 },\n { x: 0.000005239999999999776, y: 0.13616017090446259 },\n { x: 0.000005240999999999776, y: 0.08974333734783863 },\n { x: 0.0000052419999999997755, y: 0.13107861329550907 },\n { x: 0.000005242999999999775, y: 0.09954767582217837 },\n { x: 0.000005243999999999775, y: 0.10953637992858052 },\n { x: 0.0000052449999999997744, y: 0.1414436435196851 },\n { x: 0.000005245999999999774, y: 0.11227329274863637 },\n { x: 0.000005246999999999774, y: 0.11773410457143 },\n { x: 0.000005247999999999773, y: 0.15775831798311404 },\n { x: 0.000005248999999999773, y: 0.09789213963863787 },\n { x: 0.000005249999999999773, y: 0.11676484046797893 },\n { x: 0.000005250999999999772, y: 0.10752997327228947 },\n { x: 0.000005251999999999772, y: 0.16309847595793353 },\n { x: 0.000005252999999999772, y: 0.1630443093645651 },\n { x: 0.000005253999999999771, y: 0.0959319627294716 },\n { x: 0.000005254999999999771, y: 0.11123955579855684 },\n { x: 0.000005255999999999771, y: 0.10683682512436833 },\n { x: 0.00000525699999999977, y: 0.13364918958393462 },\n { x: 0.00000525799999999977, y: 0.1057202770649562 },\n { x: 0.0000052589999999997696, y: 0.16391526857269595 },\n { x: 0.000005259999999999769, y: 0.15132387134865277 },\n { x: 0.000005260999999999769, y: 0.10170581745186769 },\n { x: 0.0000052619999999997685, y: 0.16643863291159045 },\n { x: 0.000005262999999999768, y: 0.1523269152752978 },\n { x: 0.000005263999999999768, y: 0.144234692117693 },\n { x: 0.0000052649999999997675, y: 0.08577841574949399 },\n { x: 0.000005265999999999767, y: 0.11892147047739499 },\n { x: 0.000005266999999999767, y: 0.12928060886489726 },\n { x: 0.0000052679999999997664, y: 0.14937165655864268 },\n { x: 0.000005268999999999766, y: 0.1600167676500758 },\n { x: 0.000005269999999999766, y: 0.12871225950869453 },\n { x: 0.000005270999999999765, y: 0.1321906561045424 },\n { x: 0.000005271999999999765, y: 0.16898963919767346 },\n { x: 0.000005272999999999765, y: 0.131445532307316 },\n { x: 0.000005273999999999764, y: 0.15223705515626373 },\n { x: 0.000005274999999999764, y: 0.10790320222895054 },\n { x: 0.000005275999999999764, y: 0.11214039556320637 },\n { x: 0.000005276999999999763, y: 0.14246074497137903 },\n { x: 0.000005277999999999763, y: 0.1288952793329502 },\n { x: 0.000005278999999999763, y: 0.11777769206547747 },\n { x: 0.000005279999999999762, y: 0.1185705478638393 },\n { x: 0.000005280999999999762, y: 0.16324990457024166 },\n { x: 0.0000052819999999997616, y: 0.1284850086467003 },\n { x: 0.000005282999999999761, y: 0.15543384409896305 },\n { x: 0.000005283999999999761, y: 0.11667377515718845 },\n { x: 0.0000052849999999997605, y: 0.13819633467004835 },\n { x: 0.00000528599999999976, y: 0.16816922058498113 },\n { x: 0.00000528699999999976, y: 0.11995830091336396 },\n { x: 0.0000052879999999997595, y: 0.10046915427625075 },\n { x: 0.000005288999999999759, y: 0.14217244793871867 },\n { x: 0.000005289999999999759, y: 0.16132734685422329 },\n { x: 0.000005290999999999758, y: 0.16887812288169746 },\n { x: 0.000005291999999999758, y: 0.11009089377254884 },\n { x: 0.000005292999999999758, y: 0.11595234125549575 },\n { x: 0.000005293999999999757, y: 0.15149132757628947 },\n { x: 0.000005294999999999757, y: 0.16989575131555568 },\n { x: 0.000005295999999999757, y: 0.1625354258383166 },\n { x: 0.000005296999999999756, y: 0.15227099850588713 },\n { x: 0.000005297999999999756, y: 0.10509311612094015 },\n { x: 0.000005298999999999756, y: 0.12353427548624234 },\n { x: 0.000005299999999999755, y: 0.13078837280660183 },\n { x: 0.000005300999999999755, y: 0.1280444872415387 },\n { x: 0.000005301999999999755, y: 0.10782367468431045 },\n { x: 0.000005302999999999754, y: 0.12300660849589021 },\n { x: 0.000005303999999999754, y: 0.12908982577505598 },\n { x: 0.0000053049999999997535, y: 0.16140202178405594 },\n { x: 0.000005305999999999753, y: 0.15777984740606843 },\n { x: 0.000005306999999999753, y: 0.17267708073856453 },\n { x: 0.0000053079999999997525, y: 0.12490706715598224 },\n { x: 0.000005308999999999752, y: 0.1604334180602598 },\n { x: 0.000005309999999999752, y: 0.14285815722884326 },\n { x: 0.0000053109999999997515, y: 0.12200335426345624 },\n { x: 0.000005311999999999751, y: 0.15528506119201516 },\n { x: 0.000005312999999999751, y: 0.12754224754133314 },\n { x: 0.00000531399999999975, y: 0.10854723407895986 },\n { x: 0.00000531499999999975, y: 0.13366213873699712 },\n { x: 0.00000531599999999975, y: 0.17291845979493653 },\n { x: 0.000005316999999999749, y: 0.10068417457858662 },\n { x: 0.000005317999999999749, y: 0.13931601345063327 },\n { x: 0.000005318999999999749, y: 0.11885753067738289 },\n { x: 0.000005319999999999748, y: 0.14152297129376254 },\n { x: 0.000005320999999999748, y: 0.1390035550649748 },\n { x: 0.000005321999999999748, y: 0.12504787238686105 },\n { x: 0.000005322999999999747, y: 0.16800654448148356 },\n { x: 0.000005323999999999747, y: 0.1336848307471853 },\n { x: 0.0000053249999999997466, y: 0.1329362167103609 },\n { x: 0.000005325999999999746, y: 0.14959935355488965 },\n { x: 0.000005326999999999746, y: 0.1309823358227884 },\n { x: 0.0000053279999999997455, y: 0.14890399669832766 },\n { x: 0.000005328999999999745, y: 0.13931591585886574 },\n { x: 0.000005329999999999745, y: 0.12667323003314426 },\n { x: 0.0000053309999999997445, y: 0.16554651081163294 },\n { x: 0.000005331999999999744, y: 0.1228158902759412 },\n { x: 0.000005332999999999744, y: 0.1573353745347053 },\n { x: 0.0000053339999999997434, y: 0.14732694134898447 },\n { x: 0.000005334999999999743, y: 0.14722464524545348 },\n { x: 0.000005335999999999743, y: 0.132551089778336 },\n { x: 0.000005336999999999742, y: 0.11981915201683922 },\n { x: 0.000005337999999999742, y: 0.11502737237630124 },\n { x: 0.000005338999999999742, y: 0.11390644628838834 },\n { x: 0.000005339999999999741, y: 0.15029617009891494 },\n { x: 0.000005340999999999741, y: 0.10548946715547333 },\n { x: 0.000005341999999999741, y: 0.13125181185906323 },\n { x: 0.00000534299999999974, y: 0.13733037347654842 },\n { x: 0.00000534399999999974, y: 0.13632081490806414 },\n { x: 0.00000534499999999974, y: 0.11700233048215822 },\n { x: 0.000005345999999999739, y: 0.15845095039516613 },\n { x: 0.000005346999999999739, y: 0.15335683559624075 },\n { x: 0.0000053479999999997386, y: 0.11493704363302802 },\n { x: 0.000005348999999999738, y: 0.1200755419055259 },\n { x: 0.000005349999999999738, y: 0.1251580191187848 },\n { x: 0.0000053509999999997375, y: 0.1230749409138043 },\n { x: 0.000005351999999999737, y: 0.11267572101351167 },\n { x: 0.000005352999999999737, y: 0.14609902529764413 },\n { x: 0.0000053539999999997365, y: 0.16409555164042855 },\n { x: 0.000005354999999999736, y: 0.16276703083145905 },\n { x: 0.000005355999999999736, y: 0.13162786801023588 },\n { x: 0.0000053569999999997354, y: 0.10450561357274661 },\n { x: 0.000005357999999999735, y: 0.16553513598851666 },\n { x: 0.000005358999999999735, y: 0.10235390117643432 },\n { x: 0.000005359999999999734, y: 0.16209048111459723 },\n { x: 0.000005360999999999734, y: 0.16862441843359494 },\n { x: 0.000005361999999999734, y: 0.15212881400710798 },\n { x: 0.000005362999999999733, y: 0.12893007654174463 },\n { x: 0.000005363999999999733, y: 0.13710620889283834 },\n { x: 0.000005364999999999733, y: 0.12216603848555517 },\n { x: 0.000005365999999999732, y: 0.14632520370853394 },\n { x: 0.000005366999999999732, y: 0.1546330936481003 },\n { x: 0.000005367999999999732, y: 0.13394085445415557 },\n { x: 0.000005368999999999731, y: 0.138108734763494 },\n { x: 0.000005369999999999731, y: 0.15681650720550006 },\n { x: 0.0000053709999999997305, y: 0.1394369487048485 },\n { x: 0.00000537199999999973, y: 0.09401743257708534 },\n { x: 0.00000537299999999973, y: 0.11422996913513755 },\n { x: 0.0000053739999999997295, y: 0.1015719835220732 },\n { x: 0.000005374999999999729, y: 0.13110380584307701 },\n { x: 0.000005375999999999729, y: 0.11783129124724499 },\n { x: 0.0000053769999999997285, y: 0.10203519682512509 },\n { x: 0.000005377999999999728, y: 0.0929668638212877 },\n { x: 0.000005378999999999728, y: 0.1006503869331531 },\n { x: 0.000005379999999999727, y: 0.14003956385097696 },\n { x: 0.000005380999999999727, y: 0.12566651942322252 },\n { x: 0.000005381999999999727, y: 0.16167597927569366 },\n { x: 0.000005382999999999726, y: 0.11587901986128309 },\n { x: 0.000005383999999999726, y: 0.15308633004638245 },\n { x: 0.000005384999999999726, y: 0.15856571149951343 },\n { x: 0.000005385999999999725, y: 0.11640267818997072 },\n { x: 0.000005386999999999725, y: 0.10963525641924257 },\n { x: 0.000005387999999999725, y: 0.09209374064047149 },\n { x: 0.000005388999999999724, y: 0.1415295732870333 },\n { x: 0.000005389999999999724, y: 0.10348962855379744 },\n { x: 0.000005390999999999724, y: 0.11255458424431092 },\n { x: 0.000005391999999999723, y: 0.15125863442125664 },\n { x: 0.000005392999999999723, y: 0.0974588307797635 },\n { x: 0.0000053939999999997225, y: 0.09359648235308661 },\n { x: 0.000005394999999999722, y: 0.11585234303612196 },\n { x: 0.000005395999999999722, y: 0.14334520027327285 },\n { x: 0.0000053969999999997215, y: 0.08730660105962522 },\n { x: 0.000005397999999999721, y: 0.09863693779340087 },\n { x: 0.000005398999999999721, y: 0.15913000657876722 },\n { x: 0.0000053999999999997204, y: 0.13756414554198437 },\n { x: 0.00000540099999999972, y: 0.09190330787434925 },\n { x: 0.00000540199999999972, y: 0.13108100562070177 },\n { x: 0.000005402999999999719, y: 0.12918575693583803 },\n { x: 0.000005403999999999719, y: 0.12617537156062916 },\n { x: 0.000005404999999999719, y: 0.1017912581369502 },\n { x: 0.000005405999999999718, y: 0.11765448133746327 },\n { x: 0.000005406999999999718, y: 0.13722868988364098 },\n { x: 0.000005407999999999718, y: 0.11120701913238926 },\n { x: 0.000005408999999999717, y: 0.07343879851164165 },\n { x: 0.000005409999999999717, y: 0.1352632819032208 },\n { x: 0.000005410999999999717, y: 0.08615712346161436 },\n { x: 0.000005411999999999716, y: 0.09061657543357547 },\n { x: 0.000005412999999999716, y: 0.10981208571643157 },\n { x: 0.0000054139999999997156, y: 0.09662242236813093 },\n { x: 0.000005414999999999715, y: 0.1352690354363802 },\n { x: 0.000005415999999999715, y: 0.09475226864800422 },\n { x: 0.0000054169999999997145, y: 0.0843851667634265 },\n { x: 0.000005417999999999714, y: 0.08886526462162103 },\n { x: 0.000005418999999999714, y: 0.12593370731249556 },\n { x: 0.0000054199999999997135, y: 0.1154404917630164 },\n { x: 0.000005420999999999713, y: 0.10748714327052497 },\n { x: 0.000005421999999999713, y: 0.09826789061166473 },\n { x: 0.0000054229999999997124, y: 0.13243197812789337 },\n { x: 0.000005423999999999712, y: 0.11814990941010105 },\n { x: 0.000005424999999999712, y: 0.10081747739357788 },\n { x: 0.000005425999999999711, y: 0.0921304633078068 },\n { x: 0.000005426999999999711, y: 0.08429829978219537 },\n { x: 0.000005427999999999711, y: 0.10669593488345674 },\n { x: 0.00000542899999999971, y: 0.08126539295340826 },\n { x: 0.00000542999999999971, y: 0.1280866818509846 },\n { x: 0.00000543099999999971, y: 0.1445546759394884 },\n { x: 0.000005431999999999709, y: 0.1414285792084123 },\n { x: 0.000005432999999999709, y: 0.1487817595959146 },\n { x: 0.000005433999999999709, y: 0.14825583684509738 },\n { x: 0.000005434999999999708, y: 0.10253319449921218 },\n { x: 0.000005435999999999708, y: 0.07517634377990132 },\n { x: 0.0000054369999999997076, y: 0.09343018198121196 },\n { x: 0.000005437999999999707, y: 0.14149505474590812 },\n { x: 0.000005438999999999707, y: 0.084913455084379 },\n { x: 0.0000054399999999997065, y: 0.11655337887956041 },\n { x: 0.000005440999999999706, y: 0.1315359102066865 },\n { x: 0.000005441999999999706, y: 0.14767347369859823 },\n { x: 0.0000054429999999997055, y: 0.082852902969632 },\n { x: 0.000005443999999999705, y: 0.07763034091883919 },\n { x: 0.000005444999999999705, y: 0.07519047017381357 },\n { x: 0.000005445999999999704, y: 0.10172715344108735 },\n { x: 0.000005446999999999704, y: 0.11898238264206978 },\n { x: 0.000005447999999999704, y: 0.08104618852456878 },\n { x: 0.000005448999999999703, y: 0.1302423237744941 },\n { x: 0.000005449999999999703, y: 0.11469014377760103 },\n { x: 0.000005450999999999703, y: 0.07004288372217889 },\n { x: 0.000005451999999999702, y: 0.14064642775777175 },\n { x: 0.000005452999999999702, y: 0.07485629518793326 },\n { x: 0.000005453999999999702, y: 0.1219847506916892 },\n { x: 0.000005454999999999701, y: 0.07807155096097693 },\n { x: 0.000005455999999999701, y: 0.10913150200743243 },\n { x: 0.000005456999999999701, y: 0.10673544715659088 },\n { x: 0.0000054579999999997, y: 0.11319379158248652 },\n { x: 0.0000054589999999997, y: 0.1293661055296817 },\n { x: 0.0000054599999999996995, y: 0.07564375880617352 },\n { x: 0.000005460999999999699, y: 0.09027321639051988 },\n { x: 0.000005461999999999699, y: 0.10387155545145581 },\n { x: 0.0000054629999999996985, y: 0.07954102078560374 },\n { x: 0.000005463999999999698, y: 0.10972751703876166 },\n { x: 0.000005464999999999698, y: 0.09219984861759932 },\n { x: 0.0000054659999999996975, y: 0.09854804023783836 },\n { x: 0.000005466999999999697, y: 0.07124658585873461 },\n { x: 0.000005467999999999697, y: 0.06830371685456571 },\n { x: 0.000005468999999999696, y: 0.1369133168084155 },\n { x: 0.000005469999999999696, y: 0.07761826942570417 },\n { x: 0.000005470999999999696, y: 0.08034152478420419 },\n { x: 0.000005471999999999695, y: 0.08437573336744544 },\n { x: 0.000005472999999999695, y: 0.13135651077630772 },\n { x: 0.000005473999999999695, y: 0.09001838550561463 },\n { x: 0.000005474999999999694, y: 0.10677766081461751 },\n { x: 0.000005475999999999694, y: 0.07380807740035203 },\n { x: 0.000005476999999999694, y: 0.12372563835179937 },\n { x: 0.000005477999999999693, y: 0.08434731752520779 },\n { x: 0.000005478999999999693, y: 0.12587588840925418 },\n { x: 0.0000054799999999996926, y: 0.1074683973704793 },\n { x: 0.000005480999999999692, y: 0.06801528056201026 },\n { x: 0.000005481999999999692, y: 0.12672715650257943 },\n { x: 0.0000054829999999996915, y: 0.07310377947558591 },\n { x: 0.000005483999999999691, y: 0.05704263791615683 },\n { x: 0.000005484999999999691, y: 0.0631163031906266 },\n { x: 0.0000054859999999996905, y: 0.127068427125634 },\n { x: 0.00000548699999999969, y: 0.10203274516125756 },\n { x: 0.00000548799999999969, y: 0.059309624612488274 },\n { x: 0.0000054889999999996894, y: 0.07275322833986349 },\n { x: 0.000005489999999999689, y: 0.09503300020681342 },\n { x: 0.000005490999999999689, y: 0.11343001378955841 },\n { x: 0.000005491999999999688, y: 0.11225275799688385 },\n { x: 0.000005492999999999688, y: 0.063676451171572 },\n { x: 0.000005493999999999688, y: 0.07493999968701812 },\n { x: 0.000005494999999999687, y: 0.09918996901301305 },\n { x: 0.000005495999999999687, y: 0.07633026050388436 },\n { x: 0.000005496999999999687, y: 0.053333163642476096 },\n { x: 0.000005497999999999686, y: 0.053280321546190695 },\n { x: 0.000005498999999999686, y: 0.11285341423057613 },\n { x: 0.000005499999999999686, y: 0.06323041714921372 },\n { x: 0.000005500999999999685, y: 0.07440423236491583 },\n { x: 0.000005501999999999685, y: 0.0892919651506561 },\n { x: 0.0000055029999999996846, y: 0.05483343163015917 },\n { x: 0.000005503999999999684, y: 0.08410782446957867 },\n { x: 0.000005504999999999684, y: 0.10943517568053497 },\n { x: 0.0000055059999999996835, y: 0.11790158832996515 },\n { x: 0.000005506999999999683, y: 0.06307143069472027 },\n { x: 0.000005507999999999683, y: 0.06139198928380584 },\n { x: 0.0000055089999999996825, y: 0.07880998566688281 },\n { x: 0.000005509999999999682, y: 0.05058159528042694 },\n { x: 0.000005510999999999682, y: 0.07233097756068851 },\n { x: 0.0000055119999999996814, y: 0.0576457147826922 },\n { x: 0.000005512999999999681, y: 0.0947256572997292 },\n { x: 0.000005513999999999681, y: 0.10280467663785933 },\n { x: 0.00000551499999999968, y: 0.050185705511921495 },\n { x: 0.00000551599999999968, y: 0.041195568346063326 },\n { x: 0.00000551699999999968, y: 0.06719837973465684 },\n { x: 0.000005517999999999679, y: 0.058078278795918176 },\n { x: 0.000005518999999999679, y: 0.08752553898924971 },\n { x: 0.000005519999999999679, y: 0.03908095948881185 },\n { x: 0.000005520999999999678, y: 0.0943499604199508 },\n { x: 0.000005521999999999678, y: 0.1052602305788135 },\n { x: 0.000005522999999999678, y: 0.054572883805252555 },\n { x: 0.000005523999999999677, y: 0.0779295336836059 },\n { x: 0.000005524999999999677, y: 0.06976635062655791 },\n { x: 0.0000055259999999996765, y: 0.091519918453971 },\n { x: 0.000005526999999999676, y: 0.10498531267663636 },\n { x: 0.000005527999999999676, y: 0.06956006391119827 },\n { x: 0.0000055289999999996755, y: 0.06352765494242416 },\n { x: 0.000005529999999999675, y: 0.10674885393399733 },\n { x: 0.000005530999999999675, y: 0.03845315376013245 },\n { x: 0.0000055319999999996745, y: 0.09395258252490958 },\n { x: 0.000005532999999999674, y: 0.09165693931205204 },\n { x: 0.000005533999999999674, y: 0.10013351043621249 },\n { x: 0.000005534999999999673, y: 0.06275850535907337 },\n { x: 0.000005535999999999673, y: 0.030101662964757935 },\n { x: 0.000005536999999999673, y: 0.05505505969313184 },\n { x: 0.000005537999999999672, y: 0.08493268286995068 },\n { x: 0.000005538999999999672, y: 0.05678889916332152 },\n { x: 0.000005539999999999672, y: 0.08877059483344836 },\n { x: 0.000005540999999999671, y: 0.0289880266496682 },\n { x: 0.000005541999999999671, y: 0.08043649181792725 },\n { x: 0.000005542999999999671, y: 0.09120298042416897 },\n { x: 0.00000554399999999967, y: 0.0345720008563637 },\n { x: 0.00000554499999999967, y: 0.03572994787368253 },\n { x: 0.00000554599999999967, y: 0.06472833872296682 },\n { x: 0.000005546999999999669, y: 0.03295586157200745 },\n { x: 0.000005547999999999669, y: 0.05475796916322858 },\n { x: 0.0000055489999999996685, y: 0.04188314826564839 },\n { x: 0.000005549999999999668, y: 0.05967081995622031 },\n { x: 0.000005550999999999668, y: 0.06831314388768701 },\n { x: 0.0000055519999999996675, y: 0.08983411770178787 },\n { x: 0.000005552999999999667, y: 0.03991504517733825 },\n { x: 0.000005553999999999667, y: 0.05925226625153502 },\n { x: 0.0000055549999999996664, y: 0.04213797468861381 },\n { x: 0.000005555999999999666, y: 0.06133667932342348 },\n { x: 0.000005556999999999666, y: 0.041887564770085095 },\n { x: 0.000005557999999999665, y: 0.08612857045103753 },\n { x: 0.000005558999999999665, y: 0.020248153390826376 },\n { x: 0.000005559999999999665, y: 0.03164169606716981 },\n { x: 0.000005560999999999664, y: 0.07439892408241605 },\n { x: 0.000005561999999999664, y: 0.08603765226763874 },\n { x: 0.000005562999999999664, y: 0.07827677519440465 },\n { x: 0.000005563999999999663, y: 0.06513240570996488 },\n { x: 0.000005564999999999663, y: 0.02448013085913827 },\n { x: 0.000005565999999999663, y: 0.03917620292257246 },\n { x: 0.000005566999999999662, y: 0.07844418400318481 },\n { x: 0.000005567999999999662, y: 0.012394745338080125 },\n { x: 0.0000055689999999996616, y: 0.030328527869683458 },\n { x: 0.000005569999999999661, y: 0.01588090917558188 },\n { x: 0.000005570999999999661, y: 0.0829305323787197 },\n { x: 0.0000055719999999996605, y: 0.03550676767462757 },\n { x: 0.00000557299999999966, y: 0.011737543384944753 },\n { x: 0.00000557399999999966, y: 0.04126140288967981 },\n { x: 0.0000055749999999996595, y: 0.05280712986026968 },\n { x: 0.000005575999999999659, y: 0.057018071381428476 },\n { x: 0.000005576999999999659, y: 0.05878194387415269 },\n { x: 0.0000055779999999996584, y: 0.06328945832781877 },\n { x: 0.000005578999999999658, y: 0.041681993739289165 },\n { x: 0.000005579999999999658, y: 0.04030560270657089 },\n { x: 0.000005580999999999657, y: 0.01663745748174005 },\n { x: 0.000005581999999999657, y: 0.008377372389003122 },\n { x: 0.000005582999999999657, y: 0.0581032421914115 },\n { x: 0.000005583999999999656, y: 0.047908410907343754 },\n { x: 0.000005584999999999656, y: 0.02878497276898038 },\n { x: 0.000005585999999999656, y: 0.008901174013913 },\n { x: 0.000005586999999999655, y: 0.06885914251102164 },\n { x: 0.000005587999999999655, y: 0.06429992249267769 },\n { x: 0.000005588999999999655, y: 0.000893097550625617 },\n { x: 0.000005589999999999654, y: 0.009171913191069532 },\n { x: 0.000005590999999999654, y: 0.042538012600782424 },\n { x: 0.0000055919999999996536, y: 0.019876336355162325 },\n { x: 0.000005592999999999653, y: 0.04644930626397727 },\n { x: 0.000005593999999999653, y: 0.024814587353290632 },\n { x: 0.0000055949999999996525, y: 0.023356932936255487 },\n { x: 0.000005595999999999652, y: 0.05667405242314277 },\n { x: 0.000005596999999999652, y: 0.05702008654319588 },\n { x: 0.0000055979999999996515, y: 0.02533705042232546 },\n { x: 0.000005598999999999651, y: 0.04476316702132985 },\n { x: 0.000005599999999999651, y: 0.05183551189811624 },\n { x: 0.00000560099999999965, y: 0.06481245288568309 },\n { x: 0.00000560199999999965, y: 0.06648602755689068 },\n { x: 0.00000560299999999965, y: 0.048773842554481 },\n { x: 0.000005603999999999649, y: 0.059011635578218376 },\n { x: 0.000005604999999999649, y: 0.00771297474421357 },\n { x: 0.000005605999999999649, y: -0.003163921360415746 },\n { x: 0.000005606999999999648, y: 0.04008631246664182 },\n { x: 0.000005607999999999648, y: -0.0069742596640481914 },\n { x: 0.000005608999999999648, y: 0.02025163971765502 },\n { x: 0.000005609999999999647, y: 0.024651007856440827 },\n { x: 0.000005610999999999647, y: 0.044386545510387884 },\n { x: 0.000005611999999999647, y: -0.013722603566318114 },\n { x: 0.000005612999999999646, y: 0.06068856556859613 },\n { x: 0.000005613999999999646, y: 0.040169789593820476 },\n { x: 0.0000056149999999996455, y: -0.01476290078877963 },\n { x: 0.000005615999999999645, y: 0.01105940223566256 },\n { x: 0.000005616999999999645, y: 0.029469720356187813 },\n { x: 0.0000056179999999996445, y: 0.005596016899092072 },\n { x: 0.000005618999999999644, y: 0.02150559823373598 },\n { x: 0.000005619999999999644, y: 0.04407202625207027 },\n { x: 0.0000056209999999996435, y: 0.03789016483067496 },\n { x: 0.000005621999999999643, y: 0.0019221746808426171 },\n { x: 0.000005622999999999643, y: 0.011138714956326418 },\n { x: 0.000005623999999999642, y: 0.020848669295159238 },\n { x: 0.000005624999999999642, y: 0.018516585930231415 },\n { x: 0.000005625999999999642, y: 0.03051620132813243 },\n { x: 0.000005626999999999641, y: -0.011585509259803254 },\n { x: 0.000005627999999999641, y: -0.022120878626000838 },\n { x: 0.000005628999999999641, y: -0.0007450149818789137 },\n { x: 0.00000562999999999964, y: 0.0380411152728801 },\n { x: 0.00000563099999999964, y: 0.01197382497145123 },\n { x: 0.00000563199999999964, y: 0.046828271907010034 },\n { x: 0.000005632999999999639, y: 0.02218981213052127 },\n { x: 0.000005633999999999639, y: 0.017025442690287405 },\n { x: 0.0000056349999999996386, y: -0.026792973179775893 },\n { x: 0.000005635999999999638, y: 0.006229005552760826 },\n { x: 0.000005636999999999638, y: -0.014025598925351625 },\n { x: 0.0000056379999999996375, y: 0.020133427649640084 },\n { x: 0.000005638999999999637, y: -0.009813053436434353 },\n { x: 0.000005639999999999637, y: 0.024055890013388023 },\n { x: 0.0000056409999999996365, y: 0.0015704902997545154 },\n { x: 0.000005641999999999636, y: -0.026148011260336345 },\n { x: 0.000005642999999999636, y: -0.024030178639016027 },\n { x: 0.0000056439999999996354, y: -0.026844628520719758 },\n { x: 0.000005644999999999635, y: 0.034111634667024014 },\n { x: 0.000005645999999999635, y: 0.026165124007766553 },\n { x: 0.000005646999999999634, y: 0.0006789787539526492 },\n { x: 0.000005647999999999634, y: -0.011217812063661143 },\n { x: 0.000005648999999999634, y: 0.0382674995511739 },\n { x: 0.000005649999999999633, y: -0.004292650252120828 },\n { x: 0.000005650999999999633, y: 0.03210363708760751 },\n { x: 0.000005651999999999633, y: 0.023190536225305574 },\n { x: 0.000005652999999999632, y: 0.020700088003767252 },\n { x: 0.000005653999999999632, y: 0.01012234136100479 },\n { x: 0.000005654999999999632, y: 0.0318527058706626 },\n { x: 0.000005655999999999631, y: 0.001701215982684314 },\n { x: 0.000005656999999999631, y: -0.006505403742632854 },\n { x: 0.0000056579999999996306, y: 0.028627052201854054 },\n { x: 0.00000565899999999963, y: 0.0333194242382491 },\n { x: 0.00000565999999999963, y: 0.019532633586378263 },\n { x: 0.0000056609999999996295, y: -0.014224921413054835 },\n { x: 0.000005661999999999629, y: 0.0028077796856473937 },\n { x: 0.000005662999999999629, y: 0.003776555928742575 },\n { x: 0.0000056639999999996285, y: -0.012064414528100555 },\n { x: 0.000005664999999999628, y: -0.022332196186054018 },\n { x: 0.000005665999999999628, y: 0.022280199895584857 },\n { x: 0.0000056669999999996274, y: -0.031229727201994593 },\n { x: 0.000005667999999999627, y: -0.001943633632733542 },\n { x: 0.000005668999999999627, y: -0.008853747046028863 },\n { x: 0.000005669999999999626, y: 0.007163590651577227 },\n { x: 0.000005670999999999626, y: -0.023900501590345243 },\n { x: 0.000005671999999999626, y: 0.027872112577264727 },\n { x: 0.000005672999999999625, y: 0.016270034846638557 },\n { x: 0.000005673999999999625, y: -0.03402160781208134 },\n { x: 0.000005674999999999625, y: -0.045153928033824814 },\n { x: 0.000005675999999999624, y: 0.005610116785369946 },\n { x: 0.000005676999999999624, y: -0.035385155411857126 },\n { x: 0.000005677999999999624, y: 0.0009839181855679432 },\n { x: 0.000005678999999999623, y: -0.04804510424331552 },\n { x: 0.000005679999999999623, y: -0.030375441649107444 },\n { x: 0.0000056809999999996225, y: -0.02013841317395565 },\n { x: 0.000005681999999999622, y: -0.006114350162281739 },\n { x: 0.000005682999999999622, y: 0.014729657642163801 },\n { x: 0.0000056839999999996215, y: -0.02097342675851997 },\n { x: 0.000005684999999999621, y: 0.006885734269905498 },\n { x: 0.000005685999999999621, y: -0.03729989834911218 },\n { x: 0.0000056869999999996205, y: -0.04183174185026434 },\n { x: 0.00000568799999999962, y: -0.0013554810021687985 },\n { x: 0.00000568899999999962, y: 0.01630753353225366 },\n { x: 0.000005689999999999619, y: 0.015104116756579227 },\n { x: 0.000005690999999999619, y: 0.012927539898602194 },\n { x: 0.000005691999999999619, y: -0.03977001044925549 },\n { x: 0.000005692999999999618, y: 0.017211162168701364 },\n { x: 0.000005693999999999618, y: 0.014307725013690865 },\n { x: 0.000005694999999999618, y: -0.018000673069227983 },\n { x: 0.000005695999999999617, y: -0.058923782321724086 },\n { x: 0.000005696999999999617, y: -0.05799732387748946 },\n { x: 0.000005697999999999617, y: -0.03218036782615146 },\n { x: 0.000005698999999999616, y: -0.033576925726694365 },\n { x: 0.000005699999999999616, y: -0.02337175629493938 },\n { x: 0.000005700999999999616, y: -0.028183839285457153 },\n { x: 0.000005701999999999615, y: -0.004655059738724345 },\n { x: 0.000005702999999999615, y: -0.0035354414088171193 },\n { x: 0.0000057039999999996145, y: -0.03877360283304894 },\n { x: 0.000005704999999999614, y: -0.017163295343060547 },\n { x: 0.000005705999999999614, y: -0.058584890888645 },\n { x: 0.0000057069999999996135, y: -0.05667109666255698 },\n { x: 0.000005707999999999613, y: -0.03025993073962001 },\n { x: 0.000005708999999999613, y: -0.0024633710923877283 },\n { x: 0.0000057099999999996124, y: 0.00857043003805133 },\n { x: 0.000005710999999999612, y: -0.035917369727011775 },\n { x: 0.000005711999999999612, y: -0.039152484702586574 },\n { x: 0.000005712999999999611, y: -0.04057079186556319 },\n { x: 0.000005713999999999611, y: -0.0330401549658487 },\n { x: 0.000005714999999999611, y: -0.023025479967120448 },\n { x: 0.00000571599999999961, y: 0.005593885495607357 },\n { x: 0.00000571699999999961, y: -0.027941103751881705 },\n { x: 0.00000571799999999961, y: 0.001835736269430531 },\n { x: 0.000005718999999999609, y: -0.019586099052532863 },\n { x: 0.000005719999999999609, y: 0.004212557041339639 },\n { x: 0.000005720999999999609, y: -0.030891088198648112 },\n { x: 0.000005721999999999608, y: -0.06606298048996752 },\n { x: 0.000005722999999999608, y: -0.03688061256835673 },\n { x: 0.0000057239999999996076, y: -0.02469465223837293 },\n { x: 0.000005724999999999607, y: -0.06398921118719145 },\n { x: 0.000005725999999999607, y: -0.07192800213483119 },\n { x: 0.0000057269999999996065, y: -0.0273409370204854 },\n { x: 0.000005727999999999606, y: -0.034001471770512236 },\n { x: 0.000005728999999999606, y: 0.0007413998196445018 },\n { x: 0.0000057299999999996055, y: -0.03232229316025801 },\n { x: 0.000005730999999999605, y: -0.025352736378456274 },\n { x: 0.000005731999999999605, y: -0.010810158447983696 },\n { x: 0.0000057329999999996044, y: -0.0742865472599629 },\n { x: 0.000005733999999999604, y: -0.0598174152222143 },\n { x: 0.000005734999999999604, y: -0.05034602665720305 },\n { x: 0.000005735999999999603, y: -0.019900323098025554 },\n { x: 0.000005736999999999603, y: -0.0351786840299238 },\n { x: 0.000005737999999999603, y: -0.008071725677343523 },\n { x: 0.000005738999999999602, y: -0.03750508446008024 },\n { x: 0.000005739999999999602, y: -0.0231612217333422 },\n { x: 0.000005740999999999602, y: -0.05857153813838402 },\n { x: 0.000005741999999999601, y: -0.07171444837134333 },\n { x: 0.000005742999999999601, y: -0.02692908700371896 },\n { x: 0.000005743999999999601, y: -0.0342765679111989 },\n { x: 0.0000057449999999996, y: -0.062147713486180325 },\n { x: 0.0000057459999999996, y: -0.019502456493431998 },\n { x: 0.0000057469999999995996, y: -0.015250449542157266 },\n { x: 0.000005747999999999599, y: -0.07235146147523647 },\n { x: 0.000005748999999999599, y: -0.030868051789735604 },\n { x: 0.0000057499999999995985, y: -0.06986747041760005 },\n { x: 0.000005750999999999598, y: -0.02296962298268029 },\n { x: 0.000005751999999999598, y: -0.036844746937660225 },\n { x: 0.0000057529999999995975, y: -0.041444924958916364 },\n { x: 0.000005753999999999597, y: -0.03635059601750078 },\n { x: 0.000005754999999999597, y: -0.017255796762393288 },\n { x: 0.000005755999999999596, y: -0.06838302329634105 },\n { x: 0.000005756999999999596, y: -0.048500918553307945 },\n { x: 0.000005757999999999596, y: -0.03221486912063589 },\n { x: 0.000005758999999999595, y: -0.056612019736647416 },\n { x: 0.000005759999999999595, y: -0.07851138654631737 },\n { x: 0.000005760999999999595, y: -0.086695244252949 },\n { x: 0.000005761999999999594, y: -0.05944565333016504 },\n { x: 0.000005762999999999594, y: -0.04626958090971851 },\n { x: 0.000005763999999999594, y: -0.07713820159389875 },\n { x: 0.000005764999999999593, y: -0.044222369540555986 },\n { x: 0.000005765999999999593, y: -0.02205590508494688 },\n { x: 0.000005766999999999593, y: -0.07423921875600382 },\n { x: 0.000005767999999999592, y: -0.028091550132308993 },\n { x: 0.000005768999999999592, y: -0.02955325839615145 },\n { x: 0.0000057699999999995915, y: -0.039716320908441884 },\n { x: 0.000005770999999999591, y: -0.08987433853928249 },\n { x: 0.000005771999999999591, y: -0.039593569056114594 },\n { x: 0.0000057729999999995905, y: -0.06544983082951397 },\n { x: 0.00000577399999999959, y: -0.054205737912335836 },\n { x: 0.00000577499999999959, y: -0.02951098325132251 },\n { x: 0.0000057759999999995895, y: -0.06733467117567192 },\n { x: 0.000005776999999999589, y: -0.028024380404148886 },\n { x: 0.000005777999999999589, y: -0.0712905588570015 },\n { x: 0.000005778999999999588, y: -0.021319793610111132 },\n { x: 0.000005779999999999588, y: -0.061936224790157035 },\n { x: 0.000005780999999999588, y: -0.03538994017350089 },\n { x: 0.000005781999999999587, y: -0.06010415874927883 },\n { x: 0.000005782999999999587, y: -0.07341780416746682 },\n { x: 0.000005783999999999587, y: -0.06952239980928439 },\n { x: 0.000005784999999999586, y: -0.09604945375391341 },\n { x: 0.000005785999999999586, y: -0.07383273485678472 },\n { x: 0.000005786999999999586, y: -0.07228634756174412 },\n { x: 0.000005787999999999585, y: -0.07188594847123486 },\n { x: 0.000005788999999999585, y: -0.09846154076742819 },\n { x: 0.0000057899999999995846, y: -0.07359710365589271 },\n { x: 0.000005790999999999584, y: -0.09585404306112505 },\n { x: 0.000005791999999999584, y: -0.042498856992923786 },\n { x: 0.0000057929999999995835, y: -0.08444487494729958 },\n { x: 0.000005793999999999583, y: -0.05122697019317219 },\n { x: 0.000005794999999999583, y: -0.08604394352224352 },\n { x: 0.0000057959999999995825, y: -0.030101249188827194 },\n { x: 0.000005796999999999582, y: -0.0667469620884695 },\n { x: 0.000005797999999999582, y: -0.043209639883141304 },\n { x: 0.0000057989999999995814, y: -0.09190380166489767 },\n { x: 0.000005799999999999581, y: -0.06737941949782927 },\n { x: 0.000005800999999999581, y: -0.04756534869627232 },\n { x: 0.00000580199999999958, y: -0.04501087846259548 },\n { x: 0.00000580299999999958, y: -0.06503399123981082 },\n { x: 0.00000580399999999958, y: -0.08934837554224814 },\n { x: 0.000005804999999999579, y: -0.03498435728830198 },\n { x: 0.000005805999999999579, y: -0.10021236069484064 },\n { x: 0.000005806999999999579, y: -0.03888367300232594 },\n { x: 0.000005807999999999578, y: -0.06990645854582117 },\n { x: 0.000005808999999999578, y: -0.09830621662067195 },\n { x: 0.000005809999999999578, y: -0.0761677701208191 },\n { x: 0.000005810999999999577, y: -0.09925095261976043 },\n { x: 0.000005811999999999577, y: -0.061494744469045876 },\n { x: 0.0000058129999999995766, y: -0.08744081456429113 },\n { x: 0.000005813999999999576, y: -0.06034985228538464 },\n { x: 0.000005814999999999576, y: -0.09890070155560016 },\n { x: 0.0000058159999999995755, y: -0.06944561456294805 },\n { x: 0.000005816999999999575, y: -0.058741832342005924 },\n { x: 0.000005817999999999575, y: -0.09623316595760983 },\n { x: 0.0000058189999999995745, y: -0.048109504614466614 },\n { x: 0.000005819999999999574, y: -0.044744918324178456 },\n { x: 0.000005820999999999574, y: -0.08139055414309444 },\n { x: 0.0000058219999999995734, y: -0.03909365340306212 },\n { x: 0.000005822999999999573, y: -0.10759857263925998 },\n { x: 0.000005823999999999573, y: -0.06127175766808743 },\n { x: 0.000005824999999999572, y: -0.070658348968339 },\n { x: 0.000005825999999999572, y: -0.09527570808349686 },\n { x: 0.000005826999999999572, y: -0.10458701157604444 },\n { x: 0.000005827999999999571, y: -0.0685408731791968 },\n { x: 0.000005828999999999571, y: -0.05345705577140911 },\n { x: 0.000005829999999999571, y: -0.10503183660279276 },\n { x: 0.00000583099999999957, y: -0.03821669277482671 },\n { x: 0.00000583199999999957, y: -0.09503935934061356 },\n { x: 0.00000583299999999957, y: -0.041760977192790316 },\n { x: 0.000005833999999999569, y: -0.09242569294401952 },\n { x: 0.000005834999999999569, y: -0.08454161908547561 },\n { x: 0.0000058359999999995685, y: -0.05612573639631745 },\n { x: 0.000005836999999999568, y: -0.08202227086407211 },\n { x: 0.000005837999999999568, y: -0.07758990562205759 },\n { x: 0.0000058389999999995675, y: -0.08075085651540101 },\n { x: 0.000005839999999999567, y: -0.06291265191062109 },\n { x: 0.000005840999999999567, y: -0.07909716490356195 },\n { x: 0.0000058419999999995665, y: -0.0959729041635939 },\n { x: 0.000005842999999999566, y: -0.10767115679036697 },\n { x: 0.000005843999999999566, y: -0.05792539181377214 },\n { x: 0.000005844999999999565, y: -0.11389971079713293 },\n { x: 0.000005845999999999565, y: -0.07854169439070142 },\n { x: 0.000005846999999999565, y: -0.07827634415689541 },\n { x: 0.000005847999999999564, y: -0.10155207383910182 },\n { x: 0.000005848999999999564, y: -0.08406951523294798 },\n { x: 0.000005849999999999564, y: -0.0699506482479303 },\n { x: 0.000005850999999999563, y: -0.06777870234520147 },\n { x: 0.000005851999999999563, y: -0.05073802522998252 },\n { x: 0.000005852999999999563, y: -0.07179442228549544 },\n { x: 0.000005853999999999562, y: -0.04295257733926645 },\n { x: 0.000005854999999999562, y: -0.10685934190128094 },\n { x: 0.000005855999999999562, y: -0.08571282539546297 },\n { x: 0.000005856999999999561, y: -0.07756092374002004 },\n { x: 0.000005857999999999561, y: -0.11143553063146022 },\n { x: 0.0000058589999999995605, y: -0.06269409753144073 },\n { x: 0.00000585999999999956, y: -0.06191712621073414 },\n { x: 0.00000586099999999956, y: -0.05296164863575473 },\n { x: 0.0000058619999999995595, y: -0.05806258741800971 },\n { x: 0.000005862999999999559, y: -0.0839779026597179 },\n { x: 0.000005863999999999559, y: -0.02956607513367944 },\n { x: 0.0000058649999999995584, y: -0.04733140876106485 },\n { x: 0.000005865999999999558, y: -0.05972090461448733 },\n { x: 0.000005866999999999558, y: -0.07941774251246225 },\n { x: 0.000005867999999999557, y: -0.10381420716458857 },\n { x: 0.000005868999999999557, y: -0.07686181733701303 },\n { x: 0.000005869999999999557, y: -0.0659154356248962 },\n { x: 0.000005870999999999556, y: -0.09342745403201996 },\n { x: 0.000005871999999999556, y: -0.05531922712482367 },\n { x: 0.000005872999999999556, y: -0.0858453340625318 },\n { x: 0.000005873999999999555, y: -0.08900667413725324 },\n { x: 0.000005874999999999555, y: -0.07964332248228838 },\n { x: 0.000005875999999999555, y: -0.06105336903909923 },\n { x: 0.000005876999999999554, y: -0.04684664695442535 },\n { x: 0.000005877999999999554, y: -0.06010652615476571 },\n { x: 0.0000058789999999995536, y: -0.11862538884058255 },\n { x: 0.000005879999999999553, y: -0.08786857629776401 },\n { x: 0.000005880999999999553, y: -0.06408928610705761 },\n { x: 0.0000058819999999995525, y: -0.08211332744981444 },\n { x: 0.000005882999999999552, y: -0.04710852824275628 },\n { x: 0.000005883999999999552, y: -0.11530689356530775 },\n { x: 0.0000058849999999995515, y: -0.10714248396784734 },\n { x: 0.000005885999999999551, y: -0.04903233093201889 },\n { x: 0.000005886999999999551, y: -0.06841522209935037 },\n { x: 0.0000058879999999995504, y: -0.0975377838889517 },\n { x: 0.00000588899999999955, y: -0.10893720536044163 },\n { x: 0.00000588999999999955, y: -0.07614668100418942 },\n { x: 0.000005890999999999549, y: -0.11792052763863067 },\n { x: 0.000005891999999999549, y: -0.08102620450522152 },\n { x: 0.000005892999999999549, y: -0.04999309195292643 },\n { x: 0.000005893999999999548, y: -0.05615823752048191 },\n { x: 0.000005894999999999548, y: -0.11101672133657967 },\n { x: 0.000005895999999999548, y: -0.06470582537956217 },\n { x: 0.000005896999999999547, y: -0.07980153328623672 },\n { x: 0.000005897999999999547, y: -0.06913510953817037 },\n { x: 0.000005898999999999547, y: -0.09508242504738557 },\n { x: 0.000005899999999999546, y: -0.07972709427153665 },\n { x: 0.000005900999999999546, y: -0.11734885941297832 },\n { x: 0.0000059019999999995456, y: -0.10392499208624882 },\n { x: 0.000005902999999999545, y: -0.06483729796600934 },\n { x: 0.000005903999999999545, y: -0.09431108480123426 },\n { x: 0.0000059049999999995445, y: -0.06989015945749583 },\n { x: 0.000005905999999999544, y: -0.054335738909329676 },\n { x: 0.000005906999999999544, y: -0.10026847250536272 },\n { x: 0.0000059079999999995435, y: -0.055882354554928806 },\n { x: 0.000005908999999999543, y: -0.0519818775919906 },\n { x: 0.000005909999999999543, y: -0.11121080162286982 },\n { x: 0.000005910999999999542, y: -0.11681847169794696 },\n { x: 0.000005911999999999542, y: -0.09268630378783238 },\n { x: 0.000005912999999999542, y: -0.09452583849045111 },\n { x: 0.000005913999999999541, y: -0.06130397024547162 },\n { x: 0.000005914999999999541, y: -0.08070615553185966 },\n { x: 0.000005915999999999541, y: -0.12395475405748313 },\n { x: 0.00000591699999999954, y: -0.10562715510100557 },\n { x: 0.00000591799999999954, y: -0.09464580929797783 },\n { x: 0.00000591899999999954, y: -0.06835399556451352 },\n { x: 0.000005919999999999539, y: -0.0904248918028055 },\n { x: 0.000005920999999999539, y: -0.0851291615682976 },\n { x: 0.000005921999999999539, y: -0.0962904531864375 },\n { x: 0.000005922999999999538, y: -0.06634897713627076 },\n { x: 0.000005923999999999538, y: -0.10524807821450383 },\n { x: 0.0000059249999999995375, y: -0.09720623615497455 },\n { x: 0.000005925999999999537, y: -0.12306326324707181 },\n { x: 0.000005926999999999537, y: -0.09414363035324143 },\n { x: 0.0000059279999999995365, y: -0.10539974097706634 },\n { x: 0.000005928999999999536, y: -0.09402820172700005 },\n { x: 0.000005929999999999536, y: -0.11363129966983088 },\n { x: 0.0000059309999999995355, y: -0.10748435559122782 },\n { x: 0.000005931999999999535, y: -0.12289354951166914 },\n { x: 0.000005932999999999535, y: -0.07524487266614625 },\n { x: 0.000005933999999999534, y: -0.10768494654670385 },\n { x: 0.000005934999999999534, y: -0.058131404847012326 },\n { x: 0.000005935999999999534, y: -0.0973274653732348 },\n { x: 0.000005936999999999533, y: -0.07131325974688427 },\n { x: 0.000005937999999999533, y: -0.12189395817163214 },\n { x: 0.000005938999999999533, y: -0.09204776659183939 },\n { x: 0.000005939999999999532, y: -0.10527294678696195 },\n { x: 0.000005940999999999532, y: -0.07086144962321585 },\n { x: 0.000005941999999999532, y: -0.10272133143303944 },\n { x: 0.000005942999999999531, y: -0.0797344633143732 },\n { x: 0.000005943999999999531, y: -0.11816574875331506 },\n { x: 0.0000059449999999995306, y: -0.07887916021605505 },\n { x: 0.00000594599999999953, y: -0.08704605197874019 },\n { x: 0.00000594699999999953, y: -0.0659776751487626 },\n { x: 0.0000059479999999995295, y: -0.06800937055616915 },\n { x: 0.000005948999999999529, y: -0.08476432781742672 },\n { x: 0.000005949999999999529, y: -0.07276212001018986 },\n { x: 0.0000059509999999995285, y: -0.11097583527217 },\n { x: 0.000005951999999999528, y: -0.09114990050346133 },\n { x: 0.000005952999999999528, y: -0.05321163115913629 },\n { x: 0.0000059539999999995274, y: -0.10014269309055097 },\n { x: 0.000005954999999999527, y: -0.09332466712184218 },\n { x: 0.000005955999999999527, y: -0.10958659355926563 },\n { x: 0.000005956999999999526, y: -0.10598461377439711 },\n { x: 0.000005957999999999526, y: -0.11832787511236788 },\n { x: 0.000005958999999999526, y: -0.08767203957483559 },\n { x: 0.000005959999999999525, y: -0.10911507089919262 },\n { x: 0.000005960999999999525, y: -0.06723931057661828 },\n { x: 0.000005961999999999525, y: -0.11132910373998792 },\n { x: 0.000005962999999999524, y: -0.08918336998757419 },\n { x: 0.000005963999999999524, y: -0.0940508203755534 },\n { x: 0.000005964999999999524, y: -0.1158160570813608 },\n { x: 0.000005965999999999523, y: -0.05695631244678885 },\n { x: 0.000005966999999999523, y: -0.08747552257005412 },\n { x: 0.0000059679999999995226, y: -0.049069820854011625 },\n { x: 0.000005968999999999522, y: -0.08611300731885935 },\n { x: 0.000005969999999999522, y: -0.07745093107225963 },\n { x: 0.0000059709999999995215, y: -0.0703077715906806 },\n { x: 0.000005971999999999521, y: -0.05065555734157756 },\n { x: 0.000005972999999999521, y: -0.06715521799087985 },\n { x: 0.0000059739999999995205, y: -0.08516127281578605 },\n { x: 0.00000597499999999952, y: -0.11216249473970795 },\n { x: 0.00000597599999999952, y: -0.06832514700258674 },\n { x: 0.0000059769999999995194, y: -0.08999450097333302 },\n { x: 0.000005977999999999519, y: -0.1014833067655432 },\n { x: 0.000005978999999999519, y: -0.1209399536318487 },\n { x: 0.000005979999999999518, y: -0.08368603118831162 },\n { x: 0.000005980999999999518, y: -0.1175953409073949 },\n { x: 0.000005981999999999518, y: -0.10910917224710695 },\n { x: 0.000005982999999999517, y: -0.08285773812355521 },\n { x: 0.000005983999999999517, y: -0.09761625529116995 },\n { x: 0.000005984999999999517, y: -0.06371983111729634 },\n { x: 0.000005985999999999516, y: -0.09894572278772236 },\n { x: 0.000005986999999999516, y: -0.061733402000615736 },\n { x: 0.000005987999999999516, y: -0.06557296426887031 },\n { x: 0.000005988999999999515, y: -0.07962959709813179 },\n { x: 0.000005989999999999515, y: -0.10108177554816068 },\n { x: 0.0000059909999999995145, y: -0.04700005491072034 },\n { x: 0.000005991999999999514, y: -0.08067027534263219 },\n { x: 0.000005992999999999514, y: -0.07513091808886702 },\n { x: 0.0000059939999999995135, y: -0.09841254198947565 },\n { x: 0.000005994999999999513, y: -0.056626240380511075 },\n { x: 0.000005995999999999513, y: -0.08745953607336093 },\n { x: 0.0000059969999999995125, y: -0.07538686897303558 },\n { x: 0.000005997999999999512, y: -0.08670448141718652 },\n { x: 0.000005998999999999512, y: -0.1073141424308152 },\n { x: 0.000005999999999999511, y: -0.10771847711884708 },\n { x: 0.000006000999999999511, y: -0.12195165876996406 },\n { x: 0.000006001999999999511, y: -0.08644102670296684 },\n { x: 0.00000600299999999951, y: -0.09563729754616583 },\n { x: 0.00000600399999999951, y: -0.08960733702434961 },\n { x: 0.00000600499999999951, y: -0.11041109453869191 },\n { x: 0.000006005999999999509, y: -0.056102866895571535 },\n { x: 0.000006006999999999509, y: -0.08364941214416051 },\n { x: 0.000006007999999999509, y: -0.05325541192381518 },\n { x: 0.000006008999999999508, y: -0.09108186690943285 },\n { x: 0.000006009999999999508, y: -0.08458580035965713 },\n { x: 0.000006010999999999508, y: -0.05507224504112952 },\n { x: 0.000006011999999999507, y: -0.10296330561322223 },\n { x: 0.000006012999999999507, y: -0.09488929278865856 },\n { x: 0.0000060139999999995065, y: -0.06013245512926522 },\n { x: 0.000006014999999999506, y: -0.08934633450284106 },\n { x: 0.000006015999999999506, y: -0.08259162631814278 },\n { x: 0.0000060169999999995055, y: -0.05357538661837122 },\n { x: 0.000006017999999999505, y: -0.05204831036386155 },\n { x: 0.000006018999999999505, y: -0.06344763781702512 },\n { x: 0.0000060199999999995044, y: -0.09482085670357751 },\n { x: 0.000006020999999999504, y: -0.1163725227165778 },\n { x: 0.000006021999999999504, y: -0.05815953680107275 },\n { x: 0.000006022999999999503, y: -0.09658067692709792 },\n { x: 0.000006023999999999503, y: -0.11752584670711022 },\n { x: 0.000006024999999999503, y: -0.08223820261654766 },\n { x: 0.000006025999999999502, y: -0.09598521850349812 },\n { x: 0.000006026999999999502, y: -0.042073398825239715 },\n { x: 0.000006027999999999502, y: -0.07048987614783778 },\n { x: 0.000006028999999999501, y: -0.09279478329200198 },\n { x: 0.000006029999999999501, y: -0.07895609564632952 },\n { x: 0.000006030999999999501, y: -0.10784860207727726 },\n { x: 0.0000060319999999995, y: -0.053028161190770064 },\n { x: 0.0000060329999999995, y: -0.0829248927180219 },\n { x: 0.0000060339999999994996, y: -0.0818058971188156 },\n { x: 0.000006034999999999499, y: -0.0664053590475456 },\n { x: 0.000006035999999999499, y: -0.08782009530975278 },\n { x: 0.0000060369999999994985, y: -0.07147853880348622 },\n { x: 0.000006037999999999498, y: -0.060472656767288614 },\n { x: 0.000006038999999999498, y: -0.10469031247704569 },\n { x: 0.0000060399999999994975, y: -0.10442521789887405 },\n { x: 0.000006040999999999497, y: -0.1054544936079513 },\n { x: 0.000006041999999999497, y: -0.06643322660601902 },\n { x: 0.0000060429999999994964, y: -0.10928909518495153 },\n { x: 0.000006043999999999496, y: -0.08416396760142379 },\n { x: 0.000006044999999999496, y: -0.07496725972070763 },\n { x: 0.000006045999999999495, y: -0.06809265692172944 },\n { x: 0.000006046999999999495, y: -0.10921065249892614 },\n { x: 0.000006047999999999495, y: -0.05430327227813113 },\n { x: 0.000006048999999999494, y: -0.07028211882368447 },\n { x: 0.000006049999999999494, y: -0.07704224796860162 },\n { x: 0.000006050999999999494, y: -0.0506767095500774 },\n { x: 0.000006051999999999493, y: -0.06114107076207647 },\n { x: 0.000006052999999999493, y: -0.04604035944602747 },\n { x: 0.000006053999999999493, y: -0.08062917041039515 },\n { x: 0.000006054999999999492, y: -0.08833735893986822 },\n { x: 0.000006055999999999492, y: -0.06978961323064778 },\n { x: 0.0000060569999999994916, y: -0.08892204483179389 },\n { x: 0.000006057999999999491, y: -0.08185808321114553 },\n { x: 0.000006058999999999491, y: -0.09922425884615114 },\n { x: 0.0000060599999999994905, y: -0.06654865516326708 },\n { x: 0.00000606099999999949, y: -0.09902557428036265 },\n { x: 0.00000606199999999949, y: -0.07919456209501505 },\n { x: 0.0000060629999999994895, y: -0.037640796437529905 },\n { x: 0.000006063999999999489, y: -0.04633714536331375 },\n { x: 0.000006064999999999489, y: -0.10412942784348213 },\n { x: 0.000006065999999999488, y: -0.08689579722150406 },\n { x: 0.000006066999999999488, y: -0.06252268310524947 },\n { x: 0.000006067999999999488, y: -0.06216046889070501 },\n { x: 0.000006068999999999487, y: -0.036914977347461485 },\n { x: 0.000006069999999999487, y: -0.048231801694563134 },\n { x: 0.000006070999999999487, y: -0.05376265197084077 },\n { x: 0.000006071999999999486, y: -0.10214662605294006 },\n { x: 0.000006072999999999486, y: -0.10076966877582873 },\n { x: 0.000006073999999999486, y: -0.09999743767546357 },\n { x: 0.000006074999999999485, y: -0.035350232451341466 },\n { x: 0.000006075999999999485, y: -0.09442745812635754 },\n { x: 0.000006076999999999485, y: -0.08258066472939925 },\n { x: 0.000006077999999999484, y: -0.10232536981876336 },\n { x: 0.000006078999999999484, y: -0.03543871468212978 },\n { x: 0.0000060799999999994835, y: -0.0759086260932181 },\n { x: 0.000006080999999999483, y: -0.043532089922470284 },\n { x: 0.000006081999999999483, y: -0.09943150345333678 },\n { x: 0.0000060829999999994825, y: -0.05249172545629008 },\n { x: 0.000006083999999999482, y: -0.0497052120447259 },\n { x: 0.000006084999999999482, y: -0.055959084079517794 },\n { x: 0.0000060859999999994815, y: -0.09319915565967628 },\n { x: 0.000006086999999999481, y: -0.07752902920304276 },\n { x: 0.000006087999999999481, y: -0.05946988747654547 },\n { x: 0.00000608899999999948, y: -0.051936078922685584 },\n { x: 0.00000608999999999948, y: -0.05051434375004746 },\n { x: 0.00000609099999999948, y: -0.09438022983296337 },\n { x: 0.000006091999999999479, y: -0.05586243002483793 },\n { x: 0.000006092999999999479, y: -0.03023407036649725 },\n { x: 0.000006093999999999479, y: -0.03258275009046126 },\n { x: 0.000006094999999999478, y: -0.1024980044093661 },\n { x: 0.000006095999999999478, y: -0.09275611915316864 },\n { x: 0.000006096999999999478, y: -0.032795237526358004 },\n { x: 0.000006097999999999477, y: -0.030310105665027724 },\n { x: 0.000006098999999999477, y: -0.04327997543941835 },\n { x: 0.0000060999999999994766, y: -0.0659210445886651 },\n { x: 0.000006100999999999476, y: -0.09146231185210932 },\n { x: 0.000006101999999999476, y: -0.037438521964976615 },\n { x: 0.0000061029999999994755, y: -0.06576506215415627 },\n { x: 0.000006103999999999475, y: -0.08739087890932841 },\n { x: 0.000006104999999999475, y: -0.06464663089288639 },\n { x: 0.0000061059999999994745, y: -0.08364440666422324 },\n { x: 0.000006106999999999474, y: -0.035357769772154185 },\n { x: 0.000006107999999999474, y: -0.06049417748147655 },\n { x: 0.0000061089999999994734, y: -0.060791295857051696 },\n { x: 0.000006109999999999473, y: -0.05212904990702236 },\n { x: 0.000006110999999999473, y: -0.06456353747402446 },\n { x: 0.000006111999999999472, y: -0.07640714343088706 },\n { x: 0.000006112999999999472, y: -0.08101522377396328 },\n { x: 0.000006113999999999472, y: -0.08368665115374006 },\n { x: 0.000006114999999999471, y: -0.05560243777778019 },\n { x: 0.000006115999999999471, y: -0.03740030383550171 },\n { x: 0.000006116999999999471, y: -0.07765490884778034 },\n { x: 0.00000611799999999947, y: -0.06269673414572502 },\n { x: 0.00000611899999999947, y: -0.039844701688237893 },\n { x: 0.00000611999999999947, y: -0.0765170312942845 },\n { x: 0.000006120999999999469, y: -0.07042859535984229 },\n { x: 0.000006121999999999469, y: -0.02187132839342848 },\n { x: 0.0000061229999999994686, y: -0.036588541096110413 },\n { x: 0.000006123999999999468, y: -0.06139969937508194 },\n { x: 0.000006124999999999468, y: -0.01829732470758478 },\n { x: 0.0000061259999999994675, y: -0.040682294409315894 },\n { x: 0.000006126999999999467, y: -0.039408999760286875 },\n { x: 0.000006127999999999467, y: -0.02279277932498827 },\n { x: 0.0000061289999999994665, y: -0.030005550988070537 },\n { x: 0.000006129999999999466, y: -0.08833548770587532 },\n { x: 0.000006130999999999466, y: -0.09032895729687224 },\n { x: 0.0000061319999999994654, y: -0.07981404934168174 },\n { x: 0.000006132999999999465, y: -0.06360981164020682 },\n { x: 0.000006133999999999465, y: -0.05635412185758906 },\n { x: 0.000006134999999999464, y: -0.019721263044769843 },\n { x: 0.000006135999999999464, y: -0.057318177733051506 },\n { x: 0.000006136999999999464, y: -0.07422415925552941 },\n { x: 0.000006137999999999463, y: -0.08831455583860398 },\n { x: 0.000006138999999999463, y: -0.07914814296113405 },\n { x: 0.000006139999999999463, y: -0.07254456063201074 },\n { x: 0.000006140999999999462, y: -0.07975292118650033 },\n { x: 0.000006141999999999462, y: -0.07703892120051815 },\n { x: 0.000006142999999999462, y: -0.03911335842578403 },\n { x: 0.000006143999999999461, y: -0.0624346534060086 },\n { x: 0.000006144999999999461, y: -0.03874617368811919 },\n { x: 0.0000061459999999994605, y: -0.0740110989151904 },\n { x: 0.00000614699999999946, y: -0.007660881498383919 },\n { x: 0.00000614799999999946, y: -0.011405687573579834 },\n { x: 0.0000061489999999994595, y: -0.012530470453577969 },\n { x: 0.000006149999999999459, y: -0.01523333144009003 },\n { x: 0.000006150999999999459, y: -0.05489184226314414 },\n { x: 0.0000061519999999994585, y: -0.039130272486857236 },\n { x: 0.000006152999999999458, y: -0.08293924945867172 },\n { x: 0.000006153999999999458, y: -0.02527022872010664 },\n { x: 0.000006154999999999457, y: -0.051431416284347095 },\n { x: 0.000006155999999999457, y: -0.016261011515250896 },\n { x: 0.000006156999999999457, y: -0.024252593090642267 },\n { x: 0.000006157999999999456, y: -0.07090916602992203 },\n { x: 0.000006158999999999456, y: -0.058718973882890366 },\n { x: 0.000006159999999999456, y: -0.02353605606787683 },\n { x: 0.000006160999999999455, y: -0.048297583921088225 },\n { x: 0.000006161999999999455, y: -0.02322525667090455 },\n { x: 0.000006162999999999455, y: -0.061420659843478775 },\n { x: 0.000006163999999999454, y: -0.014277554526177638 },\n { x: 0.000006164999999999454, y: -0.06469178475100859 },\n { x: 0.000006165999999999454, y: -0.009171104892655609 },\n { x: 0.000006166999999999453, y: -0.06653088376979778 },\n { x: 0.000006167999999999453, y: -0.07725938998366272 },\n { x: 0.0000061689999999994525, y: -0.02654697739258084 },\n { x: 0.000006169999999999452, y: -0.0413348446142956 },\n { x: 0.000006170999999999452, y: -0.009288754652388237 },\n { x: 0.0000061719999999994515, y: -0.04826226440609409 },\n { x: 0.000006172999999999451, y: -0.06136531060918308 },\n { x: 0.000006173999999999451, y: -0.028318733100411893 },\n { x: 0.0000061749999999994504, y: -0.07134938507758189 },\n { x: 0.00000617599999999945, y: -0.06191959854252564 },\n { x: 0.00000617699999999945, y: -0.04094477951194121 },\n { x: 0.000006177999999999449, y: -0.05192451345077616 },\n { x: 0.000006178999999999449, y: -0.021237624257075736 },\n { x: 0.000006179999999999449, y: -0.0536031160606531 },\n { x: 0.000006180999999999448, y: -0.0691755146665819 },\n { x: 0.000006181999999999448, y: -0.04303059259727877 },\n { x: 0.000006182999999999448, y: -0.040002811001553416 },\n { x: 0.000006183999999999447, y: -0.05349711000705129 },\n { x: 0.000006184999999999447, y: -0.05272545070529948 },\n { x: 0.000006185999999999447, y: -0.0413942349224902 },\n { x: 0.000006186999999999446, y: -0.016244124912070095 },\n { x: 0.000006187999999999446, y: -0.013549259601527443 },\n { x: 0.0000061889999999994456, y: -0.05294550999414146 },\n { x: 0.000006189999999999445, y: -0.061378110945480374 },\n { x: 0.000006190999999999445, y: -0.01495256796480194 },\n { x: 0.0000061919999999994445, y: -0.01881017581693592 },\n { x: 0.000006192999999999444, y: -0.023087577275717534 },\n { x: 0.000006193999999999444, y: -0.0062885114809384385 },\n { x: 0.0000061949999999994435, y: 0.0029734317892141926 },\n { x: 0.000006195999999999443, y: -0.018432320432132325 },\n { x: 0.000006196999999999443, y: -0.02044484339534021 },\n { x: 0.0000061979999999994424, y: -0.05524268797754462 },\n { x: 0.000006198999999999442, y: -0.01616206543846683 },\n { x: 0.000006199999999999442, y: -0.0660092748979551 },\n { x: 0.000006200999999999441, y: -0.043690714667203645 },\n { x: 0.000006201999999999441, y: 0.0005316744198725146 },\n { x: 0.000006202999999999441, y: -0.007726714545605293 },\n { x: 0.00000620399999999944, y: -0.025821057885985852 },\n { x: 0.00000620499999999944, y: -0.047793671931128115 },\n { x: 0.00000620599999999944, y: -0.036176341540212445 },\n { x: 0.000006206999999999439, y: -0.0005281434926095938 },\n { x: 0.000006207999999999439, y: 0.005280965406241886 },\n { x: 0.000006208999999999439, y: -0.03658752024839781 },\n { x: 0.000006209999999999438, y: -0.04332716128611916 },\n { x: 0.000006210999999999438, y: -0.01151454028331448 },\n { x: 0.0000062119999999994376, y: -0.018395043001853198 },\n { x: 0.000006212999999999437, y: -0.02047205895566663 },\n { x: 0.000006213999999999437, y: -0.02252945567323992 },\n { x: 0.0000062149999999994365, y: -0.06240499792806903 },\n { x: 0.000006215999999999436, y: 0.00648225610971153 },\n { x: 0.000006216999999999436, y: -0.039318949536063116 },\n { x: 0.0000062179999999994355, y: -0.03008399199088066 },\n { x: 0.000006218999999999435, y: -0.022827312865908077 },\n { x: 0.000006219999999999435, y: 0.01553383083541247 },\n { x: 0.000006220999999999434, y: -0.04772180874630108 },\n { x: 0.000006221999999999434, y: -0.0218651671967387 },\n { x: 0.000006222999999999434, y: 0.015627368398890503 },\n { x: 0.000006223999999999433, y: -0.033863501618150056 },\n { x: 0.000006224999999999433, y: -0.05142512187465838 },\n { x: 0.000006225999999999433, y: -0.024525679656994415 },\n { x: 0.000006226999999999432, y: -0.029933055501078006 },\n { x: 0.000006227999999999432, y: 0.017709236119990538 },\n { x: 0.000006228999999999432, y: 0.032830646026470234 },\n { x: 0.000006229999999999431, y: -0.006292817213284833 },\n { x: 0.000006230999999999431, y: 0.04274711680024851 },\n { x: 0.000006231999999999431, y: -0.004621319415502218 },\n { x: 0.00000623299999999943, y: -0.03529803826118595 },\n { x: 0.00000623399999999943, y: -0.05326253515735846 },\n { x: 0.0000062349999999994295, y: -0.003763221811630803 },\n { x: 0.000006235999999999429, y: -0.044672810441032704 },\n { x: 0.000006236999999999429, y: 0.019714391381036284 },\n { x: 0.0000062379999999994285, y: -0.03739961058201955 },\n { x: 0.000006238999999999428, y: 0.00957567309624037 },\n { x: 0.000006239999999999428, y: 0.04954639406154087 },\n { x: 0.0000062409999999994275, y: -0.014630374805613326 },\n { x: 0.000006241999999999427, y: -0.032937682650552684 },\n { x: 0.000006242999999999427, y: -0.04948639298080569 },\n { x: 0.000006243999999999426, y: -0.004792318799029234 },\n { x: 0.000006244999999999426, y: -0.046479392312515626 },\n { x: 0.000006245999999999426, y: -0.011264634234860854 },\n { x: 0.000006246999999999425, y: -0.014911368466185163 },\n { x: 0.000006247999999999425, y: -0.04981474697331012 },\n { x: 0.000006248999999999425, y: 0.01718150965874051 },\n { x: 0.000006249999999999424, y: 0.0037642021802506316 },\n { x: 0.000006250999999999424, y: -0.03213642386686262 },\n { x: 0.000006251999999999424, y: -0.029888384412366176 },\n { x: 0.000006252999999999423, y: 0.025331378677488605 },\n { x: 0.000006253999999999423, y: 0.010734927526340159 },\n { x: 0.0000062549999999994226, y: -0.0329527975762178 },\n { x: 0.000006255999999999422, y: -0.00944377877904363 },\n { x: 0.000006256999999999422, y: 0.011207288700537566 },\n { x: 0.0000062579999999994215, y: -0.007036597753970956 },\n { x: 0.000006258999999999421, y: -0.010211809680283892 },\n { x: 0.000006259999999999421, y: -0.0421563741401429 },\n { x: 0.0000062609999999994205, y: -0.02854895931348529 },\n { x: 0.00000626199999999942, y: -0.03452037275224883 },\n { x: 0.00000626299999999942, y: -0.021440287476734175 },\n { x: 0.0000062639999999994194, y: -0.03461588419029308 },\n { x: 0.000006264999999999419, y: -0.0024473477206832786 },\n { x: 0.000006265999999999419, y: 0.01676531067551041 },\n { x: 0.000006266999999999418, y: -0.04142183114342354 },\n { x: 0.000006267999999999418, y: 0.012906225146261406 },\n { x: 0.000006268999999999418, y: 0.00871623455383652 },\n { x: 0.000006269999999999417, y: 0.0327525113744227 },\n { x: 0.000006270999999999417, y: 0.012634596216380758 },\n { x: 0.000006271999999999417, y: -0.004471361206095677 },\n { x: 0.000006272999999999416, y: 0.022235699241061682 },\n { x: 0.000006273999999999416, y: -0.015460051710681284 },\n { x: 0.000006274999999999416, y: -0.039800856084212195 },\n { x: 0.000006275999999999415, y: 0.02039043169491328 },\n { x: 0.000006276999999999415, y: 0.012965836879122493 },\n { x: 0.0000062779999999994146, y: -0.01574741264741996 },\n { x: 0.000006278999999999414, y: 0.008013891479229642 },\n { x: 0.000006279999999999414, y: 0.03262042437051343 },\n { x: 0.0000062809999999994135, y: -0.011461677312809816 },\n { x: 0.000006281999999999413, y: -0.007769264021925711 },\n { x: 0.000006282999999999413, y: 0.012149333912136549 },\n { x: 0.0000062839999999994125, y: -0.03700208474630407 },\n { x: 0.000006284999999999412, y: 0.0007334236415029897 },\n { x: 0.000006285999999999412, y: 0.00926810142370388 },\n { x: 0.0000062869999999994114, y: 0.022648380989877325 },\n { x: 0.000006287999999999411, y: 0.010036614614791568 },\n { x: 0.000006288999999999411, y: 0.02834182316130422 },\n { x: 0.00000628999999999941, y: -0.008599540871145122 },\n { x: 0.00000629099999999941, y: -0.03115852858676202 },\n { x: 0.00000629199999999941, y: 0.038131686769695486 },\n { x: 0.000006292999999999409, y: 0.017719369456522506 },\n { x: 0.000006293999999999409, y: 0.036164584579017556 },\n { x: 0.000006294999999999409, y: -0.014620831781571971 },\n { x: 0.000006295999999999408, y: 0.004998727591320388 },\n { x: 0.000006296999999999408, y: -0.01017844762370505 },\n { x: 0.000006297999999999408, y: 0.01071381513663041 },\n { x: 0.000006298999999999407, y: 0.04278492449907748 },\n { x: 0.000006299999999999407, y: 0.03008088671584024 },\n { x: 0.0000063009999999994065, y: 0.0020033693985619036 },\n { x: 0.000006301999999999406, y: 0.0161516417511956 },\n { x: 0.000006302999999999406, y: 0.027933748220420704 },\n { x: 0.0000063039999999994055, y: 0.039118929286455724 },\n { x: 0.000006304999999999405, y: 0.03560948953988753 },\n { x: 0.000006305999999999405, y: 0.03010847957597074 },\n { x: 0.0000063069999999994045, y: 0.03625953950562536 },\n { x: 0.000006307999999999404, y: 0.02355699596041319 },\n { x: 0.000006308999999999404, y: 0.019189500489196782 },\n { x: 0.000006309999999999403, y: -0.016290889862414015 },\n { x: 0.000006310999999999403, y: -0.0040482488010917025 },\n { x: 0.000006311999999999403, y: -0.004030568391539709 },\n { x: 0.000006312999999999402, y: 0.03817525695631252 },\n { x: 0.000006313999999999402, y: 0.021862622227764552 },\n { x: 0.000006314999999999402, y: -0.026376856506003223 },\n { x: 0.000006315999999999401, y: 0.03885425263467728 },\n { x: 0.000006316999999999401, y: -0.009070015586960224 },\n { x: 0.000006317999999999401, y: -0.0162281447276042 },\n { x: 0.0000063189999999994, y: 0.049778850842657325 },\n { x: 0.0000063199999999994, y: 0.03628928349058779 },\n { x: 0.0000063209999999994, y: 0.005456333407054057 },\n { x: 0.000006321999999999399, y: -0.0030741798448190825 },\n { x: 0.000006322999999999399, y: 0.002075695179680896 },\n { x: 0.0000063239999999993985, y: 0.02969728024478644 },\n { x: 0.000006324999999999398, y: 0.0027210731525679453 },\n { x: 0.000006325999999999398, y: -0.01342455122082064 },\n { x: 0.0000063269999999993975, y: 0.03869715895703062 },\n { x: 0.000006327999999999397, y: 0.04467398883471892 },\n { x: 0.000006328999999999397, y: -0.010345809247537823 },\n { x: 0.0000063299999999993964, y: -0.016289646265897136 },\n { x: 0.000006330999999999396, y: -0.008667939794200268 },\n { x: 0.000006331999999999396, y: 0.02945874970557589 },\n { x: 0.000006332999999999395, y: 0.010308575744073002 },\n { x: 0.000006333999999999395, y: 0.027931222627961515 },\n { x: 0.000006334999999999395, y: 0.031327387226426584 },\n { x: 0.000006335999999999394, y: -0.01496415014939505 },\n { x: 0.000006336999999999394, y: -0.006543738528045833 },\n { x: 0.000006337999999999394, y: -0.0021667859050321335 },\n { x: 0.000006338999999999393, y: 0.013527827150638171 },\n { x: 0.000006339999999999393, y: -0.013649883552325867 },\n { x: 0.000006340999999999393, y: 0.0047125368075670235 },\n { x: 0.000006341999999999392, y: 0.018327620062022834 },\n { x: 0.000006342999999999392, y: 0.01006183724561431 },\n { x: 0.0000063439999999993916, y: 0.017456612562905347 },\n { x: 0.000006344999999999391, y: -0.013522434269681884 },\n { x: 0.000006345999999999391, y: 0.04479244813586061 },\n { x: 0.0000063469999999993905, y: 0.027447948313374212 },\n { x: 0.00000634799999999939, y: -0.015140239180625101 },\n { x: 0.00000634899999999939, y: -0.012150445418913226 },\n { x: 0.0000063499999999993895, y: 0.05186206185461248 },\n { x: 0.000006350999999999389, y: 0.03183216012449015 },\n { x: 0.000006351999999999389, y: 0.0332760109182465 },\n { x: 0.0000063529999999993884, y: 0.0487466867858228 },\n { x: 0.000006353999999999388, y: 0.008306739164387187 },\n { x: 0.000006354999999999388, y: 0.047476756131428016 },\n { x: 0.000006355999999999387, y: 0.021312453106249796 },\n { x: 0.000006356999999999387, y: 0.024162952247484788 },\n { x: 0.000006357999999999387, y: 0.0426354306429191 },\n { x: 0.000006358999999999386, y: -0.004766373901188177 },\n { x: 0.000006359999999999386, y: 0.00904997452147054 },\n { x: 0.000006360999999999386, y: 0.01011358777751506 },\n { x: 0.000006361999999999385, y: 0.058121108359806134 },\n { x: 0.000006362999999999385, y: 0.003551169816425368 },\n { x: 0.000006363999999999385, y: 0.05545298154996432 },\n { x: 0.000006364999999999384, y: 0.05771780639184556 },\n { x: 0.000006365999999999384, y: 0.01661106697210214 },\n { x: 0.0000063669999999993836, y: 0.014710240260772868 },\n { x: 0.000006367999999999383, y: 0.020918922991702345 },\n { x: 0.000006368999999999383, y: -0.006097685184978951 },\n { x: 0.0000063699999999993825, y: 0.061594873064644846 },\n { x: 0.000006370999999999382, y: 0.03607071739159255 },\n { x: 0.000006371999999999382, y: -0.007108082073094737 },\n { x: 0.0000063729999999993815, y: 0.03907658351584181 },\n { x: 0.000006373999999999381, y: 0.012717522769924498 },\n { x: 0.000006374999999999381, y: 0.0001813679474672522 },\n { x: 0.00000637599999999938, y: 0.041656031454756194 },\n { x: 0.00000637699999999938, y: 0.052805909789579816 },\n { x: 0.00000637799999999938, y: 0.03672561100600775 },\n { x: 0.000006378999999999379, y: 0.025426646161620676 },\n { x: 0.000006379999999999379, y: 0.004888598356866586 },\n { x: 0.000006380999999999379, y: 0.026636402772328042 },\n { x: 0.000006381999999999378, y: 0.012314934333584958 },\n { x: 0.000006382999999999378, y: 0.048075033771409384 },\n { x: 0.000006383999999999378, y: -0.002893267211374388 },\n { x: 0.000006384999999999377, y: 0.010925616580244515 },\n { x: 0.000006385999999999377, y: 0.038065937825059966 },\n { x: 0.000006386999999999377, y: 0.03950677197835536 },\n { x: 0.000006387999999999376, y: 0.041131985780472176 },\n { x: 0.000006388999999999376, y: 0.006024632580920293 },\n { x: 0.0000063899999999993755, y: 0.03501281549943028 },\n { x: 0.000006390999999999375, y: 0.05792289297258767 },\n { x: 0.000006391999999999375, y: 0.03526323152376286 },\n { x: 0.0000063929999999993745, y: 0.043037819213868775 },\n { x: 0.000006393999999999374, y: 0.030099990295969135 },\n { x: 0.000006394999999999374, y: 0.004398436578855719 },\n { x: 0.0000063959999999993735, y: 0.051071036389301494 },\n { x: 0.000006396999999999373, y: 0.04343454898694269 },\n { x: 0.000006397999999999373, y: 0.02044347068979022 },\n { x: 0.000006398999999999372, y: 0.033810450510320327 },\n { x: 0.000006399999999999372, y: 0.03252325465738688 },\n { x: 0.000006400999999999372, y: 0.028695652313051614 },\n { x: 0.000006401999999999371, y: -0.002044103682097148 },\n { x: 0.000006402999999999371, y: 0.01993094001088715 },\n { x: 0.000006403999999999371, y: 0.013681965615391374 },\n { x: 0.00000640499999999937, y: 0.06724252224929395 },\n { x: 0.00000640599999999937, y: 0.042511897265260445 },\n { x: 0.00000640699999999937, y: 0.03798808817135716 },\n { x: 0.000006407999999999369, y: 0.018216638564458286 },\n { x: 0.000006408999999999369, y: 0.021257935271128067 },\n { x: 0.0000064099999999993686, y: 0.02820020082800031 },\n { x: 0.000006410999999999368, y: 0.01688344762984088 },\n { x: 0.000006411999999999368, y: 0.03306973531724155 },\n { x: 0.0000064129999999993675, y: 0.04641983065822221 },\n { x: 0.000006413999999999367, y: 0.07475868871591632 },\n { x: 0.000006414999999999367, y: 0.07426329251613269 },\n { x: 0.0000064159999999993665, y: 0.043962503596020844 },\n { x: 0.000006416999999999366, y: 0.07571839537353463 },\n { x: 0.000006417999999999366, y: 0.017973350060461173 },\n { x: 0.0000064189999999993654, y: 0.01690186384147821 },\n { x: 0.000006419999999999365, y: 0.057118765479222414 },\n { x: 0.000006420999999999365, y: 0.05263133167303674 },\n { x: 0.000006421999999999364, y: 0.005581214091007286 },\n { x: 0.000006422999999999364, y: 0.02609731318375393 },\n { x: 0.000006423999999999364, y: 0.042939697597900464 },\n { x: 0.000006424999999999363, y: 0.005542101812976444 },\n { x: 0.000006425999999999363, y: 0.011837490370590422 },\n { x: 0.000006426999999999363, y: 0.0629309599090829 },\n { x: 0.000006427999999999362, y: 0.04257522721475675 },\n { x: 0.000006428999999999362, y: 0.07225775922170688 },\n { x: 0.000006429999999999362, y: 0.04642612825044807 },\n { x: 0.000006430999999999361, y: 0.043931850609426566 },\n { x: 0.000006431999999999361, y: 0.004367297429254423 },\n { x: 0.0000064329999999993606, y: 0.056722822136098125 },\n { x: 0.00000643399999999936, y: 0.005191215344177845 },\n { x: 0.00000643499999999936, y: 0.04614752879384501 },\n { x: 0.0000064359999999993595, y: 0.028597820859081757 },\n { x: 0.000006436999999999359, y: 0.05936524529405696 },\n { x: 0.000006437999999999359, y: 0.027490048232724166 },\n { x: 0.0000064389999999993585, y: 0.03374053222803882 },\n { x: 0.000006439999999999358, y: 0.055492541226114404 },\n { x: 0.000006440999999999358, y: 0.06483997765893532 },\n { x: 0.0000064419999999993574, y: 0.03814209677039398 },\n { x: 0.000006442999999999357, y: 0.051603366202904476 },\n { x: 0.000006443999999999357, y: 0.07797460461593173 },\n { x: 0.000006444999999999356, y: 0.05991075958900212 },\n { x: 0.000006445999999999356, y: 0.009144203536065869 },\n { x: 0.000006446999999999356, y: 0.03761598671213768 },\n { x: 0.000006447999999999355, y: 0.04400307042006278 },\n { x: 0.000006448999999999355, y: 0.054343530798096264 },\n { x: 0.000006449999999999355, y: 0.04820793455182021 },\n { x: 0.000006450999999999354, y: 0.048293677648373896 },\n { x: 0.000006451999999999354, y: 0.042585122472547976 },\n { x: 0.000006452999999999354, y: 0.017837085006395623 },\n { x: 0.000006453999999999353, y: 0.02339220972470029 },\n { x: 0.000006454999999999353, y: 0.07962588863827288 },\n { x: 0.0000064559999999993525, y: 0.06350196743297971 },\n { x: 0.000006456999999999352, y: 0.022830411206015533 },\n { x: 0.000006457999999999352, y: 0.06857160814664562 },\n { x: 0.0000064589999999993515, y: 0.08466158553510278 },\n { x: 0.000006459999999999351, y: 0.049805944064092195 },\n { x: 0.000006460999999999351, y: 0.08957688388242513 },\n { x: 0.0000064619999999993505, y: 0.0595226900692198 },\n { x: 0.00000646299999999935, y: 0.0699461360292879 },\n { x: 0.00000646399999999935, y: 0.046784319538738975 },\n { x: 0.000006464999999999349, y: 0.038014012120854146 },\n { x: 0.000006465999999999349, y: 0.05340638341992883 },\n { x: 0.000006466999999999349, y: 0.04043982395822764 },\n { x: 0.000006467999999999348, y: 0.08119226395004789 },\n { x: 0.000006468999999999348, y: 0.06877083413639104 },\n { x: 0.000006469999999999348, y: 0.015111160079450445 },\n { x: 0.000006470999999999347, y: 0.06029445773901031 },\n { x: 0.000006471999999999347, y: 0.04153305955100414 },\n { x: 0.000006472999999999347, y: 0.08087264443846903 },\n { x: 0.000006473999999999346, y: 0.017638697818553248 },\n { x: 0.000006474999999999346, y: 0.01814617742324092 },\n { x: 0.000006475999999999346, y: 0.058548952483776076 },\n { x: 0.000006476999999999345, y: 0.08672984577456241 },\n { x: 0.000006477999999999345, y: 0.017158621632537424 },\n { x: 0.0000064789999999993445, y: 0.04991058438379043 },\n { x: 0.000006479999999999344, y: 0.01912097501408188 },\n { x: 0.000006480999999999344, y: 0.034448221553927474 },\n { x: 0.0000064819999999993435, y: 0.031024618368766646 },\n { x: 0.000006482999999999343, y: 0.037922460299426995 },\n { x: 0.000006483999999999343, y: 0.02241148332962326 },\n { x: 0.0000064849999999993424, y: 0.034644909699168405 },\n { x: 0.000006485999999999342, y: 0.053251671144949705 },\n { x: 0.000006486999999999342, y: 0.08472635728861705 },\n { x: 0.000006487999999999341, y: 0.06592290887966977 },\n { x: 0.000006488999999999341, y: 0.08975219712191326 },\n { x: 0.000006489999999999341, y: 0.03711750915353171 },\n { x: 0.00000649099999999934, y: 0.08084597956526815 },\n { x: 0.00000649199999999934, y: 0.05367095367526733 },\n { x: 0.00000649299999999934, y: 0.023859798611992323 },\n { x: 0.000006493999999999339, y: 0.02445094556818196 },\n { x: 0.000006494999999999339, y: 0.058076718515805696 },\n { x: 0.000006495999999999339, y: 0.024087309043638257 },\n { x: 0.000006496999999999338, y: 0.017526350786061143 },\n { x: 0.000006497999999999338, y: 0.08816713968177811 },\n { x: 0.0000064989999999993376, y: 0.05780687646762531 },\n { x: 0.000006499999999999337, y: 0.021337911181062305 },\n { x: 0.000006500999999999337, y: 0.02666993284336484 },\n { x: 0.0000065019999999993365, y: 0.06613551085635809 },\n { x: 0.000006502999999999336, y: 0.0202143940581656 },\n { x: 0.000006503999999999336, y: 0.029377065763703823 },\n { x: 0.0000065049999999993355, y: 0.018441324592165874 },\n { x: 0.000006505999999999335, y: 0.06223105463837809 },\n { x: 0.000006506999999999335, y: 0.06157090510868055 },\n { x: 0.0000065079999999993344, y: 0.017371589196941872 },\n { x: 0.000006508999999999334, y: 0.05776934145479441 },\n { x: 0.000006509999999999334, y: 0.06657347622717026 },\n { x: 0.000006510999999999333, y: 0.061318227794359234 },\n { x: 0.000006511999999999333, y: 0.07927582001251911 },\n { x: 0.000006512999999999333, y: 0.04814067769189442 },\n { x: 0.000006513999999999332, y: 0.06302755705110645 },\n { x: 0.000006514999999999332, y: 0.06596573076238843 },\n { x: 0.000006515999999999332, y: 0.03220270087148301 },\n { x: 0.000006516999999999331, y: 0.06211336414397774 },\n { x: 0.000006517999999999331, y: 0.07394601986110182 },\n { x: 0.000006518999999999331, y: 0.046239376959757876 },\n { x: 0.00000651999999999933, y: 0.02831218393796916 },\n { x: 0.00000652099999999933, y: 0.05304531000203788 },\n { x: 0.0000065219999999993296, y: 0.08922820058026253 },\n { x: 0.000006522999999999329, y: 0.05124316427105455 },\n { x: 0.000006523999999999329, y: 0.07627591101950841 },\n { x: 0.0000065249999999993285, y: 0.08066360506042243 },\n { x: 0.000006525999999999328, y: 0.07179380147369352 },\n { x: 0.000006526999999999328, y: 0.02480687957884062 },\n { x: 0.0000065279999999993275, y: 0.021273755837011084 },\n { x: 0.000006528999999999327, y: 0.07489078778425956 },\n { x: 0.000006529999999999327, y: 0.06088030469798052 },\n { x: 0.000006530999999999326, y: 0.03577063247838755 },\n { x: 0.000006531999999999326, y: 0.05945664488266624 },\n { x: 0.000006532999999999326, y: 0.09035637680538935 },\n { x: 0.000006533999999999325, y: 0.02843309567054169 },\n { x: 0.000006534999999999325, y: 0.048816212640917386 },\n { x: 0.000006535999999999325, y: 0.07913516249179729 },\n { x: 0.000006536999999999324, y: 0.07981189797965058 },\n { x: 0.000006537999999999324, y: 0.03664013490074804 },\n { x: 0.000006538999999999324, y: 0.08159447413230068 },\n { x: 0.000006539999999999323, y: 0.06426443283240951 },\n { x: 0.000006540999999999323, y: 0.020297878311369512 },\n { x: 0.000006541999999999323, y: 0.035898410098152936 },\n { x: 0.000006542999999999322, y: 0.0831971012431946 },\n { x: 0.000006543999999999322, y: 0.05708443488769442 },\n { x: 0.0000065449999999993215, y: 0.08713593364779015 },\n { x: 0.000006545999999999321, y: 0.04202631502534762 },\n { x: 0.000006546999999999321, y: 0.05461769354692221 },\n { x: 0.0000065479999999993205, y: 0.0179019812571889 },\n { x: 0.00000654899999999932, y: 0.0875155514401971 },\n { x: 0.00000654999999999932, y: 0.06425957959897101 },\n { x: 0.0000065509999999993195, y: 0.046251172923622776 },\n { x: 0.000006551999999999319, y: 0.029980503464713173 },\n { x: 0.000006552999999999319, y: 0.02893852916696471 },\n { x: 0.000006553999999999318, y: 0.07324678748096107 },\n { x: 0.000006554999999999318, y: 0.05128337684142053 },\n { x: 0.000006555999999999318, y: 0.035600802250349686 },\n { x: 0.000006556999999999317, y: 0.03443441481874935 },\n { x: 0.000006557999999999317, y: 0.07770959676123096 },\n { x: 0.000006558999999999317, y: 0.06740239748346287 },\n { x: 0.000006559999999999316, y: 0.07194445106461768 },\n { x: 0.000006560999999999316, y: 0.04722084254496357 },\n { x: 0.000006561999999999316, y: 0.09140163212467195 },\n { x: 0.000006562999999999315, y: 0.05132117729427984 },\n { x: 0.000006563999999999315, y: 0.07033220137084278 },\n { x: 0.0000065649999999993146, y: 0.040721305381931514 },\n { x: 0.000006565999999999314, y: 0.08303297882519378 },\n { x: 0.000006566999999999314, y: 0.07719776614074321 },\n { x: 0.0000065679999999993135, y: 0.03907063497194076 },\n { x: 0.000006568999999999313, y: 0.04572476870854561 },\n { x: 0.000006569999999999313, y: 0.08706548161918992 },\n { x: 0.0000065709999999993125, y: 0.04209809238424989 },\n { x: 0.000006571999999999312, y: 0.0542282542306921 },\n { x: 0.000006572999999999312, y: 0.06573974563496592 },\n { x: 0.0000065739999999993114, y: 0.07446134294254575 },\n { x: 0.000006574999999999311, y: 0.03838098283029383 },\n { x: 0.000006575999999999311, y: 0.061309893813799095 },\n { x: 0.00000657699999999931, y: 0.020204260388163253 },\n { x: 0.00000657799999999931, y: 0.02446463378367484 },\n { x: 0.00000657899999999931, y: 0.08037963567040077 },\n { x: 0.000006579999999999309, y: 0.027176270448606276 },\n { x: 0.000006580999999999309, y: 0.031547539426840715 },\n { x: 0.000006581999999999309, y: 0.06215955811940999 },\n { x: 0.000006582999999999308, y: 0.03308332315323817 },\n { x: 0.000006583999999999308, y: 0.04132478439500193 },\n { x: 0.000006584999999999308, y: 0.019064010549246883 },\n { x: 0.000006585999999999307, y: 0.020763900921007133 },\n { x: 0.000006586999999999307, y: 0.06315736507988125 },\n { x: 0.0000065879999999993066, y: 0.058280426933191694 },\n { x: 0.000006588999999999306, y: 0.08397856946697094 },\n { x: 0.000006589999999999306, y: 0.028718799199745567 },\n { x: 0.0000065909999999993055, y: 0.025324353945128678 },\n { x: 0.000006591999999999305, y: 0.034153840975273374 },\n { x: 0.000006592999999999305, y: 0.08458276502145204 },\n { x: 0.0000065939999999993045, y: 0.03142737887232128 },\n { x: 0.000006594999999999304, y: 0.02270915920406931 },\n { x: 0.000006595999999999304, y: 0.08934022619419905 },\n { x: 0.0000065969999999993034, y: 0.059282199100881824 },\n { x: 0.000006597999999999303, y: 0.09098396719235749 },\n { x: 0.000006598999999999303, y: 0.09327598186609257 },\n { x: 0.000006599999999999302, y: 0.05000674571010387 },\n { x: 0.000006600999999999302, y: 0.09278398603928825 },\n { x: 0.000006601999999999302, y: 0.05872084558411532 },\n { x: 0.000006602999999999301, y: 0.06528783711110878 },\n { x: 0.000006603999999999301, y: 0.04678761566839875 },\n { x: 0.000006604999999999301, y: 0.018555520444162858 },\n { x: 0.0000066059999999993, y: 0.022593591084810995 },\n { x: 0.0000066069999999993, y: 0.05803950729103298 },\n { x: 0.0000066079999999993, y: 0.025626477168597714 },\n { x: 0.000006608999999999299, y: 0.08070960098879633 },\n { x: 0.000006609999999999299, y: 0.08876092346981428 },\n { x: 0.0000066109999999992985, y: 0.019714923115309153 },\n { x: 0.000006611999999999298, y: 0.03655315394470019 },\n { x: 0.000006612999999999298, y: 0.058768526726104435 },\n { x: 0.0000066139999999992975, y: 0.08300652299730556 },\n { x: 0.000006614999999999297, y: 0.0812212686994408 },\n { x: 0.000006615999999999297, y: 0.08235875837698083 },\n { x: 0.0000066169999999992965, y: 0.04228075088395904 },\n { x: 0.000006617999999999296, y: 0.03793583328953068 },\n { x: 0.000006618999999999296, y: 0.04315415158681671 },\n { x: 0.000006619999999999295, y: 0.03726565522943924 },\n { x: 0.000006620999999999295, y: 0.08070669759231866 },\n { x: 0.000006621999999999295, y: 0.07769573251050269 },\n { x: 0.000006622999999999294, y: 0.08921752241973921 },\n { x: 0.000006623999999999294, y: 0.03128238110072391 },\n { x: 0.000006624999999999294, y: 0.01721029167577493 },\n { x: 0.000006625999999999293, y: 0.05723544751758841 },\n { x: 0.000006626999999999293, y: 0.051881128344731825 },\n { x: 0.000006627999999999293, y: 0.05217879659141306 },\n { x: 0.000006628999999999292, y: 0.04549704026830262 },\n { x: 0.000006629999999999292, y: 0.02669185959900858 },\n { x: 0.000006630999999999292, y: 0.03479811617691764 },\n { x: 0.000006631999999999291, y: 0.03951184780065229 },\n { x: 0.000006632999999999291, y: 0.029993099850985402 },\n { x: 0.0000066339999999992905, y: 0.018476396861959607 },\n { x: 0.00000663499999999929, y: 0.028381656121401238 },\n { x: 0.00000663599999999929, y: 0.027331687982021808 },\n { x: 0.0000066369999999992895, y: 0.026186655466722067 },\n { x: 0.000006637999999999289, y: 0.06741028807470141 },\n { x: 0.000006638999999999289, y: 0.029068371511625574 },\n { x: 0.0000066399999999992884, y: 0.036151874573342846 },\n { x: 0.000006640999999999288, y: 0.015071383618725176 },\n { x: 0.000006641999999999288, y: 0.08487926903570259 },\n { x: 0.000006642999999999287, y: 0.06660559132040406 },\n { x: 0.000006643999999999287, y: 0.05126897759859051 },\n { x: 0.000006644999999999287, y: 0.09044476978706817 },\n { x: 0.000006645999999999286, y: 0.02828579676115864 },\n { x: 0.000006646999999999286, y: 0.047062694483223165 },\n { x: 0.000006647999999999286, y: 0.02140772230832292 },\n { x: 0.000006648999999999285, y: 0.025325084247527562 },\n { x: 0.000006649999999999285, y: 0.027481744685395403 },\n { x: 0.000006650999999999285, y: 0.06800732863448657 },\n { x: 0.000006651999999999284, y: 0.03582835183822167 },\n { x: 0.000006652999999999284, y: 0.022237280687866536 },\n { x: 0.0000066539999999992836, y: 0.05978459112406473 },\n { x: 0.000006654999999999283, y: 0.04967244341369067 },\n { x: 0.000006655999999999283, y: 0.05787677592480175 },\n { x: 0.0000066569999999992825, y: 0.03604175383411775 },\n { x: 0.000006657999999999282, y: 0.040042575886865904 },\n { x: 0.000006658999999999282, y: 0.05066170268338957 },\n { x: 0.0000066599999999992815, y: 0.01270411777358288 },\n { x: 0.000006660999999999281, y: 0.06971884054768734 },\n { x: 0.000006661999999999281, y: 0.07718505234861876 },\n { x: 0.0000066629999999992804, y: 0.05218504220622441 },\n { x: 0.00000666399999999928, y: 0.06976560288814769 },\n { x: 0.00000666499999999928, y: 0.05667453203715078 },\n { x: 0.000006665999999999279, y: 0.026637864211289546 },\n { x: 0.000006666999999999279, y: 0.07519020661049906 },\n { x: 0.000006667999999999279, y: 0.03373591851412544 },\n { x: 0.000006668999999999278, y: 0.05871875329735457 },\n { x: 0.000006669999999999278, y: 0.05249226260424004 },\n { x: 0.000006670999999999278, y: 0.03008402386118704 },\n { x: 0.000006671999999999277, y: 0.023328607461390958 },\n { x: 0.000006672999999999277, y: 0.05052351388118914 },\n { x: 0.000006673999999999277, y: 0.08731694211060591 },\n { x: 0.000006674999999999276, y: 0.08250853749163618 },\n { x: 0.000006675999999999276, y: 0.02117759276123988 },\n { x: 0.0000066769999999992756, y: 0.010891706143290658 },\n { x: 0.000006677999999999275, y: 0.0743095804781936 },\n { x: 0.000006678999999999275, y: 0.03514161377413789 },\n { x: 0.0000066799999999992745, y: 0.04290460582264214 },\n { x: 0.000006680999999999274, y: 0.0813064144386495 },\n { x: 0.000006681999999999274, y: 0.034322107441752826 },\n { x: 0.0000066829999999992735, y: 0.02911906667974212 },\n { x: 0.000006683999999999273, y: 0.026817545285668366 },\n { x: 0.000006684999999999273, y: 0.07765401239167519 },\n { x: 0.000006685999999999272, y: 0.047932422257283294 },\n { x: 0.000006686999999999272, y: 0.046723730309280315 },\n { x: 0.000006687999999999272, y: 0.04308656863496711 },\n { x: 0.000006688999999999271, y: 0.05012884966660961 },\n { x: 0.000006689999999999271, y: 0.008701059997465281 },\n { x: 0.000006690999999999271, y: 0.06565977025752676 },\n { x: 0.00000669199999999927, y: 0.02701788291748621 },\n { x: 0.00000669299999999927, y: 0.01842089123992971 },\n { x: 0.00000669399999999927, y: 0.03175556372572317 },\n { x: 0.000006694999999999269, y: 0.013144581379584859 },\n { x: 0.000006695999999999269, y: 0.010171445506706185 },\n { x: 0.000006696999999999269, y: 0.030494140203653847 },\n { x: 0.000006697999999999268, y: 0.019168412713673515 },\n { x: 0.000006698999999999268, y: 0.0588775391951756 },\n { x: 0.0000066999999999992675, y: 0.03947080348248387 },\n { x: 0.000006700999999999267, y: 0.04550236618292305 },\n { x: 0.000006701999999999267, y: 0.07513724035404296 },\n { x: 0.0000067029999999992665, y: 0.03954867149756552 },\n { x: 0.000006703999999999266, y: 0.0783492925058698 },\n { x: 0.000006704999999999266, y: 0.06201981178776182 },\n { x: 0.0000067059999999992655, y: 0.04663040394064163 },\n { x: 0.000006706999999999265, y: 0.06349328099601786 },\n { x: 0.000006707999999999265, y: 0.026975515351521415 },\n { x: 0.000006708999999999264, y: 0.06090891113693787 },\n { x: 0.000006709999999999264, y: 0.049654131230544914 },\n { x: 0.000006710999999999264, y: 0.022851119502501172 },\n { x: 0.000006711999999999263, y: 0.02088492254177188 },\n { x: 0.000006712999999999263, y: 0.055585485915697765 },\n { x: 0.000006713999999999263, y: 0.025296312557243728 },\n { x: 0.000006714999999999262, y: 0.03849650518682331 },\n { x: 0.000006715999999999262, y: 0.0077917455698893814 },\n { x: 0.000006716999999999262, y: 0.07835032188240443 },\n { x: 0.000006717999999999261, y: 0.027770170367717714 },\n { x: 0.000006718999999999261, y: 0.06066201906908342 },\n { x: 0.0000067199999999992606, y: 0.030517901043739547 },\n { x: 0.00000672099999999926, y: 0.056499144242581636 },\n { x: 0.00000672199999999926, y: 0.064113522345825 },\n { x: 0.0000067229999999992595, y: 0.016975226568704843 },\n { x: 0.000006723999999999259, y: 0.07211764817401575 },\n { x: 0.000006724999999999259, y: 0.03542128610406134 },\n { x: 0.0000067259999999992585, y: 0.012672806144716445 },\n { x: 0.000006726999999999258, y: 0.01129136696600895 },\n { x: 0.000006727999999999258, y: 0.02398171387662073 },\n { x: 0.0000067289999999992574, y: 0.035609124528916826 },\n { x: 0.000006729999999999257, y: 0.049748607478066004 },\n { x: 0.000006730999999999257, y: 0.016746402290466342 },\n { x: 0.000006731999999999256, y: 0.011479534279205578 },\n { x: 0.000006732999999999256, y: 0.06833964599564195 },\n { x: 0.000006733999999999256, y: 0.05494567726464046 },\n { x: 0.000006734999999999255, y: 0.027107804797420584 },\n { x: 0.000006735999999999255, y: 0.03646251899572257 },\n { x: 0.000006736999999999255, y: 0.025826576927660015 },\n { x: 0.000006737999999999254, y: 0.06451111298584158 },\n { x: 0.000006738999999999254, y: 0.0016097036867522008 },\n { x: 0.000006739999999999254, y: 0.07428619653831985 },\n { x: 0.000006740999999999253, y: 0.043591844627497496 },\n { x: 0.000006741999999999253, y: 0.03311659009320734 },\n { x: 0.0000067429999999992526, y: 0.06941286838123303 },\n { x: 0.000006743999999999252, y: 0.03392516106371307 },\n { x: 0.000006744999999999252, y: 0.032212252713333514 },\n { x: 0.0000067459999999992515, y: 0.06048286137249939 },\n { x: 0.000006746999999999251, y: 0.010777915386479618 },\n { x: 0.000006747999999999251, y: 0.06048817324618828 },\n { x: 0.0000067489999999992505, y: 0.06444034242208135 },\n { x: 0.00000674999999999925, y: 0.053981213931349026 },\n { x: 0.00000675099999999925, y: 0.05437619773877322 },\n { x: 0.0000067519999999992494, y: 0.06943790084777152 },\n { x: 0.000006752999999999249, y: 0.06523570785869741 },\n { x: 0.000006753999999999249, y: 0.0133220440000663 },\n { x: 0.000006754999999999248, y: 0.0022867206273653046 },\n { x: 0.000006755999999999248, y: 0.015295601262259817 },\n { x: 0.000006756999999999248, y: 0.014171319254136991 },\n { x: 0.000006757999999999247, y: 0.005827967405664533 },\n { x: 0.000006758999999999247, y: 0.052880339457167774 },\n { x: 0.000006759999999999247, y: 0.027459893341925327 },\n { x: 0.000006760999999999246, y: 0.027603399153189975 },\n { x: 0.000006761999999999246, y: 0.05125553579388497 },\n { x: 0.000006762999999999246, y: 0.04532808889035408 },\n { x: 0.000006763999999999245, y: 0.07762862013776534 },\n { x: 0.000006764999999999245, y: 0.00812835295241934 },\n { x: 0.0000067659999999992445, y: 0.05787835389487288 },\n { x: 0.000006766999999999244, y: 0.00005722166221922009 },\n { x: 0.000006767999999999244, y: 0.03574146792469127 },\n { x: 0.0000067689999999992435, y: 0.058573616765871375 },\n { x: 0.000006769999999999243, y: 0.02063964154661787 },\n { x: 0.000006770999999999243, y: 0.05624710737827152 },\n { x: 0.0000067719999999992425, y: 0.05159716825480599 },\n { x: 0.000006772999999999242, y: 0.03527082636897392 },\n { x: 0.000006773999999999242, y: 0.06259912319640658 },\n { x: 0.000006774999999999241, y: 0.03705860307566 },\n { x: 0.000006775999999999241, y: 0.06881709437562457 },\n { x: 0.000006776999999999241, y: 0.05255449916882394 },\n { x: 0.00000677799999999924, y: 0.049091532761753105 },\n { x: 0.00000677899999999924, y: 0.04330094639307208 },\n { x: 0.00000677999999999924, y: 0.06329856296844617 },\n { x: 0.000006780999999999239, y: 0.001152704587675725 },\n { x: 0.000006781999999999239, y: 0.01904415833388447 },\n { x: 0.000006782999999999239, y: 0.0004905545842852493 },\n { x: 0.000006783999999999238, y: 0.04994034461880081 },\n { x: 0.000006784999999999238, y: 0.011881267974021198 },\n { x: 0.000006785999999999238, y: -0.008485315716305689 },\n { x: 0.000006786999999999237, y: 0.03067615093788759 },\n { x: 0.000006787999999999237, y: 0.00829903377531432 },\n { x: 0.0000067889999999992365, y: 0.020878114894186305 },\n { x: 0.000006789999999999236, y: 0.03629258179828464 },\n { x: 0.000006790999999999236, y: -0.0033046148873569423 },\n { x: 0.0000067919999999992355, y: 0.05868112879294476 },\n { x: 0.000006792999999999235, y: 0.04006335820190326 },\n { x: 0.000006793999999999235, y: 0.05359167612394408 },\n { x: 0.0000067949999999992344, y: 0.03498120097746516 },\n { x: 0.000006795999999999234, y: 0.0048175227620432665 },\n { x: 0.000006796999999999234, y: -0.009611204817788231 },\n { x: 0.000006797999999999233, y: 0.008375485433662025 },\n { x: 0.000006798999999999233, y: 0.013118077844478588 },\n { x: 0.000006799999999999233, y: 0.053712378873269635 },\n { x: 0.000006800999999999232, y: 0.045323314761307194 },\n { x: 0.000006801999999999232, y: 0.022183757170687584 },\n { x: 0.000006802999999999232, y: -0.012381966518908442 },\n { x: 0.000006803999999999231, y: -0.0073737137346684516 },\n { x: 0.000006804999999999231, y: 0.049181044028927486 },\n { x: 0.000006805999999999231, y: 0.03129782905087034 },\n { x: 0.00000680699999999923, y: 0.0055740927423358275 },\n { x: 0.00000680799999999923, y: 0.034889432069875215 },\n { x: 0.0000068089999999992296, y: 0.05039001750848164 },\n { x: 0.000006809999999999229, y: 0.041198502125301746 },\n { x: 0.000006810999999999229, y: 0.01309683310600402 },\n { x: 0.0000068119999999992285, y: 0.047670306391785586 },\n { x: 0.000006812999999999228, y: 0.04036914446450037 },\n { x: 0.000006813999999999228, y: -0.0012850359263709074 },\n { x: 0.0000068149999999992275, y: 0.0009164287934609223 },\n { x: 0.000006815999999999227, y: 0.05645263510938367 },\n { x: 0.000006816999999999227, y: -0.0009033625701156192 },\n { x: 0.0000068179999999992264, y: 0.031356032643932996 },\n { x: 0.000006818999999999226, y: 0.03782320792507227 },\n { x: 0.000006819999999999226, y: 0.020966300320222977 },\n { x: 0.000006820999999999225, y: 0.020916466123777667 },\n { x: 0.000006821999999999225, y: -0.0056639066626141335 },\n { x: 0.000006822999999999225, y: 0.011657813052464057 },\n { x: 0.000006823999999999224, y: -0.009349043463165646 },\n { x: 0.000006824999999999224, y: -0.0007331412969517337 },\n { x: 0.000006825999999999224, y: 0.046444624944658466 },\n { x: 0.000006826999999999223, y: -0.014992364429491659 },\n { x: 0.000006827999999999223, y: -0.007277063460616441 },\n { x: 0.000006828999999999223, y: 0.03175469110351299 },\n { x: 0.000006829999999999222, y: 0.046744922064786726 },\n { x: 0.000006830999999999222, y: 0.05391414619852801 },\n { x: 0.0000068319999999992216, y: -0.012277591135640635 },\n { x: 0.000006832999999999221, y: 0.029332863818688173 },\n { x: 0.000006833999999999221, y: 0.02491261382771222 },\n { x: 0.0000068349999999992205, y: 0.006701204104819418 },\n { x: 0.00000683599999999922, y: -0.014269809065501952 },\n { x: 0.00000683699999999922, y: 0.024280266586300007 },\n { x: 0.0000068379999999992195, y: 0.015706307285897954 },\n { x: 0.000006838999999999219, y: 0.034984544870718115 },\n { x: 0.000006839999999999219, y: -0.0031555500339514736 },\n { x: 0.000006840999999999218, y: -0.02140291116347397 },\n { x: 0.000006841999999999218, y: 0.02295995706224775 },\n { x: 0.000006842999999999218, y: -0.014317446017972153 },\n { x: 0.000006843999999999217, y: 0.008941496815885375 },\n { x: 0.000006844999999999217, y: 0.020875252280359604 },\n { x: 0.000006845999999999217, y: 0.041313360304384 },\n { x: 0.000006846999999999216, y: 0.019969348311015107 },\n { x: 0.000006847999999999216, y: -0.0053965250253359565 },\n { x: 0.000006848999999999216, y: 0.01865547170239039 },\n { x: 0.000006849999999999215, y: 0.03462019196760992 },\n { x: 0.000006850999999999215, y: 0.049897271984463275 },\n { x: 0.000006851999999999215, y: 0.031844757559880046 },\n { x: 0.000006852999999999214, y: 0.03180402989186906 },\n { x: 0.000006853999999999214, y: 0.0028756311844385114 },\n { x: 0.0000068549999999992135, y: 0.035501389587038294 },\n { x: 0.000006855999999999213, y: 0.016499132294274445 },\n { x: 0.000006856999999999213, y: -0.02068491826440337 },\n { x: 0.0000068579999999992125, y: 0.016411326028772794 },\n { x: 0.000006858999999999212, y: 0.019035276579471204 },\n { x: 0.000006859999999999212, y: 0.027749543969452596 },\n { x: 0.0000068609999999992115, y: 0.03295777707783322 },\n { x: 0.000006861999999999211, y: 0.03513657188159025 },\n { x: 0.000006862999999999211, y: 0.048866889875744175 },\n { x: 0.00000686399999999921, y: -0.006668855860339504 },\n { x: 0.00000686499999999921, y: 0.04290454999681993 },\n { x: 0.00000686599999999921, y: -0.01959733989371077 },\n { x: 0.000006866999999999209, y: -0.020779629473176475 },\n { x: 0.000006867999999999209, y: 0.023637894392031674 },\n { x: 0.000006868999999999209, y: 0.03385386724758168 },\n { x: 0.000006869999999999208, y: 0.010396663832189 },\n { x: 0.000006870999999999208, y: 0.037656001404793124 },\n { x: 0.000006871999999999208, y: -0.011383990017886049 },\n { x: 0.000006872999999999207, y: -0.01971684570146081 },\n { x: 0.000006873999999999207, y: -0.01314083213039054 },\n { x: 0.0000068749999999992066, y: -0.0008842984672737253 },\n { x: 0.000006875999999999206, y: 0.01757666764891804 },\n { x: 0.000006876999999999206, y: -0.018682286597387722 },\n { x: 0.0000068779999999992055, y: -0.011277780786669741 },\n { x: 0.000006878999999999205, y: 0.03216914217010632 },\n { x: 0.000006879999999999205, y: 0.03994438390095344 },\n { x: 0.0000068809999999992045, y: 0.04452788155445453 },\n { x: 0.000006881999999999204, y: -0.01799272016628918 },\n { x: 0.000006882999999999204, y: 0.030513261691829153 },\n { x: 0.0000068839999999992034, y: -0.02034891539588728 },\n { x: 0.000006884999999999203, y: 0.03531840848124036 },\n { x: 0.000006885999999999203, y: -0.004137995724610643 },\n { x: 0.000006886999999999202, y: 0.02202887871276676 },\n { x: 0.000006887999999999202, y: 0.01598934242188037 },\n { x: 0.000006888999999999202, y: 0.03172862931613933 },\n { x: 0.000006889999999999201, y: -0.029085677106199727 },\n { x: 0.000006890999999999201, y: 0.004708645564812092 },\n { x: 0.000006891999999999201, y: 0.012453629007816804 },\n { x: 0.0000068929999999992, y: -0.02209286997299418 },\n { x: 0.0000068939999999992, y: 0.0021766111396465046 },\n { x: 0.0000068949999999992, y: 0.011808136546249072 },\n { x: 0.000006895999999999199, y: -0.027012926706039622 },\n { x: 0.000006896999999999199, y: 0.03071777292079832 },\n { x: 0.0000068979999999991986, y: 0.023087913514500662 },\n { x: 0.000006898999999999198, y: -0.010069489902871155 },\n { x: 0.000006899999999999198, y: 0.016150732302542655 },\n { x: 0.0000069009999999991975, y: -0.006928486441639299 },\n { x: 0.000006901999999999197, y: -0.007955503778157211 },\n { x: 0.000006902999999999197, y: -0.006818961817095659 },\n { x: 0.0000069039999999991965, y: -0.017460829758268518 },\n { x: 0.000006904999999999196, y: -0.03641038756830142 },\n { x: 0.000006905999999999196, y: 0.02368185637868401 },\n { x: 0.0000069069999999991954, y: 0.017469355197813615 },\n { x: 0.000006907999999999195, y: -0.010539293853163356 },\n { x: 0.000006908999999999195, y: 0.00295929325578596 },\n { x: 0.000006909999999999194, y: 0.010077781168484744 },\n { x: 0.000006910999999999194, y: -0.02995143317271735 },\n { x: 0.000006911999999999194, y: 0.007371694424411116 },\n { x: 0.000006912999999999193, y: 0.01483058744880288 },\n { x: 0.000006913999999999193, y: 0.002321405457363832 },\n { x: 0.000006914999999999193, y: 0.028923444459524852 },\n { x: 0.000006915999999999192, y: -0.031668502376391156 },\n { x: 0.000006916999999999192, y: -0.038433238939403314 },\n { x: 0.000006917999999999192, y: -0.009257565061804562 },\n { x: 0.000006918999999999191, y: 0.029871206483255024 },\n { x: 0.000006919999999999191, y: -0.019732121328866543 },\n { x: 0.0000069209999999991905, y: -0.004832807325529261 },\n { x: 0.00000692199999999919, y: -0.011501015698792898 },\n { x: 0.00000692299999999919, y: 0.0005716606069124815 },\n { x: 0.0000069239999999991895, y: 0.012905974926458603 },\n { x: 0.000006924999999999189, y: 0.00963045083130953 },\n { x: 0.000006925999999999189, y: -0.01903203793215653 },\n { x: 0.0000069269999999991885, y: -0.00324002622675829 },\n { x: 0.000006927999999999188, y: -0.03421098551309031 },\n { x: 0.000006928999999999188, y: 0.012672705578906544 },\n { x: 0.000006929999999999187, y: -0.028807236568848905 },\n { x: 0.000006930999999999187, y: 0.025800673346582856 },\n { x: 0.000006931999999999187, y: 0.014925093901099501 },\n { x: 0.000006932999999999186, y: -0.036405981467012745 },\n { x: 0.000006933999999999186, y: 0.02613582272330009 },\n { x: 0.000006934999999999186, y: -0.00514057684847188 },\n { x: 0.000006935999999999185, y: 0.00762542438893467 },\n { x: 0.000006936999999999185, y: 0.02006078277101487 },\n { x: 0.000006937999999999185, y: 0.0030558495060399203 },\n { x: 0.000006938999999999184, y: -0.04183830656446721 },\n { x: 0.000006939999999999184, y: -0.041141143111973255 },\n { x: 0.000006940999999999184, y: 0.00923344413621506 },\n { x: 0.000006941999999999183, y: -0.042103722017635264 },\n { x: 0.000006942999999999183, y: -0.029739557187525353 },\n { x: 0.0000069439999999991825, y: 0.0035900269794085157 },\n { x: 0.000006944999999999182, y: 0.027688334942700357 },\n { x: 0.000006945999999999182, y: -0.022283724683294065 },\n { x: 0.0000069469999999991815, y: -0.012126441675281936 },\n { x: 0.000006947999999999181, y: 0.005805539729345693 },\n { x: 0.000006948999999999181, y: 0.018823056566876058 },\n { x: 0.0000069499999999991804, y: -0.028489276858616925 },\n { x: 0.00000695099999999918, y: -0.011037253980535369 },\n { x: 0.00000695199999999918, y: -0.033909825630598564 },\n { x: 0.000006952999999999179, y: 0.01025501287552421 },\n { x: 0.000006953999999999179, y: 0.026352610874657425 },\n { x: 0.000006954999999999179, y: -0.019756511086977083 },\n { x: 0.000006955999999999178, y: 0.020110696234778815 },\n { x: 0.000006956999999999178, y: -0.0161777898994257 },\n { x: 0.000006957999999999178, y: -0.0030566560948637545 },\n { x: 0.000006958999999999177, y: -0.028509888840408053 },\n { x: 0.000006959999999999177, y: -0.03369006679058259 },\n { x: 0.000006960999999999177, y: 0.022987502033360918 },\n { x: 0.000006961999999999176, y: -0.04388200418519528 },\n { x: 0.000006962999999999176, y: -0.04692694272467074 },\n { x: 0.0000069639999999991756, y: -0.04575858091312391 },\n { x: 0.000006964999999999175, y: -0.03987819675093809 },\n { x: 0.000006965999999999175, y: -0.006893041628724601 },\n { x: 0.0000069669999999991745, y: 0.01388871898043306 },\n { x: 0.000006967999999999174, y: -0.017156627123809262 },\n { x: 0.000006968999999999174, y: -0.015748393250597435 },\n { x: 0.0000069699999999991735, y: 0.003517438113924999 },\n { x: 0.000006970999999999173, y: 0.02567508840514402 },\n { x: 0.000006971999999999173, y: 0.006139298448128588 },\n { x: 0.0000069729999999991724, y: -0.021275732732150325 },\n { x: 0.000006973999999999172, y: -0.020466984014711084 },\n { x: 0.000006974999999999172, y: -0.04058978868653216 },\n { x: 0.000006975999999999171, y: -0.010730899510500103 },\n { x: 0.000006976999999999171, y: -0.01706371574852018 },\n { x: 0.000006977999999999171, y: 0.01821669313056408 },\n { x: 0.00000697899999999917, y: -0.04949738749354579 },\n { x: 0.00000697999999999917, y: -0.012688201628329843 },\n { x: 0.00000698099999999917, y: -0.035171143188626075 },\n { x: 0.000006981999999999169, y: -0.03566320032650792 },\n { x: 0.000006982999999999169, y: -0.03138093541169656 },\n { x: 0.000006983999999999169, y: 0.021408766536759223 },\n { x: 0.000006984999999999168, y: -0.04041440967309298 },\n { x: 0.000006985999999999168, y: -0.036794306877118 },\n { x: 0.0000069869999999991676, y: -0.048250300686051434 },\n { x: 0.000006987999999999167, y: 0.003083754793470332 },\n { x: 0.000006988999999999167, y: -0.010403872018696449 },\n { x: 0.0000069899999999991665, y: -0.021988155980480508 },\n { x: 0.000006990999999999166, y: 0.02167940743788266 },\n { x: 0.000006991999999999166, y: -0.017038882750054152 },\n { x: 0.0000069929999999991655, y: -0.0474108004866033 },\n { x: 0.000006993999999999165, y: 0.01740053179550391 },\n { x: 0.000006994999999999165, y: -0.03436640131679798 },\n { x: 0.000006995999999999164, y: 0.012792781268017358 },\n { x: 0.000006996999999999164, y: 0.013652428092638166 },\n { x: 0.000006997999999999164, y: -0.006365776499710256 },\n { x: 0.000006998999999999163, y: -0.03961267373351084 },\n { x: 0.000006999999999999163, y: -0.026601004989589616 },\n { x: 0.000007000999999999163, y: -0.05331467553135384 },\n { x: 0.000007001999999999162, y: -0.00743773531028512 },\n { x: 0.000007002999999999162, y: -0.04326924535873497 },\n { x: 0.000007003999999999162, y: 0.01391462328868744 },\n { x: 0.000007004999999999161, y: -0.0507862394791191 },\n { x: 0.000007005999999999161, y: -0.024548168799130948 },\n { x: 0.000007006999999999161, y: -0.003582853539372814 },\n { x: 0.00000700799999999916, y: -0.033513554757196765 },\n { x: 0.00000700899999999916, y: 0.008490602380985611 },\n { x: 0.0000070099999999991595, y: -0.03078461854497492 },\n { x: 0.000007010999999999159, y: 0.009916014085502245 },\n { x: 0.000007011999999999159, y: -0.03635278648527554 },\n { x: 0.0000070129999999991585, y: 0.008824236028896391 },\n { x: 0.000007013999999999158, y: 0.015460015616078356 },\n { x: 0.000007014999999999158, y: -0.05721065163322382 },\n { x: 0.0000070159999999991575, y: -0.0581606085246787 },\n { x: 0.000007016999999999157, y: 0.015480725547237024 },\n { x: 0.000007017999999999157, y: -0.04367203050670106 },\n { x: 0.000007018999999999156, y: 0.015902553263801734 },\n { x: 0.000007019999999999156, y: -0.045251731760343306 },\n { x: 0.000007020999999999156, y: -0.04234792113249486 },\n { x: 0.000007021999999999155, y: -0.03276867308801413 },\n { x: 0.000007022999999999155, y: -0.0254477933235239 },\n { x: 0.000007023999999999155, y: 0.008045648621476009 },\n { x: 0.000007024999999999154, y: -0.03611514829304199 },\n { x: 0.000007025999999999154, y: 0.011123840360883357 },\n { x: 0.000007026999999999154, y: -0.0006320132312783548 },\n { x: 0.000007027999999999153, y: -0.0002468823939073897 },\n { x: 0.000007028999999999153, y: -0.051312682441643984 },\n { x: 0.0000070299999999991526, y: 0.008575796762223444 },\n { x: 0.000007030999999999152, y: -0.04342383260015169 },\n { x: 0.000007031999999999152, y: -0.05809120125806678 },\n { x: 0.0000070329999999991515, y: 0.014682252269211642 },\n { x: 0.000007033999999999151, y: -0.020987747252629464 },\n { x: 0.000007034999999999151, y: -0.04552237951952589 },\n { x: 0.0000070359999999991505, y: -0.015689050435634455 },\n { x: 0.00000703699999999915, y: -0.02332516952738477 },\n { x: 0.00000703799999999915, y: -0.04345470590702909 },\n { x: 0.0000070389999999991494, y: 0.006974110658986815 },\n { x: 0.000007039999999999149, y: -0.002917784488151682 },\n { x: 0.000007040999999999149, y: -0.00009766176657031653 },\n { x: 0.000007041999999999148, y: -0.026212820767765852 },\n { x: 0.000007042999999999148, y: -0.012395035174435359 },\n { x: 0.000007043999999999148, y: -0.007238657858546889 },\n { x: 0.000007044999999999147, y: -0.018952000814731543 },\n { x: 0.000007045999999999147, y: -0.04822182088275705 },\n { x: 0.000007046999999999147, y: -0.04202621662980888 },\n { x: 0.000007047999999999146, y: -0.01656090514022061 },\n { x: 0.000007048999999999146, y: -0.06223769142156059 },\n { x: 0.000007049999999999146, y: 0.003475351263724457 },\n { x: 0.000007050999999999145, y: 0.002682878671534158 },\n { x: 0.000007051999999999145, y: -0.022352319203935156 },\n { x: 0.0000070529999999991446, y: -0.005865090743829588 },\n { x: 0.000007053999999999144, y: -0.026633564725836983 },\n { x: 0.000007054999999999144, y: -0.008315049372085513 },\n { x: 0.0000070559999999991435, y: 0.005340325522275594 },\n { x: 0.000007056999999999143, y: -0.03998123865577514 },\n { x: 0.000007057999999999143, y: -0.005556294352026227 },\n { x: 0.0000070589999999991425, y: -0.06104015975040558 },\n { x: 0.000007059999999999142, y: -0.04612807057618702 },\n { x: 0.000007060999999999142, y: -0.0012367990699482835 },\n { x: 0.0000070619999999991414, y: -0.020644598860761858 },\n { x: 0.000007062999999999141, y: -0.004526865444441603 },\n { x: 0.000007063999999999141, y: -0.003698581528721566 },\n { x: 0.00000706499999999914, y: -0.031047049772955818 },\n { x: 0.00000706599999999914, y: -0.035238982208296014 },\n { x: 0.00000706699999999914, y: -0.06007360010738125 },\n { x: 0.000007067999999999139, y: -0.05202383585836602 },\n { x: 0.000007068999999999139, y: -0.04534992759129865 },\n { x: 0.000007069999999999139, y: -0.04849272979750008 },\n { x: 0.000007070999999999138, y: -0.024449786783531362 },\n { x: 0.000007071999999999138, y: -0.0004632707085340283 },\n { x: 0.000007072999999999138, y: -0.005181876436927493 },\n { x: 0.000007073999999999137, y: -0.0670718476719244 },\n { x: 0.000007074999999999137, y: -0.05369220933872514 },\n { x: 0.0000070759999999991365, y: -0.013634828137791391 },\n { x: 0.000007076999999999136, y: -0.01348176225979391 },\n { x: 0.000007077999999999136, y: -0.06319996109691448 },\n { x: 0.0000070789999999991355, y: -0.02446413821773794 },\n { x: 0.000007079999999999135, y: -0.005965339827361055 },\n { x: 0.000007080999999999135, y: -0.018989862158202003 },\n { x: 0.0000070819999999991345, y: -0.05442680830631971 },\n { x: 0.000007082999999999134, y: -0.06351503748726114 },\n { x: 0.000007083999999999134, y: -0.0008492969133060795 },\n { x: 0.000007084999999999133, y: -0.06286760551505376 },\n { x: 0.000007085999999999133, y: -0.007980046828568493 },\n { x: 0.000007086999999999133, y: 0.003753466491430959 },\n { x: 0.000007087999999999132, y: -0.039103338809619435 },\n { x: 0.000007088999999999132, y: -0.0061880276770066925 },\n { x: 0.000007089999999999132, y: -0.024130627517706435 },\n { x: 0.000007090999999999131, y: -0.04958449519697073 },\n { x: 0.000007091999999999131, y: -0.06581330731676943 },\n { x: 0.000007092999999999131, y: -0.047475020765145357 },\n { x: 0.00000709399999999913, y: -0.0007349720283453785 },\n { x: 0.00000709499999999913, y: -0.04724638444497802 },\n { x: 0.00000709599999999913, y: -0.04061571332667874 },\n { x: 0.000007096999999999129, y: -0.032919381520749705 },\n { x: 0.000007097999999999129, y: -0.0004117683948429707 },\n { x: 0.0000070989999999991285, y: -0.02079315428139198 },\n { x: 0.000007099999999999128, y: -0.02075116389355871 },\n { x: 0.000007100999999999128, y: -0.013136611756866992 },\n { x: 0.0000071019999999991275, y: -0.016338004061063442 },\n { x: 0.000007102999999999127, y: -0.01598244384653738 },\n { x: 0.000007103999999999127, y: -0.06845888179046361 },\n { x: 0.0000071049999999991264, y: -0.01067028796133242 },\n { x: 0.000007105999999999126, y: 0.0048124545855526835 },\n { x: 0.000007106999999999126, y: -0.0008056857815244498 },\n { x: 0.000007107999999999125, y: 0.0015245366431565627 },\n { x: 0.000007108999999999125, y: -0.05843290603192919 },\n { x: 0.000007109999999999125, y: -0.03539143001123522 },\n { x: 0.000007110999999999124, y: -0.05101381369120115 },\n { x: 0.000007111999999999124, y: -0.04115810576041735 },\n { x: 0.000007112999999999124, y: -0.036330746454371385 },\n { x: 0.000007113999999999123, y: -0.0005477097989779259 },\n { x: 0.000007114999999999123, y: -0.026664565526610444 },\n { x: 0.000007115999999999123, y: -0.00018663579523094803 },\n { x: 0.000007116999999999122, y: -0.03671092664619317 },\n { x: 0.000007117999999999122, y: -0.0319224329250281 },\n { x: 0.0000071189999999991216, y: -0.05886167992186232 },\n { x: 0.000007119999999999121, y: 0.004120090479981867 },\n { x: 0.000007120999999999121, y: -0.04349386451359364 },\n { x: 0.0000071219999999991205, y: -0.0482379118937285 },\n { x: 0.00000712299999999912, y: -0.054413065032110214 },\n { x: 0.00000712399999999912, y: -0.06600582202729796 },\n { x: 0.0000071249999999991195, y: 0.000005398710760377845 },\n { x: 0.000007125999999999119, y: -0.01866201603489335 },\n { x: 0.000007126999999999119, y: -0.06508150005568639 },\n { x: 0.0000071279999999991184, y: -0.003489956014452466 },\n { x: 0.000007128999999999118, y: -0.022338664893217865 },\n { x: 0.000007129999999999118, y: -0.020587703309191095 },\n { x: 0.000007130999999999117, y: -0.016449690572163563 },\n { x: 0.000007131999999999117, y: -0.0713999553989835 },\n { x: 0.000007132999999999117, y: -0.008067742088819795 },\n { x: 0.000007133999999999116, y: -0.020750318151229942 },\n { x: 0.000007134999999999116, y: -0.02039084411859176 },\n { x: 0.000007135999999999116, y: 0.0011776394305581667 },\n { x: 0.000007136999999999115, y: -0.0005213731933800467 },\n { x: 0.000007137999999999115, y: -0.05257128758284135 },\n { x: 0.000007138999999999115, y: -0.031156320384517707 },\n { x: 0.000007139999999999114, y: -0.02279308828177954 },\n { x: 0.000007140999999999114, y: -0.06497222071233287 },\n { x: 0.0000071419999999991136, y: -0.016090193747867132 },\n { x: 0.000007142999999999113, y: -0.04957522545152335 },\n { x: 0.000007143999999999113, y: -0.06864915927040602 },\n { x: 0.0000071449999999991125, y: -0.05730300950379588 },\n { x: 0.000007145999999999112, y: -0.02145938891639651 },\n { x: 0.000007146999999999112, y: -0.059612543116384906 },\n { x: 0.0000071479999999991115, y: -0.04070761618414434 },\n { x: 0.000007148999999999111, y: -0.01582253325543915 },\n { x: 0.000007149999999999111, y: -0.004371868851906813 },\n { x: 0.00000715099999999911, y: -0.06897563483764135 },\n { x: 0.00000715199999999911, y: -0.010558383269704319 },\n { x: 0.00000715299999999911, y: -0.0017674460819464208 },\n { x: 0.000007153999999999109, y: -0.06818276419514893 },\n { x: 0.000007154999999999109, y: -0.04002506992522192 },\n { x: 0.000007155999999999109, y: -0.039106384803784394 },\n { x: 0.000007156999999999108, y: -0.007594511850956852 },\n { x: 0.000007157999999999108, y: -0.06152931848827739 },\n { x: 0.000007158999999999108, y: -0.033681951616014144 },\n { x: 0.000007159999999999107, y: -0.026679633263420037 },\n { x: 0.000007160999999999107, y: 0.0006899107037052835 },\n { x: 0.000007161999999999107, y: -0.05656240602732718 },\n { x: 0.000007162999999999106, y: -0.020311141032968126 },\n { x: 0.000007163999999999106, y: -0.06515701791028679 },\n { x: 0.0000071649999999991055, y: -0.06895090451275362 },\n { x: 0.000007165999999999105, y: -0.008225593243135251 },\n { x: 0.000007166999999999105, y: -0.04940683091425982 },\n { x: 0.0000071679999999991045, y: 0.00232082557761798 },\n { x: 0.000007168999999999104, y: -0.0167566290260804 },\n { x: 0.000007169999999999104, y: -0.042409612443961624 },\n { x: 0.0000071709999999991035, y: -0.02622725008868715 },\n { x: 0.000007171999999999103, y: -0.023300979202358768 },\n { x: 0.000007172999999999103, y: -0.09816182033976302 },\n { x: 0.000007173999999999102, y: -0.027475975863319922 },\n { x: 0.000007174999999999102, y: -0.03201053708214151 },\n { x: 0.000007175999999999102, y: -0.007706043901475865 },\n { x: 0.000007176999999999101, y: -0.0731218120830089 },\n { x: 0.000007177999999999101, y: -0.07047043120395764 },\n { x: 0.000007178999999999101, y: -0.033543289799699894 },\n { x: 0.0000071799999999991, y: -0.03510544263893476 },\n { x: 0.0000071809999999991, y: -0.02598009951775661 },\n { x: 0.0000071819999999991, y: -0.05102729003417077 },\n { x: 0.000007182999999999099, y: -0.044220943177232484 },\n { x: 0.000007183999999999099, y: -0.05608530245906142 },\n { x: 0.0000071849999999990986, y: -0.006271533660653368 },\n { x: 0.000007185999999999098, y: -0.0005663094924309026 },\n { x: 0.000007186999999999098, y: -0.06745914451921917 },\n { x: 0.0000071879999999990975, y: 0.0018569311639203834 },\n { x: 0.000007188999999999097, y: 0.0018676048788437635 },\n { x: 0.000007189999999999097, y: -0.04559015904010526 },\n { x: 0.0000071909999999990965, y: -0.03831717386090104 },\n { x: 0.000007191999999999096, y: -0.07439777170060198 },\n { x: 0.000007192999999999096, y: -0.07043170288755213 },\n { x: 0.0000071939999999990954, y: -0.020558330935663182 },\n { x: 0.000007194999999999095, y: -0.03276958674214455 },\n { x: 0.000007195999999999095, y: -0.02030959632325691 },\n { x: 0.000007196999999999094, y: -0.03325692451992346 },\n { x: 0.000007197999999999094, y: -0.042061285644463 },\n { x: 0.000007198999999999094, y: -0.031217592884798574 },\n { x: 0.000007199999999999093, y: -0.052204385426676436 },\n { x: 0.000007200999999999093, y: -0.0731764336236671 },\n { x: 0.000007201999999999093, y: -0.04149670855601463 },\n { x: 0.000007202999999999092, y: -0.0647439686156653 },\n { x: 0.000007203999999999092, y: -0.021486267114066357 },\n { x: 0.000007204999999999092, y: -0.005138481425835291 },\n { x: 0.000007205999999999091, y: -0.07451304230237313 },\n { x: 0.000007206999999999091, y: -0.05497628421212668 },\n { x: 0.0000072079999999990906, y: -0.06433615995335952 },\n { x: 0.00000720899999999909, y: -0.030051444442295006 },\n { x: 0.00000720999999999909, y: -0.02287516496665612 },\n { x: 0.0000072109999999990895, y: -0.05527471299391242 },\n { x: 0.000007211999999999089, y: -0.0366822414755828 },\n { x: 0.000007212999999999089, y: -0.04629813516151624 },\n { x: 0.0000072139999999990885, y: -0.009873429374591972 },\n { x: 0.000007214999999999088, y: -0.05457364529072396 },\n { x: 0.000007215999999999088, y: -0.016324495543521216 },\n { x: 0.0000072169999999990874, y: -0.06788498424263945 },\n { x: 0.000007217999999999087, y: -0.04643206316024974 },\n { x: 0.000007218999999999087, y: -0.06839873383240357 },\n { x: 0.000007219999999999086, y: -0.044482676049630604 },\n { x: 0.000007220999999999086, y: -0.066599897522264 },\n { x: 0.000007221999999999086, y: -0.012602660575704364 },\n { x: 0.000007222999999999085, y: -0.01312911098588481 },\n { x: 0.000007223999999999085, y: -0.009756126175816025 },\n { x: 0.000007224999999999085, y: -0.019572539830613796 },\n { x: 0.000007225999999999084, y: -0.017282169356180477 },\n { x: 0.000007226999999999084, y: -0.05588622149709671 },\n { x: 0.000007227999999999084, y: -0.0319181223917204 },\n { x: 0.000007228999999999083, y: -0.02873308463785337 },\n { x: 0.000007229999999999083, y: -0.04711328623568554 },\n { x: 0.0000072309999999990825, y: -0.034514236708122946 },\n { x: 0.000007231999999999082, y: -0.0678602111585716 },\n { x: 0.000007232999999999082, y: -0.060309198680223185 },\n { x: 0.0000072339999999990815, y: -0.0011700067384117219 },\n { x: 0.000007234999999999081, y: -0.06157080325261845 },\n { x: 0.000007235999999999081, y: -0.035527707279226745 },\n { x: 0.0000072369999999990805, y: -0.04683480991382962 },\n { x: 0.00000723799999999908, y: -0.022069116434881842 },\n { x: 0.00000723899999999908, y: -0.048646766565729964 },\n { x: 0.000007239999999999079, y: -0.05017602241187144 },\n { x: 0.000007240999999999079, y: -0.007619300236317621 },\n { x: 0.000007241999999999079, y: -0.036026666114461765 },\n { x: 0.000007242999999999078, y: -0.007503725707290718 },\n { x: 0.000007243999999999078, y: -0.040453078589375434 },\n { x: 0.000007244999999999078, y: -0.04965943853564071 },\n { x: 0.000007245999999999077, y: -0.05183180374131115 },\n { x: 0.000007246999999999077, y: -0.0013592820216727572 },\n { x: 0.000007247999999999077, y: -0.04875086525302139 },\n { x: 0.000007248999999999076, y: -0.054776594121131436 },\n { x: 0.000007249999999999076, y: -0.001119077322421301 },\n { x: 0.000007250999999999076, y: -0.04946315121607191 },\n { x: 0.000007251999999999075, y: -0.046932301214086966 },\n { x: 0.000007252999999999075, y: -0.01844339432076955 },\n { x: 0.0000072539999999990745, y: -0.036046597201360865 },\n { x: 0.000007254999999999074, y: -0.06902305264522451 },\n { x: 0.000007255999999999074, y: -0.026575641423870998 },\n { x: 0.0000072569999999990735, y: -0.03599532803250995 },\n { x: 0.000007257999999999073, y: -0.013591971390709872 },\n { x: 0.000007258999999999073, y: -0.06557800945540092 },\n { x: 0.0000072599999999990724, y: -0.023609748791354426 },\n { x: 0.000007260999999999072, y: -0.02942454342789766 },\n { x: 0.000007261999999999072, y: -0.01285937942318674 },\n { x: 0.000007262999999999071, y: -0.030046031692851798 },\n { x: 0.000007263999999999071, y: -0.06377838719377696 },\n { x: 0.000007264999999999071, y: -0.07008301761452412 },\n { x: 0.00000726599999999907, y: -0.07184571001308271 },\n { x: 0.00000726699999999907, y: -0.00040319922835850563 },\n { x: 0.00000726799999999907, y: -0.06152685383348469 },\n { x: 0.000007268999999999069, y: -0.010046148492922131 },\n { x: 0.000007269999999999069, y: -0.020702638895373417 },\n { x: 0.000007270999999999069, y: -0.06781904873621691 },\n { x: 0.000007271999999999068, y: -0.028856109284528152 },\n { x: 0.000007272999999999068, y: 0.020051532148233048 },\n { x: 0.0000072739999999990676, y: -0.03294089443315309 },\n { x: 0.000007274999999999067, y: -0.06823420159741694 },\n { x: 0.000007275999999999067, y: -0.04715872046977922 },\n { x: 0.0000072769999999990665, y: -0.06182693551878753 },\n { x: 0.000007277999999999066, y: -0.02654279892887053 },\n { x: 0.000007278999999999066, y: -0.06450231029418176 },\n { x: 0.0000072799999999990655, y: 0.00018730673619885702 },\n { x: 0.000007280999999999065, y: 0.004437491259555969 },\n { x: 0.000007281999999999065, y: -0.033379181773633845 },\n { x: 0.0000072829999999990644, y: -0.00811025074228109 },\n { x: 0.000007283999999999064, y: -0.01932299440413382 },\n { x: 0.000007284999999999064, y: -0.062476493711495454 },\n { x: 0.000007285999999999063, y: -0.05633967496859482 },\n { x: 0.000007286999999999063, y: -0.05095558460029348 },\n { x: 0.000007287999999999063, y: -0.06169270358277662 },\n { x: 0.000007288999999999062, y: 0.004214057487375293 },\n { x: 0.000007289999999999062, y: -0.0314403193856731 },\n { x: 0.000007290999999999062, y: -0.04223928826216301 },\n { x: 0.000007291999999999061, y: -0.05218579916662878 },\n { x: 0.000007292999999999061, y: -0.06512995352023862 },\n { x: 0.000007293999999999061, y: -0.019280289348598385 },\n { x: 0.00000729499999999906, y: -0.010529166464689457 },\n { x: 0.00000729599999999906, y: -0.054191793012279596 },\n { x: 0.0000072969999999990596, y: 0.00341447104670501 },\n { x: 0.000007297999999999059, y: -0.061300984046850165 },\n { x: 0.000007298999999999059, y: -0.04801915952008483 },\n { x: 0.0000072999999999990585, y: -0.06163207442390853 },\n { x: 0.000007300999999999058, y: -0.026517169751005168 },\n { x: 0.000007301999999999058, y: -0.06827283557175418 },\n { x: 0.0000073029999999990575, y: -0.04333225738387995 },\n { x: 0.000007303999999999057, y: -0.019014867900510497 },\n { x: 0.000007304999999999057, y: -0.042787800777474995 },\n { x: 0.000007305999999999056, y: -0.05732084602202324 },\n { x: 0.000007306999999999056, y: -0.04722413410779244 },\n { x: 0.000007307999999999056, y: -0.05331884910020737 },\n { x: 0.000007308999999999055, y: -0.05369028352225893 },\n { x: 0.000007309999999999055, y: -0.014000733323174832 },\n { x: 0.000007310999999999055, y: -0.05651339213965757 },\n { x: 0.000007311999999999054, y: -0.05021771504216399 },\n { x: 0.000007312999999999054, y: -0.0674576824298019 },\n { x: 0.000007313999999999054, y: -0.00488150647327024 },\n { x: 0.000007314999999999053, y: -0.010434417514471415 },\n { x: 0.000007315999999999053, y: -0.0455467163632845 },\n { x: 0.000007316999999999053, y: -0.031997417874886316 },\n { x: 0.000007317999999999052, y: -0.002358351795812879 },\n { x: 0.000007318999999999052, y: -0.032794687231140894 },\n { x: 0.0000073199999999990515, y: 0.00498036922848083 },\n { x: 0.000007320999999999051, y: -0.059205743811512376 },\n { x: 0.000007321999999999051, y: 0.0031731552685313295 },\n { x: 0.0000073229999999990505, y: -0.06553022081679348 },\n { x: 0.00000732399999999905, y: -0.02630821224675649 },\n { x: 0.00000732499999999905, y: -0.06534531492579687 },\n { x: 0.0000073259999999990495, y: -0.06667356340977203 },\n { x: 0.000007326999999999049, y: -0.021080033149824675 },\n { x: 0.000007327999999999049, y: -0.021370518108956724 },\n { x: 0.000007328999999999048, y: -0.04579013271796882 },\n { x: 0.000007329999999999048, y: -0.01963070941772526 },\n { x: 0.000007330999999999048, y: -0.0017769243910953011 },\n { x: 0.000007331999999999047, y: -0.006390163308243206 },\n { x: 0.000007332999999999047, y: -0.014104190811848735 },\n { x: 0.000007333999999999047, y: -0.06104934852093748 },\n { x: 0.000007334999999999046, y: -0.024981775233572343 },\n { x: 0.000007335999999999046, y: -0.046500948214187154 },\n { x: 0.000007336999999999046, y: -0.038717687467909725 },\n { x: 0.000007337999999999045, y: -0.0062598823117806755 },\n { x: 0.000007338999999999045, y: -0.057163411645864054 },\n { x: 0.0000073399999999990446, y: -0.02316902345009852 },\n { x: 0.000007340999999999044, y: -0.03535388430589754 },\n { x: 0.000007341999999999044, y: -0.033194787939132483 },\n { x: 0.0000073429999999990435, y: -0.019869171345822282 },\n { x: 0.000007343999999999043, y: -0.017360930959795434 },\n { x: 0.000007344999999999043, y: -0.024607250401901627 },\n { x: 0.0000073459999999990425, y: -0.06327128041740664 },\n { x: 0.000007346999999999042, y: -0.06417892246293419 },\n { x: 0.000007347999999999042, y: -0.01785455424974962 },\n { x: 0.0000073489999999990414, y: 0.0030668403248644387 },\n { x: 0.000007349999999999041, y: -0.0032439513025625463 },\n { x: 0.000007350999999999041, y: -0.02058964230128615 },\n { x: 0.00000735199999999904, y: 0.0019649579833306598 },\n { x: 0.00000735299999999904, y: 0.0006424734532389405 },\n { x: 0.00000735399999999904, y: -0.042439142652943754 },\n { x: 0.000007354999999999039, y: -0.04806973094324732 },\n { x: 0.000007355999999999039, y: -0.03358593840910293 },\n { x: 0.000007356999999999039, y: -0.054136250512298936 },\n { x: 0.000007357999999999038, y: 0.002383695138218317 },\n { x: 0.000007358999999999038, y: -0.04287475697673759 },\n { x: 0.000007359999999999038, y: -0.016259981813938087 },\n { x: 0.000007360999999999037, y: 0.0024011171539192362 },\n { x: 0.000007361999999999037, y: -0.05720901087074616 },\n { x: 0.0000073629999999990366, y: 0.009931332279144355 },\n { x: 0.000007363999999999036, y: -0.001562856473653583 },\n { x: 0.000007364999999999036, y: -0.05241085908556514 },\n { x: 0.0000073659999999990355, y: -0.005895993464573628 },\n { x: 0.000007366999999999035, y: 0.01271480067304305 },\n { x: 0.000007367999999999035, y: -0.06059263713890752 },\n { x: 0.0000073689999999990345, y: -0.060055463644846256 },\n { x: 0.000007369999999999034, y: -0.02800740671090325 },\n { x: 0.000007370999999999034, y: -0.04924317423133233 },\n { x: 0.0000073719999999990334, y: -0.0617881403186811 },\n { x: 0.000007372999999999033, y: -0.0443199504506797 },\n { x: 0.000007373999999999033, y: 0.014030723300833811 },\n { x: 0.000007374999999999032, y: -0.05508856199787092 },\n { x: 0.000007375999999999032, y: 0.012688963124687445 },\n { x: 0.000007376999999999032, y: 0.004616942799878093 },\n { x: 0.000007377999999999031, y: -0.04175586614978387 },\n { x: 0.000007378999999999031, y: -0.013834914322985777 },\n { x: 0.000007379999999999031, y: -0.017223789589072433 },\n { x: 0.00000738099999999903, y: -0.009704489953258516 },\n { x: 0.00000738199999999903, y: -0.045797037612904434 },\n { x: 0.00000738299999999903, y: 0.004374736647417558 },\n { x: 0.000007383999999999029, y: 0.002699311262830021 },\n { x: 0.000007384999999999029, y: -0.011401949068785184 },\n { x: 0.0000073859999999990285, y: 0.011576793847585733 },\n { x: 0.000007386999999999028, y: 0.006822848264636281 },\n { x: 0.000007387999999999028, y: -0.04901639045102549 },\n { x: 0.0000073889999999990275, y: -0.006432331565351215 },\n { x: 0.000007389999999999027, y: -0.02934371453295898 },\n { x: 0.000007390999999999027, y: -0.018211033723946536 },\n { x: 0.0000073919999999990265, y: -0.026498710569875662 },\n { x: 0.000007392999999999026, y: -0.009706340944602156 },\n { x: 0.000007393999999999026, y: -0.014460503528586695 },\n { x: 0.000007394999999999025, y: -0.030389165750515854 },\n { x: 0.000007395999999999025, y: -0.04356653462251102 },\n { x: 0.000007396999999999025, y: 0.003292043599791135 },\n { x: 0.000007397999999999024, y: 0.016438158410479933 },\n { x: 0.000007398999999999024, y: -0.05687362787878322 },\n { x: 0.000007399999999999024, y: -0.0380985931069639 },\n { x: 0.000007400999999999023, y: 0.013965210059873664 },\n { x: 0.000007401999999999023, y: -0.03106620633414059 },\n { x: 0.000007402999999999023, y: -0.010542402449718116 },\n { x: 0.000007403999999999022, y: 0.014110691609459422 },\n { x: 0.000007404999999999022, y: -0.037852784459650075 },\n { x: 0.000007405999999999022, y: -0.023544119725373496 },\n { x: 0.000007406999999999021, y: 0.011490737773633197 },\n { x: 0.000007407999999999021, y: -0.014383899648944572 },\n { x: 0.0000074089999999990205, y: 0.010805690528233148 },\n { x: 0.00000740999999999902, y: 0.002869263427525283 },\n { x: 0.00000741099999999902, y: -0.018796968702294914 },\n { x: 0.0000074119999999990195, y: -0.05238256396814518 },\n { x: 0.000007412999999999019, y: -0.024113942804738442 },\n { x: 0.000007413999999999019, y: -0.03711348939954087 },\n { x: 0.0000074149999999990184, y: -0.03513189885138193 },\n { x: 0.000007415999999999018, y: -0.03094726632534426 },\n { x: 0.000007416999999999018, y: -0.046917484989736274 },\n { x: 0.000007417999999999017, y: -0.012055521211049618 },\n { x: 0.000007418999999999017, y: -0.005974042629585613 },\n { x: 0.000007419999999999017, y: -0.020695969397863254 },\n { x: 0.000007420999999999016, y: 0.0038074726994657554 },\n { x: 0.000007421999999999016, y: -0.009692356250001088 },\n { x: 0.000007422999999999016, y: 0.0032112933339301514 },\n { x: 0.000007423999999999015, y: -0.030543868427856828 },\n { x: 0.000007424999999999015, y: -0.033905980881533376 },\n { x: 0.000007425999999999015, y: 0.0028753468623225267 },\n { x: 0.000007426999999999014, y: -0.0032526842934471854 },\n { x: 0.000007427999999999014, y: -0.00251685038520184 },\n { x: 0.0000074289999999990136, y: -0.051886343585057254 },\n { x: 0.000007429999999999013, y: -0.02242221624925851 },\n { x: 0.000007430999999999013, y: 0.014810252834930239 },\n { x: 0.0000074319999999990125, y: -0.012795042673153354 },\n { x: 0.000007432999999999012, y: -0.034156727851912524 },\n { x: 0.000007433999999999012, y: 0.015542784896558103 },\n { x: 0.0000074349999999990115, y: 0.007799663182830971 },\n { x: 0.000007435999999999011, y: -0.027506886852384713 },\n { x: 0.000007436999999999011, y: -0.026278178011856765 },\n { x: 0.0000074379999999990104, y: -0.05327981105840306 },\n { x: 0.00000743899999999901, y: -0.009614204591109076 },\n { x: 0.00000743999999999901, y: -0.04685461688986286 },\n { x: 0.000007440999999999009, y: -0.04613772016630074 },\n { x: 0.000007441999999999009, y: -0.023813484103610606 },\n { x: 0.000007442999999999009, y: 0.019503401323730424 },\n { x: 0.000007443999999999008, y: -0.016178943271441756 },\n { x: 0.000007444999999999008, y: -0.04221617451891515 },\n { x: 0.000007445999999999008, y: -0.008322244472053857 },\n { x: 0.000007446999999999007, y: -0.016784004675501486 },\n { x: 0.000007447999999999007, y: 0.0206280093854243 },\n { x: 0.000007448999999999007, y: -0.0366815961304643 },\n { x: 0.000007449999999999006, y: -0.027226401899355025 },\n { x: 0.000007450999999999006, y: 0.024143156458077783 },\n { x: 0.0000074519999999990056, y: -0.011202393941574814 },\n { x: 0.000007452999999999005, y: -0.027791251024402663 },\n { x: 0.000007453999999999005, y: -0.022042573030777838 },\n { x: 0.0000074549999999990045, y: -0.03890564316841142 },\n { x: 0.000007455999999999004, y: -0.03315762378403287 },\n { x: 0.000007456999999999004, y: -0.047032878333595325 },\n { x: 0.0000074579999999990035, y: 0.008490278709715068 },\n { x: 0.000007458999999999003, y: -0.05026383719050988 },\n { x: 0.000007459999999999003, y: 0.011755637314889813 },\n { x: 0.000007460999999999002, y: 0.012063228527811021 },\n { x: 0.000007461999999999002, y: 0.01760047666943055 },\n { x: 0.000007462999999999002, y: 0.004782423488207331 },\n { x: 0.000007463999999999001, y: -0.013220204778171363 },\n { x: 0.000007464999999999001, y: -0.012474467972078369 },\n { x: 0.000007465999999999001, y: -0.00010112941245736355 },\n { x: 0.000007466999999999, y: 0.019849957090585825 },\n { x: 0.000007467999999999, y: -0.028526674274911422 },\n { x: 0.000007468999999999, y: -0.0367800334247735 },\n { x: 0.000007469999999998999, y: -0.04772225902819775 },\n { x: 0.000007470999999998999, y: 0.023846912362795056 },\n { x: 0.000007471999999998999, y: -0.037314787356605136 },\n { x: 0.000007472999999998998, y: -0.04558715473869202 },\n { x: 0.000007473999999998998, y: 0.026508529307455175 },\n { x: 0.0000074749999999989975, y: -0.012872266463990981 },\n { x: 0.000007475999999998997, y: -0.018841512370495396 },\n { x: 0.000007476999999998997, y: -0.0024487998777189875 },\n { x: 0.0000074779999999989965, y: -0.018101179289549765 },\n { x: 0.000007478999999998996, y: 0.015044287679104505 },\n { x: 0.000007479999999998996, y: 0.0011038575802550191 },\n { x: 0.0000074809999999989955, y: -0.013647247998661193 },\n { x: 0.000007481999999998995, y: 0.014640754584732319 },\n { x: 0.000007482999999998995, y: -0.03806331479103022 },\n { x: 0.000007483999999998994, y: 0.014846101806114804 },\n { x: 0.000007484999999998994, y: -0.01926068662190827 },\n { x: 0.000007485999999998994, y: 0.0015913629028468518 },\n { x: 0.000007486999999998993, y: -0.014693312571803202 },\n { x: 0.000007487999999998993, y: 0.0122955695094787 },\n { x: 0.000007488999999998993, y: -0.02207191822747178 },\n { x: 0.000007489999999998992, y: -0.03921729422865224 },\n { x: 0.000007490999999998992, y: 0.012055261852238486 },\n { x: 0.000007491999999998992, y: -0.03354121074099931 },\n { x: 0.000007492999999998991, y: -0.021733193782794664 },\n { x: 0.000007493999999998991, y: 0.01422146979248136 },\n { x: 0.0000074949999999989906, y: -0.024322521978045526 },\n { x: 0.00000749599999999899, y: 0.01516836216012753 },\n { x: 0.00000749699999999899, y: 0.031712033041274894 },\n { x: 0.0000074979999999989895, y: 0.02373926308637362 },\n { x: 0.000007498999999998989, y: -0.04333450440251446 },\n { x: 0.000007499999999998989, y: -0.00432981503589794 },\n { x: 0.0000075009999999989885, y: -0.013161511096584224 },\n { x: 0.000007501999999998988, y: 0.026990585809848762 },\n { x: 0.000007502999999998988, y: -0.02955103873849134 },\n { x: 0.0000075039999999989874, y: 0.02297200661656664 },\n { x: 0.000007504999999998987, y: -0.03426265593756837 },\n { x: 0.000007505999999998987, y: 0.030867566385499062 },\n { x: 0.000007506999999998986, y: 0.011164551199046094 },\n { x: 0.000007507999999998986, y: -0.0354970835544735 },\n { x: 0.000007508999999998986, y: -0.008877616834295568 },\n { x: 0.000007509999999998985, y: 0.016362353054111985 },\n { x: 0.000007510999999998985, y: -0.01955606488125417 },\n { x: 0.000007511999999998985, y: 0.01777636467476429 },\n { x: 0.000007512999999998984, y: 0.012551204087390865 },\n { x: 0.000007513999999998984, y: 0.023974925168885608 },\n { x: 0.000007514999999998984, y: 0.010787144363156274 },\n { x: 0.000007515999999998983, y: -0.0224715238087419 },\n { x: 0.000007516999999998983, y: 0.02666368644044954 },\n { x: 0.0000075179999999989826, y: 0.0027069205580705358 },\n { x: 0.000007518999999998982, y: -0.02106567874260163 },\n { x: 0.000007519999999998982, y: -0.03866795049489245 },\n { x: 0.0000075209999999989815, y: 0.02438285208966404 },\n { x: 0.000007521999999998981, y: 0.02109652000908158 },\n { x: 0.000007522999999998981, y: 0.025346655104203333 },\n { x: 0.0000075239999999989805, y: -0.03734569446928815 },\n { x: 0.00000752499999999898, y: 0.02095433238898075 },\n { x: 0.00000752599999999898, y: 0.03544585238026281 },\n { x: 0.0000075269999999989794, y: -0.034792246561947515 },\n { x: 0.000007527999999998979, y: -0.015283662297831499 },\n { x: 0.000007528999999998979, y: -0.03314493750194377 },\n { x: 0.000007529999999998978, y: -0.026262624278731085 },\n { x: 0.000007530999999998978, y: -0.025628948669453325 },\n { x: 0.000007531999999998978, y: -0.016870724346038788 },\n { x: 0.000007532999999998977, y: -0.01630860415249793 },\n { x: 0.000007533999999998977, y: -0.03877309487735412 },\n { x: 0.000007534999999998977, y: -0.014458705854968588 },\n { x: 0.000007535999999998976, y: -0.004380236181917542 },\n { x: 0.000007536999999998976, y: -0.03499118488611446 },\n { x: 0.000007537999999998976, y: 0.02449090105524733 },\n { x: 0.000007538999999998975, y: 0.003282918889215191 },\n { x: 0.000007539999999998975, y: 0.05045696812558543 },\n { x: 0.0000075409999999989745, y: -0.03368129503509705 },\n { x: 0.000007541999999998974, y: 0.03591621386706343 },\n { x: 0.000007542999999998974, y: 0.03233171436130313 },\n { x: 0.0000075439999999989735, y: 0.02854159511395619 },\n { x: 0.000007544999999998973, y: 0.007452164102296521 },\n { x: 0.000007545999999998973, y: 0.026424106338118713 },\n { x: 0.0000075469999999989725, y: 0.02579015979367145 },\n { x: 0.000007547999999998972, y: -0.007994499684184376 },\n { x: 0.000007548999999998972, y: 0.005277501410294967 },\n { x: 0.000007549999999998971, y: 0.01569678719187802 },\n { x: 0.000007550999999998971, y: 0.031068673303270934 },\n { x: 0.000007551999999998971, y: 0.035321374763753334 },\n { x: 0.00000755299999999897, y: -0.030803174012017643 },\n { x: 0.00000755399999999897, y: -0.013411724611616698 },\n { x: 0.00000755499999999897, y: 0.004404635733234577 },\n { x: 0.000007555999999998969, y: -0.03291455494326488 },\n { x: 0.000007556999999998969, y: -0.01697052445817402 },\n { x: 0.000007557999999998969, y: -0.01194490823610042 },\n { x: 0.000007558999999998968, y: -0.004597368497743597 },\n { x: 0.000007559999999998968, y: 0.0015126267726125104 },\n { x: 0.000007560999999998968, y: -0.02579499150911735 },\n { x: 0.000007561999999998967, y: 0.03721085587804962 },\n { x: 0.000007562999999998967, y: -0.016809178152901567 },\n { x: 0.0000075639999999989665, y: -0.01539740359864833 },\n { x: 0.000007564999999998966, y: 0.002038429423671922 },\n { x: 0.000007565999999998966, y: 0.005204954726066064 },\n { x: 0.0000075669999999989655, y: 0.04198668751811494 },\n { x: 0.000007567999999998965, y: 0.012864884541321269 },\n { x: 0.000007568999999998965, y: 0.0364630682898983 },\n { x: 0.0000075699999999989644, y: 0.008356222136393372 },\n { x: 0.000007570999999998964, y: -0.03290623074254493 },\n { x: 0.000007571999999998964, y: -0.009913686924330138 },\n { x: 0.000007572999999998963, y: -0.03289334433949133 },\n { x: 0.000007573999999998963, y: -0.019077924400711852 },\n { x: 0.000007574999999998963, y: -0.029565512613616667 },\n { x: 0.000007575999999998962, y: 0.034160674854791025 },\n { x: 0.000007576999999998962, y: 0.02142962950636111 },\n { x: 0.000007577999999998962, y: 0.05143712770089505 },\n { x: 0.000007578999999998961, y: -0.009584524436073699 },\n { x: 0.000007579999999998961, y: 0.0032343133707201884 },\n { x: 0.000007580999999998961, y: -0.020962860600391355 },\n { x: 0.00000758199999999896, y: 0.0070203490026829055 },\n { x: 0.00000758299999999896, y: -0.021497278792991327 },\n { x: 0.0000075839999999989596, y: -0.002922441062924031 },\n { x: 0.000007584999999998959, y: 0.009262999694934262 },\n { x: 0.000007585999999998959, y: 0.01500860245135369 },\n { x: 0.0000075869999999989585, y: -0.00961979415109349 },\n { x: 0.000007587999999998958, y: 0.042562307472870375 },\n { x: 0.000007588999999998958, y: 0.03642840757380023 },\n { x: 0.0000075899999999989575, y: 0.03823126307874945 },\n { x: 0.000007590999999998957, y: 0.028377175403870736 },\n { x: 0.000007591999999998957, y: 0.04493090307456646 },\n { x: 0.0000075929999999989564, y: 0.042443489411100085 },\n { x: 0.000007593999999998956, y: 0.022158768532757746 },\n { x: 0.000007594999999998956, y: -0.028387724183935748 },\n { x: 0.000007595999999998955, y: 0.02937125657833063 },\n { x: 0.000007596999999998955, y: -0.014528051568962745 },\n { x: 0.000007597999999998955, y: -0.019585544647909143 },\n { x: 0.000007598999999998954, y: 0.017416150975529378 },\n { x: 0.000007599999999998954, y: -0.02617746484828591 },\n { x: 0.000007600999999998954, y: -0.009730854872071953 },\n { x: 0.000007601999999998953, y: -0.001462162978598424 },\n { x: 0.000007602999999998953, y: 0.03897227447851271 },\n { x: 0.000007603999999998953, y: -0.00805184053178228 },\n { x: 0.000007604999999998952, y: -0.022128208800918613 },\n { x: 0.000007605999999998952, y: 0.014957295478214954 },\n { x: 0.0000076069999999989516, y: 0.00023436006724148438 },\n { x: 0.000007607999999998951, y: -0.0018134446823015737 },\n { x: 0.000007608999999998951, y: 0.03526274005507467 },\n { x: 0.0000076099999999989505, y: 0.03410482905249744 },\n { x: 0.00000761099999999895, y: 0.029072906356520867 },\n { x: 0.00000761199999999895, y: -0.021051780698912732 },\n { x: 0.0000076129999999989495, y: 0.029051296058945554 },\n { x: 0.000007613999999998949, y: -0.002960097650801281 },\n { x: 0.000007614999999998949, y: -0.022063092662033996 },\n { x: 0.000007615999999998948, y: 0.03592708122692177 },\n { x: 0.000007616999999998948, y: 0.025292641537510444 },\n { x: 0.000007617999999998948, y: -0.011840778527306311 },\n { x: 0.000007618999999998947, y: -0.023986228442120842 },\n { x: 0.000007619999999998947, y: -0.012683697843507804 },\n { x: 0.000007620999999998947, y: -0.01196524864526457 },\n { x: 0.000007621999999998946, y: 0.02752333541683069 },\n { x: 0.000007622999999998946, y: 0.04299391611587114 },\n { x: 0.000007623999999998946, y: 0.036308488367850555 },\n { x: 0.000007624999999998945, y: 0.03911561245356373 },\n { x: 0.000007625999999998945, y: -0.011818107863260542 },\n { x: 0.000007626999999998945, y: -0.01921216299571429 },\n { x: 0.000007627999999998944, y: -0.01454998076562428 },\n { x: 0.000007628999999998944, y: 0.012927259519001694 },\n { x: 0.000007629999999998944, y: -0.024562009876564588 },\n { x: 0.000007630999999998945, y: 0.009896508349904165 },\n { x: 0.000007631999999998945, y: -0.01618539706613077 },\n { x: 0.000007632999999998946, y: -0.014800790102505979 },\n { x: 0.000007633999999998946, y: 0.02447504220629354 },\n { x: 0.000007634999999998947, y: 0.004056376996161574 },\n { x: 0.000007635999999998947, y: 0.010958593992927083 },\n { x: 0.000007636999999998948, y: 0.023732863792113885 },\n { x: 0.000007637999999998948, y: 0.011696420088332432 },\n { x: 0.000007638999999998949, y: -0.018330710942847356 },\n { x: 0.00000763999999999895, y: 0.018141207690429744 },\n { x: 0.00000764099999999895, y: 0.04016213142883144 },\n { x: 0.00000764199999999895, y: -0.010796136535958734 },\n { x: 0.000007642999999998951, y: 0.039972437778972664 },\n { x: 0.000007643999999998951, y: -0.009421163380471876 },\n { x: 0.000007644999999998952, y: -0.01612936914685939 },\n { x: 0.000007645999999998952, y: -0.00017625205542366566 },\n { x: 0.000007646999999998953, y: 0.005491790013955621 },\n { x: 0.000007647999999998953, y: 0.033663732781375036 },\n { x: 0.000007648999999998954, y: 0.020685031282515462 },\n { x: 0.000007649999999998954, y: 0.010113591904799487 },\n { x: 0.000007650999999998955, y: -0.010165489344933065 },\n { x: 0.000007651999999998955, y: 0.026057292939187376 },\n { x: 0.000007652999999998956, y: 0.017384662074457387 },\n { x: 0.000007653999999998956, y: -0.007590810428950672 },\n { x: 0.000007654999999998957, y: 0.031458194176884086 },\n { x: 0.000007655999999998957, y: -0.020630593811190673 },\n { x: 0.000007656999999998958, y: 0.019014821534339907 },\n { x: 0.000007657999999998958, y: 0.011743937697930562 },\n { x: 0.000007658999999998959, y: 0.00007031287137651207 },\n { x: 0.00000765999999999896, y: 0.02303909944341818 },\n { x: 0.00000766099999999896, y: 0.006995922923644005 },\n { x: 0.00000766199999999896, y: -0.017085098575874716 },\n { x: 0.00000766299999999896, y: 0.0024778228586560154 },\n { x: 0.000007663999999998961, y: 0.01669216614428899 },\n { x: 0.000007664999999998962, y: 0.02960072769232535 },\n { x: 0.000007665999999998962, y: 0.016507543912620406 },\n { x: 0.000007666999999998963, y: 0.0010951361706479142 },\n { x: 0.000007667999999998963, y: 0.0442289600007922 },\n { x: 0.000007668999999998964, y: 0.039799982327582126 },\n { x: 0.000007669999999998964, y: 0.051568161711428445 },\n { x: 0.000007670999999998965, y: 0.016110453617722443 },\n { x: 0.000007671999999998965, y: 0.04010307109694563 },\n { x: 0.000007672999999998966, y: 0.042413509986628364 },\n { x: 0.000007673999999998966, y: -0.0017353305800867844 },\n { x: 0.000007674999999998967, y: 0.0031100488747114532 },\n { x: 0.000007675999999998967, y: 0.04758293813736568 },\n { x: 0.000007676999999998968, y: 0.024826948820876632 },\n { x: 0.000007677999999998968, y: -0.01066632664993435 },\n { x: 0.000007678999999998969, y: -0.018992853867057128 },\n { x: 0.00000767999999999897, y: 0.019219533773053337 },\n { x: 0.00000768099999999897, y: 0.04147738284632212 },\n { x: 0.00000768199999999897, y: 0.0020314928236688217 },\n { x: 0.00000768299999999897, y: 0.01835181358908086 },\n { x: 0.000007683999999998971, y: 0.0030591714963266944 },\n { x: 0.000007684999999998972, y: 0.018681697479479734 },\n { x: 0.000007685999999998972, y: 0.04999125248055506 },\n { x: 0.000007686999999998973, y: -0.010898018786641987 },\n { x: 0.000007687999999998973, y: 0.0059386370077591875 },\n { x: 0.000007688999999998974, y: -0.007419026099136347 },\n { x: 0.000007689999999998974, y: 0.036887778361636606 },\n { x: 0.000007690999999998975, y: 0.05261245909478904 },\n { x: 0.000007691999999998975, y: 0.043685703905142814 },\n { x: 0.000007692999999998976, y: 0.042904681328542 },\n { x: 0.000007693999999998976, y: -0.000833875149596517 },\n { x: 0.000007694999999998977, y: 0.01889166734862338 },\n { x: 0.000007695999999998977, y: 0.04468714198644731 },\n { x: 0.000007696999999998978, y: -0.008537668615090279 },\n { x: 0.000007697999999998978, y: 0.02512113820589359 },\n { x: 0.000007698999999998979, y: 0.04728383163303347 },\n { x: 0.00000769999999999898, y: 0.05032094690383092 },\n { x: 0.00000770099999999898, y: 0.0559866408783624 },\n { x: 0.00000770199999999898, y: 0.019395711944496637 },\n { x: 0.00000770299999999898, y: 0.016632591897018753 },\n { x: 0.000007703999999998981, y: 0.007924696645969405 },\n { x: 0.000007704999999998982, y: 0.04174617014399477 },\n { x: 0.000007705999999998982, y: 0.012036490384969293 },\n { x: 0.000007706999999998983, y: 0.03852745479281464 },\n { x: 0.000007707999999998983, y: -0.0014372534157544269 },\n { x: 0.000007708999999998984, y: 0.026181174619044744 },\n { x: 0.000007709999999998984, y: -0.01760225469367355 },\n { x: 0.000007710999999998985, y: 0.011413126994314975 },\n { x: 0.000007711999999998985, y: -0.014502699989748288 },\n { x: 0.000007712999999998986, y: -0.0017108503129400418 },\n { x: 0.000007713999999998986, y: 0.0445193429181658 },\n { x: 0.000007714999999998987, y: -0.012619364314126563 },\n { x: 0.000007715999999998987, y: 0.028376642518647098 },\n { x: 0.000007716999999998988, y: 0.035849345538410175 },\n { x: 0.000007717999999998988, y: 0.023629270732180258 },\n { x: 0.000007718999999998989, y: -0.012284780744528115 },\n { x: 0.00000771999999999899, y: 0.020828097089611333 },\n { x: 0.00000772099999999899, y: 0.04557571923451602 },\n { x: 0.00000772199999999899, y: 0.0425780433370441 },\n { x: 0.00000772299999999899, y: -0.007011633087120165 },\n { x: 0.000007723999999998991, y: 0.02788105907510139 },\n { x: 0.000007724999999998992, y: 0.057409955148969356 },\n { x: 0.000007725999999998992, y: 0.03858877117710563 },\n { x: 0.000007726999999998993, y: 0.054476967022339735 },\n { x: 0.000007727999999998993, y: 0.005778750610229295 },\n { x: 0.000007728999999998994, y: 0.05268105153052148 },\n { x: 0.000007729999999998994, y: 0.05636900577757886 },\n { x: 0.000007730999999998995, y: 0.04508946213480923 },\n { x: 0.000007731999999998995, y: 0.02480106274804994 },\n { x: 0.000007732999999998996, y: 0.0279322807714678 },\n { x: 0.000007733999999998996, y: 0.05045198267856109 },\n { x: 0.000007734999999998997, y: 0.01548853735363388 },\n { x: 0.000007735999999998997, y: 0.042582548333932546 },\n { x: 0.000007736999999998998, y: 0.0381994780432959 },\n { x: 0.000007737999999998998, y: -0.015444508336462933 },\n { x: 0.000007738999999998999, y: 0.0558933507230641 },\n { x: 0.000007739999999999, y: -0.0008775844249095145 },\n { x: 0.000007740999999999, y: 0.05859153378138359 },\n { x: 0.000007741999999999, y: 0.045375737791050946 },\n { x: 0.000007742999999999, y: 0.03675973078634645 },\n { x: 0.000007743999999999001, y: 0.02547984382966473 },\n { x: 0.000007744999999999002, y: 0.04435092675313653 },\n { x: 0.000007745999999999002, y: -0.012938892968024234 },\n { x: 0.000007746999999999003, y: 0.010184716686544242 },\n { x: 0.000007747999999999003, y: 0.03879746076217398 },\n { x: 0.000007748999999999004, y: 0.017701820635475186 },\n { x: 0.000007749999999999004, y: 0.04656749345894277 },\n { x: 0.000007750999999999005, y: 0.03136289959237096 },\n { x: 0.000007751999999999005, y: 0.031112004252844695 },\n { x: 0.000007752999999999006, y: 0.028046216631737727 },\n { x: 0.000007753999999999006, y: 0.02210375364385562 },\n { x: 0.000007754999999999007, y: -0.005203922641432282 },\n { x: 0.000007755999999999007, y: 0.02475813174325188 },\n { x: 0.000007756999999999008, y: -0.010332988976684408 },\n { x: 0.000007757999999999008, y: -0.007491358019963458 },\n { x: 0.000007758999999999009, y: 0.037208682834586324 },\n { x: 0.00000775999999999901, y: 0.006282013864344023 },\n { x: 0.00000776099999999901, y: 0.03753684339186861 },\n { x: 0.00000776199999999901, y: 0.03045152075241148 },\n { x: 0.00000776299999999901, y: 0.011530639911663377 },\n { x: 0.000007763999999999011, y: 0.024311025331901152 },\n { x: 0.000007764999999999012, y: 0.002215046336795652 },\n { x: 0.000007765999999999012, y: 0.03802840991482098 },\n { x: 0.000007766999999999013, y: 0.01007749563498892 },\n { x: 0.000007767999999999013, y: 0.004688473023074728 },\n { x: 0.000007768999999999014, y: -0.013099934734618016 },\n { x: 0.000007769999999999014, y: 0.027827802352301884 },\n { x: 0.000007770999999999015, y: 0.009426777943462174 },\n { x: 0.000007771999999999015, y: 0.021110600853828817 },\n { x: 0.000007772999999999016, y: 0.031218882406842556 },\n { x: 0.000007773999999999016, y: 0.031411969185098886 },\n { x: 0.000007774999999999017, y: 0.05129289786532706 },\n { x: 0.000007775999999999017, y: 0.04063580840095517 },\n { x: 0.000007776999999999018, y: 0.024419811186231967 },\n { x: 0.000007777999999999018, y: 0.055769883039295656 },\n { x: 0.000007778999999999019, y: 0.03175411328558628 },\n { x: 0.00000777999999999902, y: 0.05184407607598709 },\n { x: 0.00000778099999999902, y: 0.048874249361466705 },\n { x: 0.00000778199999999902, y: 0.04883436208297441 },\n { x: 0.00000778299999999902, y: -0.012539527222049655 },\n { x: 0.000007783999999999021, y: 0.03913945653469793 },\n { x: 0.000007784999999999022, y: 0.05019826558092637 },\n { x: 0.000007785999999999022, y: 0.006752722659745917 },\n { x: 0.000007786999999999023, y: 0.045161348783275476 },\n { x: 0.000007787999999999023, y: 0.0409106911546238 },\n { x: 0.000007788999999999024, y: -0.004457631635826964 },\n { x: 0.000007789999999999024, y: 0.051363065750822015 },\n { x: 0.000007790999999999025, y: 0.0072704525128081746 },\n { x: 0.000007791999999999025, y: 0.03599420204123263 },\n { x: 0.000007792999999999026, y: -0.009904198581136607 },\n { x: 0.000007793999999999026, y: 0.05086274757800156 },\n { x: 0.000007794999999999027, y: 0.0476131453135 },\n { x: 0.000007795999999999027, y: 0.0037769072025102407 },\n { x: 0.000007796999999999028, y: 0.029802713056474722 },\n { x: 0.000007797999999999028, y: 0.0417024074756982 },\n { x: 0.000007798999999999029, y: 0.05540923174404717 },\n { x: 0.00000779999999999903, y: 0.05202366045281162 },\n { x: 0.00000780099999999903, y: 0.01130822852809163 },\n { x: 0.00000780199999999903, y: -0.013233837063023893 },\n { x: 0.00000780299999999903, y: 0.05086178414384361 },\n { x: 0.000007803999999999031, y: 0.007362279469459287 },\n { x: 0.000007804999999999032, y: 0.048319179140476856 },\n { x: 0.000007805999999999032, y: -0.00822210383778441 },\n { x: 0.000007806999999999033, y: 0.025670399599903814 },\n { x: 0.000007807999999999033, y: 0.001203379975189836 },\n { x: 0.000007808999999999034, y: 0.060469449985909 },\n { x: 0.000007809999999999034, y: 0.031268240329472875 },\n { x: 0.000007810999999999035, y: 0.03578571754426271 },\n { x: 0.000007811999999999035, y: 0.005189839651818642 },\n { x: 0.000007812999999999036, y: 0.013976523106403611 },\n { x: 0.000007813999999999036, y: 0.03159522292271111 },\n { x: 0.000007814999999999037, y: -0.009812905457127607 },\n { x: 0.000007815999999999037, y: 0.013376218328183078 },\n { x: 0.000007816999999999038, y: 0.004157880715999707 },\n { x: 0.000007817999999999038, y: 0.035815647141656894 },\n { x: 0.000007818999999999039, y: 0.05873553634626 },\n { x: 0.000007819999999999039, y: 0.0022676561863314883 },\n { x: 0.00000782099999999904, y: 0.020510670694557677 },\n { x: 0.00000782199999999904, y: 0.024508532011373284 },\n { x: 0.00000782299999999904, y: 0.045025773671920996 },\n { x: 0.000007823999999999041, y: 0.029951701582998633 },\n { x: 0.000007824999999999042, y: 0.03397588706260915 },\n { x: 0.000007825999999999042, y: 0.05618288672796291 },\n { x: 0.000007826999999999043, y: 0.00936978530659504 },\n { x: 0.000007827999999999043, y: 0.029439010786099114 },\n { x: 0.000007828999999999044, y: 0.02374952405800666 },\n { x: 0.000007829999999999044, y: -0.010207023202618452 },\n { x: 0.000007830999999999045, y: 0.0008811106276202102 },\n { x: 0.000007831999999999045, y: 0.05177504426499105 },\n { x: 0.000007832999999999046, y: 0.021697625329325457 },\n { x: 0.000007833999999999046, y: -0.0019407255688146559 },\n { x: 0.000007834999999999047, y: 0.05151867456724748 },\n { x: 0.000007835999999999047, y: -0.0036660133149483305 },\n { x: 0.000007836999999999048, y: 0.018607507507157266 },\n { x: 0.000007837999999999048, y: 0.0372279393384259 },\n { x: 0.000007838999999999049, y: 0.03748309089185409 },\n { x: 0.000007839999999999049, y: 0.05452296644040515 },\n { x: 0.00000784099999999905, y: 0.03969168675630745 },\n { x: 0.00000784199999999905, y: 0.05511777929415575 },\n { x: 0.00000784299999999905, y: 0.06131000386865333 },\n { x: 0.000007843999999999051, y: 0.0008756484931444243 },\n { x: 0.000007844999999999052, y: 0.01445727818493984 },\n { x: 0.000007845999999999052, y: 0.041360827320049504 },\n { x: 0.000007846999999999053, y: 0.005959631337519481 },\n { x: 0.000007847999999999053, y: 0.04074289921088947 },\n { x: 0.000007848999999999054, y: 0.061418744341436696 },\n { x: 0.000007849999999999054, y: -0.0010903634977960479 },\n { x: 0.000007850999999999055, y: -0.010081540029769857 },\n { x: 0.000007851999999999055, y: -0.010914217715337377 },\n { x: 0.000007852999999999056, y: 0.0010120627226539794 },\n { x: 0.000007853999999999056, y: 0.018722247032854158 },\n { x: 0.000007854999999999057, y: 0.00906280646278798 },\n { x: 0.000007855999999999057, y: 0.017077871742720623 },\n { x: 0.000007856999999999058, y: 0.03558183728968866 },\n { x: 0.000007857999999999058, y: 0.014210897125441276 },\n { x: 0.000007858999999999059, y: 0.05495359216495571 },\n { x: 0.000007859999999999059, y: 0.0018870619423871325 },\n { x: 0.00000786099999999906, y: 0.05736083411579576 },\n { x: 0.00000786199999999906, y: 0.03590821512713628 },\n { x: 0.00000786299999999906, y: 0.03450245061322651 },\n { x: 0.000007863999999999061, y: -0.00814463049788602 },\n { x: 0.000007864999999999062, y: 0.022473123382872953 },\n { x: 0.000007865999999999062, y: -0.003248763086752357 },\n { x: 0.000007866999999999063, y: 0.013835411450095206 },\n { x: 0.000007867999999999063, y: 0.06002764997563929 },\n { x: 0.000007868999999999064, y: 0.05820367389921274 },\n { x: 0.000007869999999999064, y: 0.0377107232983148 },\n { x: 0.000007870999999999065, y: 0.001080100461624784 },\n { x: 0.000007871999999999065, y: 0.02269997811561928 },\n { x: 0.000007872999999999066, y: -0.008949483380953145 },\n { x: 0.000007873999999999066, y: -0.007254745378965154 },\n { x: 0.000007874999999999067, y: -0.008721772415156082 },\n { x: 0.000007875999999999067, y: 0.04103177633082947 },\n { x: 0.000007876999999999068, y: 0.05048931037349442 },\n { x: 0.000007877999999999068, y: 0.058958010346682244 },\n { x: 0.000007878999999999069, y: -0.0115174370675173 },\n { x: 0.000007879999999999069, y: -0.0027931515839453303 },\n { x: 0.00000788099999999907, y: 0.03312929463196517 },\n { x: 0.00000788199999999907, y: 0.04331367491296444 },\n { x: 0.00000788299999999907, y: 0.022830339622249177 },\n { x: 0.000007883999999999071, y: 0.00977155855452738 },\n { x: 0.000007884999999999072, y: -0.0010471104747204578 },\n { x: 0.000007885999999999072, y: -0.0041364148772614975 },\n { x: 0.000007886999999999073, y: 0.012677395112630649 },\n { x: 0.000007887999999999073, y: 0.04330700174525166 },\n { x: 0.000007888999999999074, y: -0.004625019110908991 },\n { x: 0.000007889999999999074, y: 0.05766676431510688 },\n { x: 0.000007890999999999075, y: 0.027243821376849643 },\n { x: 0.000007891999999999075, y: 0.031299601613999396 },\n { x: 0.000007892999999999076, y: 0.03779368310848319 },\n { x: 0.000007893999999999076, y: 0.012969531847962608 },\n { x: 0.000007894999999999077, y: 0.005545400182819873 },\n { x: 0.000007895999999999077, y: 0.04874776257086391 },\n { x: 0.000007896999999999078, y: -0.0073332341360738545 },\n { x: 0.000007897999999999078, y: 0.024210154552340327 },\n { x: 0.000007898999999999079, y: 0.01799733573125864 },\n { x: 0.000007899999999999079, y: -0.007543973671310669 },\n { x: 0.00000790099999999908, y: 0.026921935233092532 },\n { x: 0.00000790199999999908, y: 0.05021230345670767 },\n { x: 0.00000790299999999908, y: 0.05463573667112673 },\n { x: 0.000007903999999999081, y: 0.00953585836873683 },\n { x: 0.000007904999999999082, y: 0.05287629394823225 },\n { x: 0.000007905999999999082, y: 0.0009692759758983087 },\n { x: 0.000007906999999999083, y: 0.011357120029424893 },\n { x: 0.000007907999999999083, y: 0.005085014891919797 },\n { x: 0.000007908999999999084, y: 0.051770801739135675 },\n { x: 0.000007909999999999084, y: 0.012314550038175808 },\n { x: 0.000007910999999999085, y: 0.05607228620256005 },\n { x: 0.000007911999999999085, y: 0.014274322095509974 },\n { x: 0.000007912999999999086, y: 0.02026228050542361 },\n { x: 0.000007913999999999086, y: 0.006623927401461248 },\n { x: 0.000007914999999999087, y: 0.004023098577084459 },\n { x: 0.000007915999999999087, y: 0.023657776545005123 },\n { x: 0.000007916999999999088, y: 0.02641928242407151 },\n { x: 0.000007917999999999088, y: 0.014311615245716058 },\n { x: 0.000007918999999999088, y: 0.032271971321202485 },\n { x: 0.000007919999999999089, y: 0.03525585207965565 },\n { x: 0.00000792099999999909, y: 0.016018419516724655 },\n { x: 0.00000792199999999909, y: 0.03282530104177738 },\n { x: 0.00000792299999999909, y: 0.05681693447647093 },\n { x: 0.000007923999999999091, y: -0.0032993832898068516 },\n { x: 0.000007924999999999091, y: -0.013710217354184047 },\n { x: 0.000007925999999999092, y: -0.017386206323801223 },\n { x: 0.000007926999999999092, y: -0.016078173977449976 },\n { x: 0.000007927999999999093, y: 0.04044817079314449 },\n { x: 0.000007928999999999093, y: 0.015769346966996937 },\n { x: 0.000007929999999999094, y: 0.005834023923001967 },\n { x: 0.000007930999999999094, y: 0.024876498211160235 },\n { x: 0.000007931999999999095, y: 0.0001635946419980376 },\n { x: 0.000007932999999999095, y: -0.016449592222643028 },\n { x: 0.000007933999999999096, y: 0.0515092338916977 },\n { x: 0.000007934999999999096, y: 0.04848429344123602 },\n { x: 0.000007935999999999097, y: 0.04426017462735836 },\n { x: 0.000007936999999999097, y: -0.017023788603873883 },\n { x: 0.000007937999999999098, y: 0.04365549657593282 },\n { x: 0.000007938999999999098, y: 0.04002754833209317 },\n { x: 0.000007939999999999099, y: -0.01286436096612836 },\n { x: 0.0000079409999999991, y: 0.04276388978712044 },\n { x: 0.0000079419999999991, y: 0.027021217515152095 },\n { x: 0.0000079429999999991, y: 0.043786971344992986 },\n { x: 0.000007943999999999101, y: -0.012981778346742162 },\n { x: 0.000007944999999999101, y: 0.011770894364588454 },\n { x: 0.000007945999999999102, y: -0.0168482036233206 },\n { x: 0.000007946999999999102, y: -0.014984294860894778 },\n { x: 0.000007947999999999103, y: 0.03502531805514158 },\n { x: 0.000007948999999999103, y: 0.053076451917723144 },\n { x: 0.000007949999999999104, y: -0.004273155917371329 },\n { x: 0.000007950999999999104, y: 0.02446885539358464 },\n { x: 0.000007951999999999105, y: -0.01513073224237239 },\n { x: 0.000007952999999999105, y: -0.006394293499375203 },\n { x: 0.000007953999999999106, y: 0.007505311441084744 },\n { x: 0.000007954999999999106, y: -0.004892769924894121 },\n { x: 0.000007955999999999107, y: 0.003496511197928145 },\n { x: 0.000007956999999999107, y: 0.03203163074655121 },\n { x: 0.000007957999999999108, y: 0.000367262681439981 },\n { x: 0.000007958999999999108, y: -0.010262676311403554 },\n { x: 0.000007959999999999109, y: 0.02949507047575882 },\n { x: 0.00000796099999999911, y: -0.018137670088596073 },\n { x: 0.00000796199999999911, y: 0.020305544970873272 },\n { x: 0.00000796299999999911, y: 0.01619478593461053 },\n { x: 0.000007963999999999111, y: 0.002928196333172199 },\n { x: 0.000007964999999999111, y: 0.04674053821092112 },\n { x: 0.000007965999999999112, y: -0.011372329609377358 },\n { x: 0.000007966999999999112, y: 0.04612851816173901 },\n { x: 0.000007967999999999113, y: 0.05550999132552603 },\n { x: 0.000007968999999999113, y: 0.007698701301413112 },\n { x: 0.000007969999999999114, y: -0.01383957658287643 },\n { x: 0.000007970999999999114, y: 0.0329642004009498 },\n { x: 0.000007971999999999115, y: -0.000021489993732966978 },\n { x: 0.000007972999999999115, y: 0.020946453746142814 },\n { x: 0.000007973999999999116, y: -0.00477284417362369 },\n { x: 0.000007974999999999116, y: 0.04851129585001675 },\n { x: 0.000007975999999999117, y: 0.048625884607778155 },\n { x: 0.000007976999999999117, y: -0.01338099880397528 },\n { x: 0.000007977999999999118, y: 0.005940875110559175 },\n { x: 0.000007978999999999118, y: 0.03447464530500075 },\n { x: 0.000007979999999999119, y: 0.02207546143978787 },\n { x: 0.00000798099999999912, y: 0.0504179601999862 },\n { x: 0.00000798199999999912, y: 0.023104428080570664 },\n { x: 0.00000798299999999912, y: 0.030354992572024144 },\n { x: 0.000007983999999999121, y: 0.0023324452475153457 },\n { x: 0.000007984999999999121, y: 0.0029322408535889886 },\n { x: 0.000007985999999999122, y: 0.006766617209502232 },\n { x: 0.000007986999999999122, y: 0.02500720118399022 },\n { x: 0.000007987999999999123, y: 0.009414604832344017 },\n { x: 0.000007988999999999123, y: -0.015264915093247358 },\n { x: 0.000007989999999999124, y: -0.010696550061412832 },\n { x: 0.000007990999999999124, y: 0.006208991669481198 },\n { x: 0.000007991999999999125, y: -0.019506698888068875 },\n { x: 0.000007992999999999125, y: 0.012066969489951392 },\n { x: 0.000007993999999999126, y: 0.049434006499191725 },\n { x: 0.000007994999999999126, y: 0.009422370828351928 },\n { x: 0.000007995999999999127, y: 0.04350923500164221 },\n { x: 0.000007996999999999127, y: 0.032772823526568795 },\n { x: 0.000007997999999999128, y: 0.04697816781838182 },\n { x: 0.000007998999999999128, y: -0.011329641578143219 },\n { x: 0.000007999999999999129, y: -0.016427746917131558 },\n])\n","url":null,"readme":"This example shows how to display high-resolution data - for example, measurements in microseconds precision.\n\nWhen displaying high-resolution data there is a need to do some scaling to the data before adding it to a series.\nLightningChart JS Axis is limited by floating point precision so when using really small or really large values there is a need to scale the values to be closer to 0.\n\n```js\nconst dataScaleX = 1 * Math.pow(1000, 3) // 1 us\nconst renderData = (data) => {\n // Add data.\n lineSeries.add(data.map((p) => ({ x: p.x * dataScaleX, y: p.y })))\n}\n```\n\nWhen the data is scaled closer to 0 then the LightningChart JS Axis is able to function properly but the values shown in the auto-cursor would be incorrect as it would show the scaled value, not the original. This can be fixed by setting a formatting function to the axis tick strategy.\n\n```js\nlineSeries.axisX.setTickStrategy(AxisTickStrategies.Numeric, (strategy) =>\n strategy\n // Format ticks with units.\n .setFormattingFunction((timeScaled) => Math.round(timeScaled) + ' μs'),\n)\n```\n\nAlternatively if the original value would be preferred then the scaling could be undone.\n\n```js\nlineSeries.axisX.setTickStrategy(AxisTickStrategies.Numeric, (strategy) =>\n strategy.setFormattingFunction((timeScaled) => timeScaled / dataScaleX),\n)\n```\n","image":"lineSeriesMicroseconds"},{"id":"lcjs-example-0009-severalAxisXY","title":"Several AxesXY","tags":["line","xy"],"description":"Several AxesXY chart can be used to compare or see several graphs.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example for several AxisXY\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, SolidFill, SolidLine, ColorRGBA, Themes } = lcjs\n\nconst { createProgressiveRandomGenerator } = xydata\n\nconst ls = lightningChart()\n\nconst chart = ls\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Several Axis')\n\n// Cache colors used in the example\nconst blueFill = new SolidFill({ color: ColorRGBA(0, 0, 255) })\nconst greenFill = new SolidFill({ color: ColorRGBA(0, 255, 0) })\nconst redFill = new SolidFill({ color: ColorRGBA(255, 0, 0) })\n\n// Cache StrokeStyles used in the example\nconst blueLine = new SolidLine({ fillStyle: blueFill })\nconst greenLine = new SolidLine({ fillStyle: greenFill })\nconst redLine = new SolidLine({ fillStyle: redFill })\n\n// First Axes (default)\nconst axisX1 = chart\n .getDefaultAxisX()\n // Set title of Axis\n .setTitle('Axis X1')\n // Set interval of X axis\n .setInterval({ start: -10, end: 1300 })\n .setStrokeStyle(blueLine)\n\nconst axisY1 = chart\n .getDefaultAxisY()\n // Set title of Axis\n .setTitle('Axis Y1')\n // Set interval of Y axis\n .setInterval({ start: -150, end: 100 })\n .setStrokeStyle(blueLine)\n\n// Second Axes (extra)\nconst axisX2 = chart\n .addAxisX({\n opposite: true,\n })\n .setTitle('Axis X2')\n .setInterval({ start: -60, end: 500 })\n .setStrokeStyle(greenLine)\n\nconst axisY2 = chart\n .addAxisY({\n opposite: true,\n })\n .setTitle('Axis Y2')\n .setInterval({ start: -20, end: 200 })\n .setStrokeStyle(greenLine)\n\n// Create series with explicit axes.\n// Axes 1\nconst splineSeries1 = chart\n .addSplineSeries({\n xAxis: axisX1,\n yAxis: axisY1,\n })\n .setStrokeStyle(redLine)\n .setPointFillStyle(blueFill)\n .setName('Axis 1')\n\n// Axes 2\nconst splineSeries2 = chart\n .addSplineSeries({\n xAxis: axisX2,\n yAxis: axisY2,\n })\n .setStrokeStyle(greenLine)\n .setName('Axis 2')\n\n// Function to add random values to given series with createProgressiveRandomGenerator\nconst setSeries = (amountOfDots, splineSeries) => {\n createProgressiveRandomGenerator()\n .setNumberOfPoints(amountOfDots)\n .generate()\n // Set stream to output X points at a time\n .setStreamBatchSize(amountOfDots)\n // Create a new stream with previously defined stream settings\n .toStream()\n .forEach((point, i) => {\n ;(point.x = point.x * 5), // define X coordinates for point\n (point.y = 20 * Math.sin(i / (10 * Math.PI)) + Math.floor(Math.random() * 20)) // define Y coordinates for point\n splineSeries.add(point) // add to series\n })\n}\n\n// set Series 1\nsetSeries(250, splineSeries1)\n\n// set Series 2\nsetSeries(70, splineSeries2)\n","url":null,"readme":"_Several Axes XY chart_\n\nThis example shows creation of a Chart with 2 XY Axes. This Chart can be used to compare or see several graphs\n\nHere's the creation of a 2 XY Axes Chart.\n\n```javascript\n// Create Chart.\nconst chart = lightningChart().ChartXY()\n// Get references to default axes X and Y\nconst axisX1 = chart.getDefaultAxisX()\nconst axisX1 = chart.getDefaultAxisY()\n// Create extra axes X and Y\nconst axisX2 = chart.addAxisX({\n opposite: true,\n})\nconst axisX2 = chart.addAxisY({\n opposite: true,\n})\n// Create series with explicit axes.\nconst splineSeries1 = chart.addSplineSeries({\n xAxis: axisX1,\n yAxis: axisY1,\n})\nconst splineSeries2 = chart.addSplineSeries({\n xAxis: axisX2,\n yAxis: axisY2,\n})\n// Set values of sub-categories on categories (relative Y size).\nsplineSeries1.add({ x: 0, y: 0.4 })\nsplineSeries2.add({ x: 2, y: 0.6 })\n```\n","image":"severalAxesXY"},{"id":"lcjs-example-0010-multiChannelLineProgressive","title":"Real-time data monitoring JavaScript Chart","tags":["line","xy","realtime","datapattern","datacleaning"],"description":"Lightning-fast Line Chart visualization over multiple channels that progress on the same X and Y Axes","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example for multi-channel real-time monitoring Line Chart.\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Import data Generator\nconst { createProgressiveFunctionGenerator } = xydata\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, SolidFill, SolidLine, AxisScrollStrategies, AxisTickStrategies, ColorRGBA, emptyFill, Themes } = lcjs\n\nconst DATA_FREQUENCY_HZ = 1000\nconst CHANNELS_AMOUNT = 10\nconst xIntervalMax = 30 * DATA_FREQUENCY_HZ\nconst channelIntervalY = 2 // [-1, 1]\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle(`Multi-channel real-time monitoring (${CHANNELS_AMOUNT} chs, ${DATA_FREQUENCY_HZ} Hz)`)\nconst axisX = chart\n .getDefaultAxisX()\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - xIntervalMax, stopAxisAfter: false }))\n .setTitle('Data points per channel')\nconst axisY = chart\n .getDefaultAxisY()\n .setTickStrategy(AxisTickStrategies.Empty)\n .setTitle('< Channels >')\n .setScrollStrategy(AxisScrollStrategies.expansion)\n .setInterval({ start: -channelIntervalY / 2, end: CHANNELS_AMOUNT * channelIntervalY, stopAxisAfter: false })\n\nconst series = new Array(CHANNELS_AMOUNT).fill(0).map((_, iChannel) => {\n // Create line series optimized for regular progressive X data.\n const nSeries = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n })\n .setName(`Channel ${iChannel + 1}`)\n .setAreaFillStyle(emptyFill)\n // Use -1 thickness for best performance, especially on low end devices like mobile / laptops.\n .setStrokeStyle((style) => style.setThickness(-1))\n .setMouseInteractions(false)\n .setMaxSampleCount(xIntervalMax)\n\n // Add custom tick for each channel.\n chart\n .getDefaultAxisY()\n .addCustomTick()\n .setValue((CHANNELS_AMOUNT - (1 + iChannel)) * channelIntervalY)\n .setTextFormatter(() => `Channel ${iChannel + 1}`)\n .setGridStrokeStyle(\n new SolidLine({\n thickness: 1,\n fillStyle: new SolidFill({ color: ColorRGBA(255, 255, 255, 60) }),\n }),\n )\n\n return nSeries\n})\n\n// Add LegendBox.\nchart\n .addLegendBox()\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n\n// Define unique signals that will be used for channels.\nconst signals = [\n { length: 100 * 2 * Math.PI, func: (x) => Math.sin(x / 100) },\n { length: 100 * 2 * Math.PI, func: (x) => Math.cos(x / 100) },\n {\n length: 200 * 2 * Math.PI,\n func: (x) => Math.cos(x / 200) + Math.sin(x / 100),\n },\n {\n length: 200 * 2 * Math.PI,\n func: (x) => Math.sin(x / 50) + Math.cos(x / 200),\n },\n {\n length: 200 * 2 * Math.PI,\n func: (x) => Math.sin(x / 100) * Math.cos(x / 200),\n },\n { length: 450 * 2 * Math.PI, func: (x) => Math.cos(x / 450) },\n { length: 800 * 2 * Math.PI, func: (x) => Math.sin(x / 800) },\n {\n length: 650 * 2 * Math.PI,\n func: (x) => Math.sin(x / 200) * Math.cos(x / 650),\n },\n]\n\n// Generate data sets for each signal.\nPromise.all(\n signals.map((signal) =>\n createProgressiveFunctionGenerator()\n .setStart(0)\n .setEnd(signal.length)\n .setStep(1)\n .setSamplingFunction(signal.func)\n .generate()\n .toPromise()\n .then((data) => data.map((xy) => xy.y)),\n ),\n).then((dataSets) => {\n // Stream data into series.\n let tStart = window.performance.now()\n let pushedDataCount = 0\n const xStep = 1000 / DATA_FREQUENCY_HZ\n const streamData = () => {\n const tNow = window.performance.now()\n // NOTE: This code is for example purposes (streaming stable data rate without destroying browser when switching tabs etc.)\n // In real use cases, data should be pushed in when it comes.\n const shouldBeDataPointsCount = Math.floor((DATA_FREQUENCY_HZ * (tNow - tStart)) / 1000)\n const newDataPointsCount = Math.min(shouldBeDataPointsCount - pushedDataCount, 1000) // Add max 1000 data points per frame into a series. This prevents massive performance spikes when switching tabs for long times\n const seriesNewDataPoints = []\n for (let iChannel = 0; iChannel < series.length; iChannel++) {\n const dataSet = dataSets[iChannel % dataSets.length]\n const newDataPoints = []\n for (let iDp = 0; iDp < newDataPointsCount; iDp++) {\n const x = (pushedDataCount + iDp) * xStep\n const iData = (pushedDataCount + iDp) % dataSet.length\n const ySignal = dataSet[iData]\n const y = (CHANNELS_AMOUNT - 1 - iChannel) * channelIntervalY + ySignal\n const point = { x, y }\n newDataPoints.push(point)\n }\n seriesNewDataPoints[iChannel] = newDataPoints\n }\n series.forEach((series, iChannel) => series.appendJSON(seriesNewDataPoints[iChannel]))\n pushedDataCount += newDataPointsCount\n requestAnimationFrame(streamData)\n }\n streamData()\n})\n\n// Measure FPS.\nlet tStart = window.performance.now()\nlet frames = 0\nlet fps = 0\nconst title = chart.getTitle()\nconst recordFrame = () => {\n frames++\n const tNow = window.performance.now()\n fps = 1000 / ((tNow - tStart) / frames)\n sub_recordFrame = requestAnimationFrame(recordFrame)\n\n chart.setTitle(`${title} (FPS: ${fps.toFixed(1)})`)\n}\nlet sub_recordFrame = requestAnimationFrame(recordFrame)\nsetInterval(() => {\n tStart = window.performance.now()\n frames = 0\n}, 5000)\n","url":null,"readme":"_Multi-channel real-time data monitoring Line Chart_\n\nLightning-fast Line Chart visualization over multiple channels that progress on the same X Axis\n\nWidely used in all kinds of fields for monitoring live data from many (hundreds or even thousands) of data sources at the same time.\n\nFrames rendered per second (_FPS_) is recorded live, and displayed on the Chart title. FPS of 40-60 indicates a smooth running performance.\n\n## Automatic data cleaning\n\nIn infinitely scrolling applications, cleaning old out of view data is extremely crucial;\nin this example `LineSeries.setMaxPointsCount` method is used to enable automatic data cleaning.\nFor reference, see also `LineSeries.setDataCleaningThreshold`.\n\nThe `setMaxPointsCount` method sets the _amount of data points_, that will always be retained in the _series head_ (latest data).\nThe full conditions for valid _data cleaning_ are:\n\n1. There is a considerably large chunk of data out of view (visible data is not cleaned!).\n2. If the chunk is removed, the amount of data that remains is still more than _max points count_.\n\nIn practice, this results in an application where you can even scroll back for some distance and see older data, but if you scroll far enough, you will find that the old data has been _cleaned_. This allows the application to run _forever_!\n","image":"multiChannelLineProgressive"},{"id":"lcjs-example-0011-customTicksScrolling","title":"Custom ticks on scrolling X Axis","tags":["line","xy","axis","realtime","customtick"],"description":"Custom tick positioning logic on a scrolling Axis.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases a simulated ECG signal.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisScrollStrategies, AxisTickStrategies, UIElementBuilders, Themes } = lcjs\n\n// Import data-generators from 'xydata'-library.s\nconst { createProgressiveTraceGenerator } = xydata\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Custom X ticks with scrolling Axis')\n\n// Create line series optimized for regular progressive X data.\nconst series = chart.addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n // regularProgressiveStep: true => The X step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n})\n\n// * Manage X Axis ticks with custom logic *\n// Disable default X ticks.\nconst xAxis = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Empty)\n\nconst addCustomTickX = (pos, isMinor) => {\n const tick = xAxis\n .addCustomTick(isMinor ? UIElementBuilders.AxisTickMinor : UIElementBuilders.AxisTickMajor)\n // Set tick text.\n .setTextFormatter(() => String(pos))\n // Set tick location.\n .setValue(pos)\n customTicks.push(tick)\n return tick\n}\n\n// Create custom ticks on X Axis on realtime scrolling application.\nlet customTicks = []\nconst createTicksInRangeX = (start, end) => {\n // Major ticks every 1000 units.\n const majorTickInterval = 1000\n for (let majorTickPos = start - (start % majorTickInterval); majorTickPos <= end; majorTickPos += majorTickInterval) {\n if (majorTickPos >= start) {\n addCustomTickX(majorTickPos, false)\n }\n }\n // Major ticks every 100 units, but not at same interval as major ticks.\n const minorTickInterval = 100\n for (let minorTickPos = start - (start % minorTickInterval); minorTickPos <= end; minorTickPos += minorTickInterval) {\n if (minorTickPos >= start && minorTickPos % majorTickInterval !== 0) {\n addCustomTickX(minorTickPos, true)\n }\n }\n}\n// X range until which custom ticks are valid.\nlet customTicksPos = 0\nxAxis.onIntervalChange((_, start, end) => {\n // Ensure new ticks are created.\n if (end > customTicksPos) {\n createTicksInRangeX(customTicksPos, end)\n customTicksPos = end\n }\n\n // Destroy ticks that are out of scrolling range.\n customTicks = customTicks.filter((tick) => {\n if (tick.getValue() < start) {\n // Tick is out of view.\n tick.dispose()\n return false\n } else {\n return true\n }\n })\n})\n\n// Setup X Axis as progressive scrolling.\nxAxis\n .setTitle('X Axis (custom ticks)')\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 1400, stopAxisAfter: false }))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\nchart.getDefaultAxisY().setTitle('Y Axis')\n\n// Stream data in.\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(10000)\n .generate()\n .setStreamRepeat(true)\n .setStreamInterval(1000 / 60)\n .setStreamBatchSize(5)\n .toStream()\n .forEach((point) => {\n series.add(point)\n })\n","url":null,"readme":"_Custom ticks on scrolling X Axis_\n\nThis example showcases custom tick positioning on a scrolling Axis.\n\nBoth major and minor ticks on X Axis are created in application code, and destroyed as the axis scrolls.\n","image":"customTicksScrolling"},{"id":"lcjs-example-0012-timeTickStrategy","title":"JavaScript Time Ticks Chart","tags":["xy","axis","time","line"],"description":"Example showcasing the TimeTickStrategy feature which is ideal for displaying timestamp data between couple days all the way down to microseconds level.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example showcasing the TimeTickStrategy feature which is ideal for displaying timestamp data between couple days all the way down to microseconds level.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\n// Import data-generators from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = xydata\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('TimeTickStrategy example')\n .setPadding({ right: 40 })\n\nconst axisX = chart\n .getDefaultAxisX()\n // Enable TimeTickStrategy for X Axis.\n .setTickStrategy(AxisTickStrategies.Time)\n\nconst axisY = chart.getDefaultAxisY()\n\nconst series = chart.addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n})\n\nconst legend = chart\n .addLegendBox()\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n\n// Generate ~8 hours of data for line series.\nconst numberOfPoints = 100 * 1000\n// TimeTickStrategy interprets values as milliseconds (UNIX timestamp).\nconst xInterval = 8 * 60 * 60 * 1000\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(numberOfPoints)\n .generate()\n .toPromise()\n .then((data) => {\n data = data.map((p) => ({\n x: (p.x * xInterval) / numberOfPoints,\n y: p.y,\n }))\n series.add(data)\n })\n","url":null,"readme":"Example that showcases the `TimeTickStrategy` feature.\n\n`TimeTickStrategy` is one of the available options for _automatic axis tick placement and formatting_. It is designed for depicting milliseconds timestamp data with extremely high resolution and flexibility.\n\nThe effective range of `TimeTickStrategy` starts from maximum of 100 hours all the way down to individual milliseconds level.\n\nFor this entire range, the tick labels are formatted dynamically showing the currently relevant precision with all the required accuracy.\n\nAs can be seen from the simplicity of this examples source code, `TimeTickStrategy` is really straightforward to use, and does not require any gimmicks from the user.\n\n```js\n// TimeTickStrategy example usage.\n\n// (1) Enable TimeTickStrategy for Axis.\nchart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Time)\n\n// (2) Push data where X is in milliseconds.\nseries.add([\n { x: 0, y: 0 }, // 00:00:00\n { x: 1000, y: 0 }, // 00:00:01\n { x: 2000, y: 0 }, // 00:00:02\n { x: 2001, y: 0 }, // 00:00:02.001\n { x: 2001.001, y: 0 }, // 00:00:02.001001\n])\n```\n\n## What is the difference between Time ticks and DateTime ticks?\n\nThe effective Axis range; `TimeTickStrategy` is used for depicting high-resolution data within some days max., while `DateTimeStrategy` is used for depicting lower resolution data over the span of long times, like some months or even tens of years.\n","image":"timeTickStrategy"},{"id":"lcjs-example-0013-timeTickStrategyScrolling","title":"JavaScript Scrolling Time Ticks Chart","tags":["xy","axis","time","line","realtime"],"description":"Example showcasing the TimeTickStrategy feature with scrolling data and axis","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example showcasing the TimeTickStrategy feature with scrolling data and axis.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisScrollStrategies, AxisTickStrategies, Themes } = lcjs\n\n// Import data-generators from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = xydata\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Scrolling TimeTickStrategy example')\n .setPadding({ right: 40 })\n\nconst axisX = chart\n .getDefaultAxisX()\n // Enable TimeTickStrategy for X Axis.\n .setTickStrategy(AxisTickStrategies.Time)\n // Configure progressive ScrollStrategy.\n .setScrollStrategy(AxisScrollStrategies.progressive)\n // Set view to 1 minute.\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 1 * 60 * 1000, stopAxisAfter: false }))\n .setAnimationScroll(false)\n\nconst axisY = chart.getDefaultAxisY().setAnimationScroll(false)\n\n// Add 3 series for real-time signal monitoring.\nconst seriesList = new Array(3).fill(0).map((_, iSeries) =>\n chart.addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n }),\n)\n\nconst legend = chart\n .addLegendBox()\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n\n// Stream live timestamp data into series.\n\n// Application displays timestamps as offset from when application started (starts at 00:00:00).\nconst timeOrigin = Date.now()\n\nPromise.all(\n seriesList.map((_) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(60 * 1000)\n .generate()\n .toPromise(),\n ),\n).then((data) => {\n let dataAmount = 0\n const pushData = () => {\n const nDataPoints = 1\n seriesList.forEach((series, iSeries) => {\n const seriesData = data[iSeries]\n const seriesPoints = []\n for (let i = 0; i < nDataPoints; i += 1) {\n seriesPoints.push({\n // TimeTickStrategy interprets values as milliseconds (UNIX timestamp).\n // Exactly same as JavaScript Date APIs.\n x: Date.now() - timeOrigin,\n y: seriesData[(dataAmount + i) % seriesData.length].y,\n })\n }\n series.add(seriesPoints)\n })\n dataAmount += nDataPoints\n requestAnimationFrame(pushData)\n }\n pushData()\n})\n","url":null,"readme":"Example that showcases the `TimeTickStrategy` feature with real-time data.\n\n`TimeTickStrategy` is one of the available options for _automatic axis tick placement and formatting_. It is designed for depicting milliseconds timestamp data with extremely high resolution and flexibility.\n\nThe effective range of `TimeTickStrategy` starts from maximum of 100 hours all the way down to **individual milliseconds level**.\n\nFor this entire range, the tick labels are formatted dynamically showing the currently relevant precision with all the required accuracy.\n\n`TimeTickStrategy` is a very powerful feature for real-time data monitoring applications, since its effective range perfectly covers minute, hour and even day intervals - not to mention that you can zoom in so deep that you can even see differences between individual microseconds.\n\nSince `TimeTickStrategy` interprets axis coordinates as \"milliseconds after 0\", it doesn't make much sense to supply data directly as UNIX timestamps - instead, most applications would choose some \"time origin\" and subtract it from the UNIX timestamp. This means that the data will be displayed as \"difference from time origin\".\n\nIn this example, `timeOrigin` is set to `Date.now()` at the start, and data point X values are calculated live as `x: Date.now() - timeOrigin`.\n\n## What is the difference between Time ticks and DateTime ticks?\n\nThe effective Axis range; `TimeTickStrategy` is used for depicting high-resolution data within some days max., while `DateTimeStrategy` is used for depicting lower resolution data over the span of long times, like some months or even tens of years.\n","image":"timeTickStrategyScrolling"},{"id":"lcjs-example-0014-highPrecisionAxis","title":"JavaScript High Precision Axis Chart","tags":["xy","axis","line","high-precision"],"description":"Example showcasing the High Precision Axis XY feature which allows zooming of microseconds precision without any dirty data transforming","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example showcasing the High Precision Axis XY feature which allows zooming of microseconds precision without any dirty data transforming\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n defaultAxisX: {\n type: 'linear-highPrecision',\n },\n })\n .setTitle('High precision Axis XY (1 second high-resolution data)')\n .setPadding({ right: 40 })\n\nconst axisX = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Time, (timeTicks) => timeTicks)\n\nconst axisY = chart.getDefaultAxisY()\n\nconst trace0 = chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .setCursorInterpolationEnabled(true)\n\nconst trace1 = chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .setCursorInterpolationEnabled(true)\n\nchart\n .addLegendBox()\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n\n// Fetch example data.\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0014/data.json')\n .then((r) => r.json())\n .then((data) => {\n // Data X coordinates are in milliseconds starting from 0.\n trace0.add(data['trace0'])\n trace1.add(data['trace1'])\n axisX.fit(false)\n\n // Animate zoom in.\n setTimeout(() => {\n axisX.setInterval({\n start: 436.72461163324084,\n end: 436.89107794426303,\n animate: 1000,\n })\n axisY.setInterval({\n start: 87.52113652316002,\n end: 89.79482263187646,\n animate: 1000,\n })\n\n // Animate zoom out.\n setTimeout(() => {\n axisX.fit(2000)\n axisY.fit(2000)\n }, 2500)\n }, 1500)\n })\n","url":null,"readme":"This example showcases the `High Precision Axis XY` feature.\n\nAn XY Axis can be marked with _high precision mode_ when it is created, similarly how _logarithmic axes_ are created.\nThis example shows how it is done for default X Axis.\n\n```javascript\nconst chart = lightningChart().ChartXY({\n // Default Axis types can only be defined when chart is created.\n defaultAxisX: {\n type: 'linear-highPrecision',\n },\n})\n```\n\n_High precision Axis_ behaves just like a normal linear Axis, but with two technical differences:\n\n1. There is a performance drop for all attached series. This is mostly an increase on GPU usage, which shows on low end devices the most, for example laptops with integrated GPUs.\n\n2. The Axis zoom range is _significantly_ improved (read more below).\n\n`High Precision Axis XY` currently supports all XY series types except `Heatmap Series`.\n\n## About Axis zoom range limits\n\n_LightningChart JS_ is easily the market leader in zooming interactions and visualization resolution, and contrary to most chart libraries, we are open about axis zooming limits.\n\nThe fact of the matter is that every kind of chart library has some limit to how small differences it can visualize. Ultimately the limits are dictated by the used technology (for us this is `WebGL`).\n\nAll veteran chart library developers have come across the issue sooner or later, when an user collides against this limit and the question is asked - how can we get higher precision? Usually this ends in decimating the end users data with tricks and gimmicks, which can lead to a working result but with the expense of user experience.\n\n`High Precision Axis XY` feature is our reaction to a proper improvement to these limitations - it handles all the annoying stuff that users had to previously do in their _application code_ and gives even better benefits;\n\nHere are reference tables to the achievable zoom range with normal Axis vs `High Precision Axis XY`\n(achievable zoom range depends on the magnitude of Axis interval start).\n\n### Normal Axis\n\n| Axis interval start | Min interval | Max interval |\n| :------------------ | :----------- | :----------- |\n| `0` | `1e-4` | `1e+16` |\n| `100` | `1e-2` | `1e+16` |\n| `10 000` | `1.00` | `1e+16` |\n| `1 000 000` | `100` | `1e+16` |\n| `Date.now()` (UNIX) | `73600000` | `1e+16` |\n\n### High Precision Axis XY\n\n| Axis interval start | Min interval | Max interval |\n| :------------------ | :----------- | :----------- |\n| `0` | `1e-12` | `1e+30` |\n| `100` | `1e-10` | `1e+30` |\n| `10 000` | `1e-8` | `1e+30` |\n| `1 000 000` | `1e-6` | `1e+30` |\n| `Date.now()` (UNIX) | `1.00` | `1e+30` |\n","image":"highPrecisionAxis"},{"id":"lcjs-example-0015-confidenceEllipseXY","title":"JavaScript Confidence Ellipse Chart","tags":["xy","point","polygon"],"description":"Example showcasing visualization of XY confidence ellipse widely used in statistics field","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"/*\n * LightningChartJS example that showcases visualization of XY scatter chart with confidence ellipse.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PointShape, ColorCSS, SolidLine, SolidFill, Themes } = lcjs\n\n// Create chart and series.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Scatter chart + confidence Ellipse')\n\n// Create point series for visualizing scatter points.\nconst pointSeries = chart.addPointSeries({ pointShape: PointShape.Circle }).setPointSize(3).setName('Scatter series')\n\n// Visualize confidence ellipse with polygon series.\n// Note, routine for calculation of confidence ellipse coordinates from scatter data set is not currently included in LightningChart JS!\nconst polygonSeries = chart.addPolygonSeries().setCursorEnabled(false)\n\n// Fetch example data from JSON asset.\nfetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0015/data-confidenceEllipseXY.json',\n)\n .then((r) => r.json())\n .then((data) => {\n const { scatterPoints, confidenceEllipsePolygonCoords } = data\n\n // Add data to series.\n pointSeries.add(scatterPoints)\n polygonSeries\n .add(confidenceEllipsePolygonCoords)\n .setFillStyle(new SolidFill({ color: ColorCSS('gray').setA(30) }))\n .setStrokeStyle(\n new SolidLine({\n thickness: 1,\n fillStyle: new SolidFill({ color: ColorCSS('white') }),\n }),\n )\n })\n","url":null,"readme":"This example shows how a _confidence ellipse_ can be drawn inside a scatter chart with LightningChart JS.\n\nConfidence ellipses are used especially with statistic chart applications. A common usage, for example, is the 95% confidence ellipse, which visualizes the area that contains 95% of samples, which makes it easier for the user to understand which points are _outliers_.\n\nThere are various ways of defining and calculating the shape of different confidence ellipses - traditionally in 2D applications they are rotated ellipses with width and height, however in some cases they might not actually be ellipses geometrically, but more complex shapes.\n\n![Different confidence ellipse shapes](./assets/shapes.png)\n\nLightningChart JS currently does not come with any routine for calculating a confidence ellipse shape. However, just about any kind of confidence ellipse shape can be visualized using `PolygonSeries`.\n\n`PolygonSeries` can be used to draw any _non-complex_ polygon shape (_polygon that doesn't intersect with itself_) inside XY charts. It is configured by supplying a list of `{x: number, y: number}` coordinates.\n\n```js\n// Example, visualization of polygon inside ChartXY.\nconst polygonSeries = chart.addPolygonSeries()\nconst polygonFigure = polygonSeries.add([\n { x: 0, y: 0 },\n { x: 5, y: 10 },\n { x: 10, y: 15 },\n { x: 15, y: 5 },\n { x: 10, y: -5 },\n { x: 5, y: -2 },\n])\n```\n","image":"confidenceEllipseXY"},{"id":"lcjs-example-0016-largeScatterChartXY","title":"JavaScript Large Scatter Chart","tags":["xy","point","polygon"],"description":"Example visualization of large scatter chart (> million data points)","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"/*\n * LightningChartJS example that showcases visualization of large XY scatter chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PointShape, ColorCSS, SolidLine, SolidFill, Themes } = lcjs\n\n// Create chart and series.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('')\n\n// Create point series for visualizing scatter points.\nconst pointSeries = chart\n .addPointSeries({ pointShape: PointShape.Square })\n .setPointSize(1)\n // NOTE: This disables data cursor from interacting with this series.\n // Data cursor does not perform well with scatter charts in millions of data points range.\n .setCursorEnabled(false)\n .setName('Scatter series')\n\n// Visualize confidence ellipse with polygon series.\n// Note, routine for calculation of confidence ellipse coordinates from scatter data set is not currently included in LightningChart JS!\nconst polygonSeries = chart.addPolygonSeries().setCursorEnabled(false)\n\n// Fetch example data from JSON asset.\nfetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0016/data-largeScatterChartXY.json',\n)\n .then((r) => r.json())\n .then((data) => {\n console.log(data)\n const { scatterPoints, confidenceEllipsePolygonCoords } = data\n chart.setTitle(`Scatter chart (${(data.scatterPoints.length / 10 ** 6).toFixed(1)} million points) + confidence Ellipse`)\n\n // Add data to series.\n pointSeries.add(scatterPoints)\n polygonSeries\n .add(confidenceEllipsePolygonCoords)\n .setFillStyle(new SolidFill({ color: ColorCSS('gray').setA(30) }))\n .setStrokeStyle(\n new SolidLine({\n thickness: 1,\n fillStyle: new SolidFill({ color: ColorCSS('white') }),\n }),\n )\n })\n","url":null,"readme":"This example showcases visualization of a Scatter chart with relatively large data set (1 million data points).\n\nLightningChart JS has created a revolution with the possibilities of data visualization in web - previously Scatter chart visualization was realistically possible only to ranges of some hundred thousand data points and even then it required complicated developer effort to enable any zooming or panning interactions with satisfactory performance.\n\nWith LC JS a million points Scatter chart is loaded in less than a second and the result is unlike anything seen before - operations like zooming and panning are instantaneous.\n\nAdditionally, when compared to previous alternatives, the usage is ridiculously simple. With SVG/Canvas based drawing, users would have severe limitations with large data amounts as these technologies don't scale well.\n\nHere's how simple the creation of a million points scatter chart is with LC JS:\n\n```js\nconst chart = lightningChart().ChartXY()\nconst series = chart.addPointSeries().add(\n new Array(1000000).fill().map((_) => ({\n x: Math.random(),\n y: Math.random(),\n })),\n)\n```\n\nThis takes about 100 milliseconds to load and will immediately be interactable with lightning fast reactions!\n\nThe maximum possible Scatter chart size scales well with used hardware, especially RAM (memory) and GPU (graphics card) - On average office PC, LC JS can handle more than hundred million data points.\n","image":"largeScatterChartXY"},{"id":"lcjs-example-0017-largeLineChartXY","title":"JavaScript Large Line Chart","tags":["xy","line"],"description":"Example visualization of large line chart (several million data points)","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases visualization of large XY line chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, emptyFill, Themes } = lcjs\n\nconst { createProgressiveTraceGenerator } = xydata\n\nconst trendsCount = 10\nconst dataPerTrend = 500 * 1000\n\n// Create chart and series.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle(`Line Chart with large data set (${((trendsCount * dataPerTrend) / 10 ** 6).toFixed(1)} million data points)`)\n\nPromise.all(\n new Array(trendsCount).fill(0).map((_) => createProgressiveTraceGenerator().setNumberOfPoints(dataPerTrend).generate().toPromise()),\n).then((allData) => {\n for (let i = 0; i < trendsCount; i += 1) {\n chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n })\n .setStrokeStyle((stroke) => stroke.setThickness(1))\n .setAreaFillStyle(emptyFill)\n .appendJSON(allData[i])\n }\n const legend = chart\n .addLegendBox()\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n})\n","url":null,"readme":"This example showcases visualization of a Line chart with relatively large data set (several millions of data points).\n\nLightningChart JS has created a revolution with the possibilities of data visualization in web - previously Line chart visualization was realistically possible only to ranges of some hundred thousand data points and even then it required complicated developer effort to enable any zooming or panning interactions with satisfactory performance.\n\nWith LC JS a million points Line chart is loaded in less than a second and the result is unlike anything seen before - operations like zooming and panning are instantaneous.\n\nAdditionally, when compared to previous alternatives, the usage is ridiculously simple. With SVG/Canvas based drawing, users would have severe limitations with large data amounts as these technologies don't scale well.\n\nHere's how simple the creation of a million points line chart is with LC JS:\n\n```js\nconst chart = lightningChart().ChartXY()\nconst series = chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .setStrokeStyle((stroke) => stroke.setThickness(1))\n .addArrayY(new Array(1000000).fill().map((_) => Math.random()))\n```\n\nThis takes about 100 milliseconds to load and will immediately be interactable with lightning fast reactions!\n\nThe maximum possible Line chart size scales well with used hardware, especially RAM (memory) and GPU (graphics card) - On average office PC, LC JS can handle more than hundred million data points.\n","image":"largeLineChartXY"},{"id":"lcjs-example-0018-refreshingLineSpectrum","title":"Refreshing Spectrum Line JavaScript Chart","tags":["xy","line","realtime"],"description":"Example for Chart with 2D spectrogram + dynamic projections on mouse interaction.","metaDescription":"Example for Chart with 2D spectrogram + dynamic projections on mouse interaction.","src":"/*\n * LightningChartJS example for line chart application with rapidly changing data set\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AutoCursorModes, Themes } = lcjs\n\nconst { createSpectrumDataGenerator } = require('@lightningchart/xydata')\n\n// Create XY Chart\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Spectrum Line Chart')\n .setAutoCursorMode(AutoCursorModes.disabled)\n\n// Set static Y axis interval.\nchart.getDefaultAxisY().setScrollStrategy(undefined).setInterval({ start: 0.09, end: 0.9, stopAxisAfter: false })\n\n// Add Line series\nconst series = chart.addLineSeries()\n\n// Generate several spectrum data sets that will be displayed on after another.\ncreateSpectrumDataGenerator()\n .setSampleSize(1024)\n .setNumberOfSamples(600)\n .setFrequencyStability(2)\n .setVariation(2)\n .generate()\n .toPromise()\n .then((dataSet) => {\n // dataSet contains many samples. Setup code that will change displayed sample once every frame.\n let iSample = 0\n const nextSample = () => {\n iSample = (iSample + 1) % dataSet.length\n const sample = dataSet[iSample]\n // Sample only contains Y values, use `addArrayY` to automatically generate X coordinate for each data point.\n series.clear().addArrayY(sample)\n requestAnimationFrame(nextSample)\n }\n nextSample()\n })\n","url":null,"readme":"This example showcases a common line chart application, where the displayed line data set is changed very rapidly.\n\nThis example uses spectrogram data, so the line chart displays the latest spectrum only.\n\nWhen compared to a [spectrogram](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0805-spectrogramProjection.html), this is the same but without a view of the data history.\n\n**About performance...**\n\nWhile there are numerous different Line Chart tools available in web, the wide majority (> 95%) are not designed nor suitable for applications such as this, where the data set is changed in super fast intervals.\n\nWe at LightningChart have studied various different web data visualization tools to support our mission of being the web chart with the best performance in the world.\n\nThese studies are all publicly available and can be found on our website in our definite favorite [Performance section](https://lightningchart.com/high-performance-javascript-charts/).\n","image":"RefreshingLine"},{"id":"lcjs-example-0019-flowCytometryChart","title":"JavaScript Flow Cytometry Chart","tags":["xy","points","palette"],"description":"Visualization of a Flow Cytometry data set (FSC + SSC properties)","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"/*\n * LightningChartJS example that showcases visualization of a Flow Cytometry data set (FSC + SSC properties).\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, PalettedFill, LUT, PointShape, ColorRGBA, Themes } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Flow Cytometry Visualization')\n .setMouseInteractions(false)\n .setPadding(0)\n\nconst axisX = chart\n .getDefaultAxisX()\n .setInterval({ start: 1.3, end: 10 })\n .setTitle('FSC-A (10⁶)')\n .setMouseInteractions(false)\n .setThickness(60)\n\nconst axisY = chart\n .getDefaultAxisY()\n .setInterval({ start: -0.2, end: 1.8 })\n .setTitle('SSC-A (10⁶)')\n .setMouseInteractions(false)\n .setThickness(80)\n\nconst pointSeries = chart\n .addPointSeries({\n pointShape: PointShape.Square,\n })\n // .setCursorEnabled(false)\n .setIndividualPointValueEnabled(true)\n .setPointSize(2)\n .setCursorResultTableFormatter((builder, _, __, ___, dp) => builder.addRow(`value: `, dp.value?.toFixed(2)))\n .setPointFillStyle(\n new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n interpolate: true,\n steps: [\n { value: 0, color: ColorRGBA(0, 0, 0, 0) },\n { value: 1, color: ColorRGBA(0, 0, 255) },\n { value: 10, color: ColorRGBA(50, 50, 255) },\n { value: 50, color: ColorRGBA(0, 255, 0) },\n { value: 100, color: ColorRGBA(255, 255, 0) },\n { value: 150, color: ColorRGBA(255, 0, 0) },\n ],\n }),\n }),\n )\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0019/flowCytometryChart-data.json')\n .then((r) => r.json())\n .then((data) => {\n // Align Chart Axis area so that each data point occupies exactly 1 pixel.\n const columns = data.data.length\n const rows = data.data[0].length\n\n const pxLocationAxisStart = chart.translateCoordinate(\n { x: axisX.getInterval().start, y: axisY.getInterval().start },\n chart.coordsAxis,\n chart.coordsRelative,\n )\n const pxLocationAxisEnd = chart.translateCoordinate(\n { x: axisX.getInterval().end, y: axisY.getInterval().end },\n chart.coordsAxis,\n chart.coordsRelative,\n )\n const pxAxisSize = {\n x: Math.ceil(pxLocationAxisEnd.x - pxLocationAxisStart.x),\n y: Math.ceil(pxLocationAxisEnd.y - pxLocationAxisStart.y),\n }\n\n const pointSize = 2\n // Set chart paddings so that each column/row in data set occupies exactly 1 pixel.\n const horizontalPadding = Math.max(pxAxisSize.x - columns * pointSize, 0)\n const verticalPadding = Math.max(pxAxisSize.y - rows * pointSize, 0)\n chart.setPadding({\n left: horizontalPadding / 2,\n right: horizontalPadding / 2,\n top: verticalPadding / 2,\n bottom: verticalPadding / 2,\n })\n\n // Unpack data from [[sample, sample, ...], [...], [...]] format to list of XY+Value points.\n const points = []\n data.data.forEach((column, iColumn) => {\n column.forEach((sample, iRow) => {\n if (!sample) return\n points.push({\n x: data.x.start + (iColumn * (data.x.end - data.x.start)) / data.data.length,\n y: data.y.start + (iRow * (data.y.end - data.y.start)) / data.data[0].length,\n value: sample,\n })\n })\n })\n pointSeries.add(points)\n })\n","url":null,"readme":"Flow cytometry is an every-day method in research and clinical practices for analyzing individual cells within heterogeneous samples (like blood sample, for example).\n\nIt is based on observing the behavior of pointed light, and can rapidly analyze multiple parameters from each cell.\n\nIn this example, all the samples are displayed in a single chart which displays the following information:\n\n- Forward scatter (FSC). This is measured based on how much light is scattered along the path of the light source.\n\n- Side scatter (SSC). This is measured based on hot much light is scattered at a ninety-degree angle relative to the light source.\n\nEach point in the chart is one sample. When multiple samples have the same SSC and FSC measurement, the point color is adjusted (red = most overlapping samples).\n\nIn practice, the data from flow cytometry is filtered through several steps that each look at the relationship between some data attributes. This example is just 1 of these steps.\n\nAs an example of this filtering, some application might select some valid range of FSC/SSC values that will be considered in later analysis steps.\n\n![FSC/SSC Threshold](./assets/threshold.png)\n\n## Flow cytometry and LightningChart\n\nThe go-to framework for visualizing flow cytometry is definitely \"R\", a software environment for statistical computing and graphics.\n\nHere are some scenarios where we believe LightningChart is a strong alternative:\n\n1. Real-time data\n\nLightningChart excels at fast changes to data sets, if your application continuously receives data, especially with high rates like several times in second, LightningChart is what you need.\n\n2. Data interactions\n\nIn some cases users might need the ability to interact with data (panning, zooming, cursor, etc.). In many statistical tools, this kind of features do not exist since only a minority would have an use for them. Additionally, even if present they might not perform too well especially with large data sets.\n\n3. Deployment in the internet\n\nR is a desktop application. In most cases, users will install it on their own computer and directly interact with data sets to utilize a shared data visualization application.\n\nLightningChart JS, on the other hand, is a web library. LC JS projects can be conveniently embedded inside web pages, mobile and even desktop applications.\n","image":"flowCytometryChart"},{"id":"lcjs-example-0020-dateTimeAxis","title":"JavaScript Chart with DateTime Axis","tags":["date-time","axis","xy"],"description":"Example for creation of a DateTime Axis. DateTime axis can present time.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChart JS Example that showcases a Customer Satisfaction graph using a LineSeries and DateTime-Axis.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Customer Satisfaction')\n\n// Use DateTime TickStrategy for this Axis\nchart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime)\n\n// Add a line series.\nconst lineSeries = chart.addLineSeries().setName('Customer Satisfaction')\n\n// Setup view nicely.\nchart.getDefaultAxisY().setScrollStrategy(undefined).setInterval({ start: 0, end: 100, stopAxisAfter: false }).setTitle('Satisfaction %')\n\n// Data for the plotting\nconst satisfactionData = [\n { x: new Date(2008, 0, 1).getTime(), y: 0 },\n { x: new Date(2008, 1, 1).getTime(), y: 8 },\n { x: new Date(2008, 2, 1).getTime(), y: 12 },\n { x: new Date(2008, 3, 1).getTime(), y: 18 },\n { x: new Date(2008, 4, 1).getTime(), y: 22 },\n { x: new Date(2008, 5, 1).getTime(), y: 32 },\n { x: new Date(2008, 6, 1).getTime(), y: 40 },\n { x: new Date(2008, 7, 1).getTime(), y: 48 },\n { x: new Date(2008, 8, 1).getTime(), y: 50 },\n { x: new Date(2008, 9, 1).getTime(), y: 54 },\n { x: new Date(2008, 10, 1).getTime(), y: 59 },\n { x: new Date(2008, 11, 1).getTime(), y: 65 },\n { x: new Date(2009, 0, 1).getTime(), y: 70 },\n { x: new Date(2009, 1, 1).getTime(), y: 68 },\n { x: new Date(2009, 2, 1).getTime(), y: 70 },\n { x: new Date(2009, 3, 1).getTime(), y: 69 },\n { x: new Date(2009, 4, 1).getTime(), y: 66 },\n { x: new Date(2009, 5, 1).getTime(), y: 65.4 },\n { x: new Date(2009, 6, 1).getTime(), y: 64 },\n { x: new Date(2009, 7, 1).getTime(), y: 65 },\n { x: new Date(2009, 8, 1).getTime(), y: 63.5 },\n { x: new Date(2009, 9, 1).getTime(), y: 62 },\n { x: new Date(2009, 10, 1).getTime(), y: 61.2 },\n { x: new Date(2009, 11, 1).getTime(), y: 63 },\n { x: new Date(2010, 0, 1).getTime(), y: 61 },\n { x: new Date(2010, 1, 1).getTime(), y: 62 },\n { x: new Date(2010, 2, 1).getTime(), y: 62 },\n { x: new Date(2010, 3, 1).getTime(), y: 60 },\n { x: new Date(2010, 4, 1).getTime(), y: 57.8 },\n { x: new Date(2010, 5, 1).getTime(), y: 58 },\n { x: new Date(2010, 6, 1).getTime(), y: 61 },\n { x: new Date(2010, 7, 1).getTime(), y: 59 },\n { x: new Date(2010, 8, 1).getTime(), y: 63 },\n { x: new Date(2010, 9, 1).getTime(), y: 61 },\n { x: new Date(2010, 10, 1).getTime(), y: 61.8 },\n { x: new Date(2010, 11, 1).getTime(), y: 62 },\n { x: new Date(2011, 0, 1).getTime(), y: 59.9 },\n { x: new Date(2011, 1, 1).getTime(), y: 58 },\n { x: new Date(2011, 2, 1).getTime(), y: 60 },\n { x: new Date(2011, 3, 1).getTime(), y: 63 },\n { x: new Date(2011, 4, 1).getTime(), y: 59.5 },\n { x: new Date(2011, 5, 1).getTime(), y: 62.5 },\n { x: new Date(2011, 6, 1).getTime(), y: 59.7 },\n { x: new Date(2011, 7, 1).getTime(), y: 57 },\n { x: new Date(2011, 8, 1).getTime(), y: 61 },\n { x: new Date(2011, 9, 1).getTime(), y: 59 },\n { x: new Date(2011, 10, 1).getTime(), y: 61 },\n { x: new Date(2011, 11, 1).getTime(), y: 65 },\n { x: new Date(2012, 0, 1).getTime(), y: 62 },\n { x: new Date(2012, 1, 1).getTime(), y: 60 },\n { x: new Date(2012, 2, 1).getTime(), y: 58 },\n { x: new Date(2012, 3, 1).getTime(), y: 59 },\n { x: new Date(2012, 4, 1).getTime(), y: 61 },\n { x: new Date(2012, 5, 1).getTime(), y: 64 },\n { x: new Date(2012, 6, 1).getTime(), y: 65.5 },\n { x: new Date(2012, 7, 1).getTime(), y: 67 },\n { x: new Date(2012, 8, 1).getTime(), y: 68 },\n { x: new Date(2012, 9, 1).getTime(), y: 69 },\n { x: new Date(2012, 10, 1).getTime(), y: 68 },\n { x: new Date(2012, 11, 1).getTime(), y: 69.5 },\n { x: new Date(2013, 0, 1).getTime(), y: 69.9 },\n { x: new Date(2013, 1, 1).getTime(), y: 68.5 },\n { x: new Date(2013, 2, 1).getTime(), y: 67 },\n { x: new Date(2013, 3, 1).getTime(), y: 65 },\n { x: new Date(2013, 4, 1).getTime(), y: 63 },\n { x: new Date(2013, 5, 1).getTime(), y: 60 },\n { x: new Date(2013, 6, 1).getTime(), y: 61.6 },\n { x: new Date(2013, 7, 1).getTime(), y: 62 },\n { x: new Date(2013, 8, 1).getTime(), y: 61 },\n { x: new Date(2013, 9, 1).getTime(), y: 60 },\n { x: new Date(2013, 10, 1).getTime(), y: 63.3 },\n { x: new Date(2013, 11, 1).getTime(), y: 62.7 },\n { x: new Date(2014, 0, 1).getTime(), y: 64.3 },\n { x: new Date(2014, 1, 1).getTime(), y: 63 },\n { x: new Date(2014, 2, 1).getTime(), y: 61.2 },\n { x: new Date(2014, 3, 1).getTime(), y: 60 },\n { x: new Date(2014, 4, 1).getTime(), y: 61 },\n { x: new Date(2014, 5, 1).getTime(), y: 64 },\n { x: new Date(2014, 6, 1).getTime(), y: 61.9 },\n { x: new Date(2014, 7, 1).getTime(), y: 61 },\n { x: new Date(2014, 8, 1).getTime(), y: 58 },\n { x: new Date(2014, 9, 1).getTime(), y: 59 },\n { x: new Date(2014, 10, 1).getTime(), y: 60.5 },\n { x: new Date(2014, 11, 1).getTime(), y: 61 },\n { x: new Date(2015, 0, 1).getTime(), y: 63 },\n { x: new Date(2015, 1, 1).getTime(), y: 64.5 },\n { x: new Date(2015, 2, 1).getTime(), y: 65 },\n { x: new Date(2015, 3, 1).getTime(), y: 66.2 },\n { x: new Date(2015, 4, 1).getTime(), y: 64.9 },\n { x: new Date(2015, 5, 1).getTime(), y: 63 },\n { x: new Date(2015, 6, 1).getTime(), y: 62 },\n { x: new Date(2015, 7, 1).getTime(), y: 63 },\n { x: new Date(2015, 8, 1).getTime(), y: 61.8 },\n { x: new Date(2015, 9, 1).getTime(), y: 62 },\n { x: new Date(2015, 10, 1).getTime(), y: 63 },\n { x: new Date(2015, 11, 1).getTime(), y: 64.2 },\n { x: new Date(2016, 0, 1).getTime(), y: 63 },\n { x: new Date(2016, 1, 1).getTime(), y: 61 },\n { x: new Date(2016, 2, 1).getTime(), y: 59.7 },\n { x: new Date(2016, 3, 1).getTime(), y: 61 },\n { x: new Date(2016, 4, 1).getTime(), y: 58 },\n { x: new Date(2016, 5, 1).getTime(), y: 59 },\n { x: new Date(2016, 6, 1).getTime(), y: 58 },\n { x: new Date(2016, 7, 1).getTime(), y: 58 },\n { x: new Date(2016, 8, 1).getTime(), y: 57.5 },\n { x: new Date(2016, 9, 1).getTime(), y: 59.2 },\n { x: new Date(2016, 10, 1).getTime(), y: 60 },\n { x: new Date(2016, 11, 1).getTime(), y: 61.9 },\n { x: new Date(2017, 0, 1).getTime(), y: 63 },\n { x: new Date(2017, 1, 1).getTime(), y: 64.1 },\n { x: new Date(2017, 2, 1).getTime(), y: 65.9 },\n { x: new Date(2017, 3, 1).getTime(), y: 64 },\n { x: new Date(2017, 4, 1).getTime(), y: 65 },\n { x: new Date(2017, 5, 1).getTime(), y: 62 },\n { x: new Date(2017, 6, 1).getTime(), y: 60 },\n { x: new Date(2017, 7, 1).getTime(), y: 58 },\n { x: new Date(2017, 8, 1).getTime(), y: 57 },\n { x: new Date(2017, 9, 1).getTime(), y: 58.2 },\n { x: new Date(2017, 10, 1).getTime(), y: 58.6 },\n { x: new Date(2017, 11, 1).getTime(), y: 59.3 },\n { x: new Date(2018, 0, 1).getTime(), y: 61 },\n]\n\n// Adding points to the series\nlineSeries.add(satisfactionData)\n\n// Show the customized result table for each point\nlineSeries.setCursorResultTableFormatter((builder, series, xValue, yValue) => {\n return builder\n .addRow('Customer Satisfaction')\n .addRow(series.axisX.formatValue(xValue))\n .addRow(yValue.toFixed(2) + '%')\n})\n","url":null,"readme":"This example shows creation of a DateTime Axis, for rendering XY-series where either/both of X/Y dimensions can present _time_. This doesn't affect the input of data - format remains as _{x: number, y: number}_ - however, DateTime-axes format their values from number to a date and time. This affects axis labels, markers and cursors.\n\nA DateTime-_Axis_ is created by specifying its _TickStrategy_. Here's how it looks when setting the _Axis TickStrategy_:\n\n```javascript\n// Add an XY Chart\nconst chart = lightningChart().ChartXY({})\n// Set the TickStrategy of the default X Axis to a DateTime TickStrategy\nchart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime)\n```\n\nThe above mentioned examples will provide an Axis that will format its scale values to their DateTime-representations. ","image":"dateTimeAxis"},{"id":"lcjs-example-0021-dateTimeAxisOrigin","title":"DateTime Axis Origin","tags":["line","xy","date-time"],"description":"Example showcases using origin with Axis TickStrategies.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChart JS Example that showcases using origin with Axis TickStrategies.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = xydata\n\n// Create Dashboard.\n// NOTE: Using `Dashboard` is not recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst db = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: 2,\n numberOfColumns: 1,\n})\n// Create two XY-charts.\nconst chartDefaultOrigin = db.createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n})\nconst chartModifiedOrigin = db.createChartXY({\n columnIndex: 0,\n rowIndex: 1,\n columnSpan: 1,\n rowSpan: 1,\n})\n\n// Use the DateTime Axis TickStrategy with the default origin.\nchartDefaultOrigin.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime)\n\n// Use the DateTime Axis TickStrategy with the origin set to current day.\n// Decide on an origin for DateTime axis.\nconst dateOrigin = new Date(2000, 1, 1)\nconst dateOriginTime = dateOrigin.getTime()\nchartModifiedOrigin.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime, (tickStrategy) => tickStrategy.setDateOrigin(dateOrigin))\n// Setup the charts.\nchartDefaultOrigin.setTitle('Default origin').getDefaultAxisY().setTitle('Value')\nchartModifiedOrigin.setTitle('Modified origin').getDefaultAxisY().setTitle('Value')\n\n// Create line series for both charts.\nconst series1 = chartDefaultOrigin.addLineSeries()\nconst series2 = chartModifiedOrigin.addLineSeries()\n\n// Generate traced points using 'xydata'-library.\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(1000)\n .generate()\n .toPromise()\n .then((data) => {\n // Use same data on both Series for demonstration purposes.\n series1.add(data)\n series2.add(data)\n chartDefaultOrigin.getDefaultAxisX().fit()\n chartModifiedOrigin.getDefaultAxisX().fit()\n })\n","url":null,"readme":"This example shows the usage of Origin Date with DateTime Axis TickStrategy, for rendering XY-series where either or both of X/Y dimensions can present _time_.\n\nIn the example, both charts use the same data, with each point of data set to be an hour apart along the X Axis; What is different between the charts, is the _origin_ for the DateTime TickStrategy used in the X Axis.\n\nThe top chart uses the default origin (January 1st, 1970), while the bottom chart uses a custom origin (set to current Date).\n\nThe _origin-date_ can be specified to whichever DateTime is desired. It is done by passing a _javascript Date object_ to the function that creates the _DateTime TickStrategy_:\n\n```javascript\n// Define the origin-date. (y, m [0-11], d [1-31], h [0-23])\nconst originDate = new Date(2002, 0, 1, 13)\n// Create DateTime AxisTickStrategy with specified originDate.\nconst dateTimeTickStrategy = AxisTickStrategies.DateTime(originDate)\n// Create a chart\nconst chart = lightningChart().ChartXY({})\n// Get the default X Axis\nchart\n .getDefaultAxisX()\n // Set the Tick Strategy to use\n .setTickStrategy(\n AxisTickStrategies.DateTime,\n // Use created DateTime AxisTickStrategy in the X Axis\n (tickStrategy) => tickStrategy.setDateOrigin(dat1eTimeTickStrategy),\n )\n```\n\nIf this _TickStrategy_ would be supplied to an _X-Axis_, it would effectively mean that its scale would start from 1st of January 2002 14PM, so a _XY-point_ with coordinates `{ x: 0, y: 0 }` would be formated as `{ x: 1.1.2002 14:00, y: 0 }`.\n\nIt is worth mentioning that big _DateTime_-intervals can produce severe precision problems (eq. when zooming in). The only way to battle this is by reducing the distance of timestamps from the active _origin-date_.\n","image":"dateTimeAxisOrigin"},{"id":"lcjs-example-0022-2dPointsValuePalette","title":"JavaScript 2D Points Value Palette Coloring","tags":["xy","line","points","palette"],"description":"Dynamic 2D points coloring by arbitrary user data set.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"/*\n * LightningChartJS example that showcases 2D points dynamic coloring based on an arbitrary user data set.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PointShape, PalettedFill, LUT, regularColorSteps, Themes } = lcjs\n\n// Import data-generators from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = require('@lightningchart/xydata')\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('2D points value palette coloring')\n .setPadding({ right: 20 })\n\nconst theme = chart.getTheme()\n\nconst palette = new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n units: 'trace dist (y)',\n interpolate: true,\n percentageValues: true,\n steps: regularColorSteps(0, 1, theme.examples.intensityColorPalette).map((step, i, steps) =>\n // Make last step transparent.\n i === steps.length - 1 ? { ...step, color: step.color.setA(0) } : step,\n ),\n }),\n})\n\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(1000)\n .generate()\n .toPromise()\n .then((tracePoints) => {\n const points = chart\n .addPointSeries({\n pointShape: PointShape.Circle,\n })\n .setName('Outliers')\n .setPointSize(3.0)\n .setPointFillStyle(palette)\n // IMPORTANT: Individual point values must be explicitly enabled for dynamic coloring.\n .setIndividualPointValueEnabled(true)\n\n // Generate points for outlier series.\n const outlierPoints = []\n tracePoints.forEach((p) =>\n outlierPoints.push(\n ...new Array(Math.round(Math.random() * 50)).fill(0).map((_, i) => {\n const outlierY = p.y + (Math.random() * 2 - 1) * 10\n return {\n x: p.x,\n y: outlierY,\n // `value` is used to lookup color from palette. Manual calculation allows any kind of data set to be used.\n value: Math.abs(outlierY - p.y),\n }\n }),\n ),\n )\n console.log(outlierPoints)\n points.add(outlierPoints)\n\n const line = chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .setName('Trace stroke')\n .add(tracePoints)\n .setStrokeStyle((style) => style.setThickness(5))\n\n chart\n .addLegendBox()\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.2,\n })\n })\n","url":null,"readme":"_2D points dynamic coloring by value palette_\n\nThis example showcases a new feature in LCJS v3.0.1 release - dynamic coloring of 2D points using a value palette.\n\nValue palette coloring is a really powerful feature, which allows dynamic coloring based on any kind data set.\n\nIn this example it is used to color a data set based on Y distance from another data set.\n\nIn practice, this is done by calculating the Y difference and assigning a `value` property to each data point - naturally, there are endless different ways this can be used.\n\nIn addition to this, dynamic coloring by `x` or `y` coordinate is also supported. This is activated simply by setting the `PalettedFill.lookUpProperty` to either `'x'` or `'y'`.\n","image":"2dPointsValuePalette"},{"id":"lcjs-example-0023-decayingLineChart","title":"JavaScript Decaying Line Chart","tags":["xy","line","realtime"],"description":"Showcases Line Chart with refreshing data, where older samples are displayed for a while, slowly decaying out.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * LightningChartJS example for Line Chart with refreshing data, where older samples are displayed for a while, slowly decaying out.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, AutoCursorModes, SolidFill, SolidLine, ColorRGBA, Themes } = lcjs\n\n// Amount of data points in each sample.\nconst SAMPLE_SIZE = 1280\n// Amount of unique samples in application.\nconst SAMPLE_COUNT = 300\n// Max amount of samples displayed at any time.\nconst DECAY_STEPS_COUNT = 75\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Decaying Line Chart')\n .setAutoCursorMode(AutoCursorModes.disabled)\n\nconst theme = chart.getTheme()\nconst axisX = chart.getDefaultAxisX()\nconst axisY = chart.getDefaultAxisY().setInterval({ start: -1.05, end: 1.05 })\n\n// Generate series for each sample that can be displayed at a time.\nconst seriesList = new Array(DECAY_STEPS_COUNT).fill(0).map((_, i) => {\n const series = chart.addLineSeries({\n dataPattern: {\n // 'ProgressiveX' -> each data point is assumed to have larger X value than previous one.\n pattern: 'ProgressiveX',\n },\n })\n return series\n})\n\nconst defaultStrokeColor = seriesList[0].getStrokeStyle().getFillStyle().getColor()\n\n// Generate list of stroke styles for each decay step.\nconst strokeStyles = new Array(DECAY_STEPS_COUNT).fill(0).map((_, i) => {\n const lerpPos = i / DECAY_STEPS_COUNT\n // Linear interpolation convenience function.\n const lerp = (v0, v1, p) => v0 * (1 - p) + v1 * p\n return new SolidLine({\n thickness: 1,\n fillStyle: new SolidFill({\n // Decay step colors shift between default stroke color and fully transparent white.\n color: ColorRGBA(\n lerp(defaultStrokeColor.getR(), theme.isDark ? 0 : 255, lerpPos),\n lerp(defaultStrokeColor.getG(), theme.isDark ? 0 : 255, lerpPos),\n lerp(defaultStrokeColor.getB(), theme.isDark ? 0 : 255, lerpPos),\n lerp(255, 0, lerpPos),\n ),\n }),\n })\n})\n\n// Generate example data.\nconst data = []\nfor (let i = 0; i < SAMPLE_COUNT; i += 1) {\n const sample = []\n const amplitude = Math.cos((i * 2 * Math.PI) / SAMPLE_COUNT)\n for (let x = 0; x < SAMPLE_SIZE; x += 1) {\n let y = Math.cos(i * 0.01 + (5 * x * Math.PI) / SAMPLE_SIZE) * amplitude\n y += Math.random() * 0.02\n sample.push({ x, y })\n }\n data.push(sample)\n}\n\n// Setup data animation.\nlet iteration = 0\nconst nextIteration = () => {\n // Update data of 1 series.\n const newSampleData = data[iteration % SAMPLE_COUNT]\n const newSampleSeriesIndex = iteration % seriesList.length\n const newSampleSeries = seriesList[newSampleSeriesIndex]\n newSampleSeries.clear().add(newSampleData)\n\n // Update style of every series for decay effect.\n seriesList.forEach((series, i) => {\n let seriesStyleIndex = newSampleSeriesIndex - i\n if (seriesStyleIndex < 0) {\n seriesStyleIndex = strokeStyles.length + seriesStyleIndex\n }\n const seriesStyle = strokeStyles[seriesStyleIndex]\n series.setStrokeStyle(seriesStyle)\n })\n\n // Schedule next update and update counter.\n iteration += 1\n requestAnimationFrame(nextIteration)\n}\nnextIteration()\n","url":null,"readme":"This example showcases a refreshing line chart application, where some amount of previous samples are left visible for a brief moment.\n\nOlder samples are constantly updated with increasing transparency colors to give a \"decaying\" effect.\n\nThis effect is achieved by preparing an individual `LineSeries` for each displayed sample and updating the stroke style on every update.\nUpdating stroke style is a really fast operation, and there isn't any particular limit to the number of series either, so the amount of data in this kind of application can be scaled quite far up.\n","image":"decayingLineChart"},{"id":"lcjs-example-0024-ultraPrecisionTradingChart","title":"JavaScript Ultra Precision Trend Chart","tags":["dashboard","xy","line","ui","cursor","interactions"],"description":"Next-generation charts in web. LightningChart JS supports plotting of even 1 microsecond resolution data","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * line chart with 1 microsecond precision data\n * 3 series, display a 2.5 second interval, total data points = 7.5 million\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\nconst { AxisTickStrategies, emptyFill, lightningChart, Themes } = lcjs\nconst { createProgressiveTraceGenerator } = xydata\n\nconst CHANNELS = 3\nconst DATA_PER_CHANNEL = 2.5 * 1000 * 1000\nconst STEP_X = 10 ** -3\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle(`3 stock price trends with 1 microsecond data resolution (total ${DATA_PER_CHANNEL * CHANNELS} values)`)\nconst axisX = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Time)\nchart.getDefaultAxisY().dispose()\nconst channelList = new Array(CHANNELS).fill(0).map((_, i) => {\n const chName = '<Stock name>'\n const iStack = CHANNELS - (i + 1)\n const axisY = chart\n .addAxisY({ iStack })\n .setTitle(chName)\n .setMargins(iStack > 0 ? 15 : 0, iStack < CHANNELS.length - 1 ? 15 : 0)\n const series = chart\n .addPointLineAreaSeries({\n yAxis: axisY,\n dataPattern: 'ProgressiveX',\n automaticColorIndex: i * 2,\n })\n .setAreaFillStyle(emptyFill)\n .setName(chName)\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((builder, _, sample) =>\n builder.addRow(series.axisX.formatValue(sample.x)).addRow(chName, '', `${sample.y.toFixed(0)} €`),\n )\n return { chart, series }\n})\n\nPromise.all(\n channelList.map((ch, i) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(DATA_PER_CHANNEL)\n .generate()\n .toPromise()\n .then((xyTrace) => {\n // Map generated XY trace data set into a more realistic data set.\n const baseLine = 10 + Math.random() * 2000\n const variationAmplitude = baseLine * 0.03\n const yMin = xyTrace.reduce((min, cur) => Math.min(min, cur.y), Number.MAX_SAFE_INTEGER)\n const yMax = xyTrace.reduce((max, cur) => Math.max(max, cur.y), -Number.MAX_SAFE_INTEGER)\n const yIntervalHalf = (yMax - yMin) / 2\n const yTraceBaseline = yMin + yIntervalHalf\n return xyTrace.map((xy) => ({\n x: xy.x * STEP_X,\n y: baseLine + ((xy.y - yTraceBaseline) / yIntervalHalf) * variationAmplitude,\n }))\n }),\n ),\n).then((dataSets) => {\n channelList.forEach((ch, i) => {\n ch.series.appendJSON(dataSets[i])\n ch.series.axisX.fit(false)\n })\n\n // Customize chart interactions.\n channelList.forEach((ch) => {\n ch.chart.setMouseInteractions(false)\n ch.chart.getDefaultAxisX().setMouseInteractions(false)\n })\n\n // Create custom chart interaction for mouse dragging inside chart area.\n const xBandList = channelList.map((ch) => ch.chart.getDefaultAxisX().addBand().setVisible(false))\n channelList.forEach((ch) => {\n const chart = ch.chart\n const axisX = chart.getDefaultAxisX()\n const axisY = chart.getDefaultAxisY()\n chart.setMouseInteractionRectangleFit(false).setMouseInteractionRectangleZoom(false)\n chart.onSeriesBackgroundMouseDrag((_, event, button, startLocation, delta) => {\n if (button !== 0) return\n\n xBandList.forEach((band, i) => {\n const bandChart = channelList[i].chart\n const xAxisLocationStart = bandChart.translateCoordinate(\n { clientX: startLocation.x, clientY: startLocation.y },\n bandChart.coordsAxis,\n ).x\n const xAxisLocationNow = bandChart.translateCoordinate(event, bandChart.coordsAxis).x\n if (Math.abs(event.clientX - startLocation.x) > 10) {\n band.setVisible(true).setValueStart(xAxisLocationStart).setValueEnd(xAxisLocationNow)\n } else {\n band.setVisible(false)\n }\n })\n })\n chart.onSeriesBackgroundMouseDragStop((_, event, button, startLocation) => {\n if (button !== 0 || !xBandList[0].getVisible()) return\n\n const xStart = Math.min(xBandList[0].getValueStart(), xBandList[0].getValueEnd())\n const xEnd = Math.max(xBandList[0].getValueStart(), xBandList[0].getValueEnd())\n channelList[0].chart.getDefaultAxisX().setInterval({ start: xStart, end: xEnd })\n xBandList.forEach((band, i) => {\n band.setVisible(false)\n })\n })\n chart.onSeriesBackgroundMouseDoubleClick((_, event) => {\n if (event.button !== 0) return\n channelList.forEach((ch) => {\n ch.chart.getDefaultAxisX().fit(false)\n ch.chart.getDefaultAxisY().fit(false)\n })\n })\n })\n})\n","url":null,"readme":"As proven in our [2021 line charts performance comparison](https://lightningchart.com/javascript-charts-performance-comparison/), LightningChart JS line charts are **over 700 times faster** than other web charts. LightningChart JS has been proved to be able to visualize data sets with even up to 500 million data points.\n\nThis large data plotting capacity paired together with great zoom capabilities enables some previously unseen possibilities in data visualization applications.\n\nIn this example, a random data set is generated for 3 price trends simulating a 1 microsecond resolution between each price measurement.\nThese trends are displayed with a shared X (time) view, showcasing an example on how analysis of incredibly high speed transactions and price impacts could be done in real life.\n\nThe amount of data in this example is 7 500 000 points. With 1 μs precision, this translates to 2.5 seconds of data per each trend.\n\nAs you can see, the data amount scales very quickly to crazy amounts. For this reason, this kind of visualization applications aren't applicable to entire data sets, but only to elsewhere identified \"points of interest\", such as turning points in trends.\n\nTo learn more about LightningChart JS and its capabilities, here are some potentially interesting links:\n\n- [Next Generation Real-Time Monitoring Dashboard](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0509-dashboardRealtimeTrading.html)\n\n- [Latest news on LC JS performance](https://lightningchart.com/high-performance-javascript-charts/)\n","image":"ultraPrecisionTradingChart"},{"id":"lcjs-example-0025-officeDataVisualizationLayer","title":"JavaScript Office Layout Data Visualization Chart","tags":["xy","image","ui","heatmap"],"description":"Example showcasing LightningChart interactions with external images and icons in context of office layout data visualization.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/**\n * Example showcasing LightningChart interactions with external images and icons in context of office layout data visualization.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst {\n lightningChart,\n AxisTickStrategies,\n ColorRGBA,\n ImageFill,\n PalettedFill,\n emptyLine,\n LUT,\n AutoCursorModes,\n UIElementBuilders,\n UIOrigins,\n LegendBoxBuilders,\n Themes,\n} = lcjs\n\nconst chartPadding = 10\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setMouseInteractions(false)\n .setTitle('Office layout data visualization layer')\n .setAutoCursor((autoCursor) => autoCursor.setTickMarkerXVisible(false).setTickMarkerYVisible(false))\n .setSeriesBackgroundStrokeStyle(emptyLine)\n\nchart.forEachAxis((axis) => axis.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine).setInterval({ start: 0, end: 1 }))\n\nconst legend = chart.addLegendBox(LegendBoxBuilders.VerticalLegendBox).setAutoDispose({\n type: 'max-width',\n maxHeight: 0.3,\n})\n\nconst officeLayoutImage = new Image()\nofficeLayoutImage.crossOrigin = ''\nofficeLayoutImage.src = new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0025/office.png'\nofficeLayoutImage.onload = () => {\n chart.setSeriesBackgroundFillStyle(\n new ImageFill({\n source: officeLayoutImage,\n }),\n )\n\n // Maintain static aspect ratio of chart area (enclosed area between axes).\n const targetAspectRatio = officeLayoutImage.height / officeLayoutImage.width\n const updateChartAspectRatio = () => {\n const chartBounds = chart.engine.container.getBoundingClientRect()\n const chartSizePx = {\n x: Math.ceil(chartBounds.width - 2 * chartPadding),\n y: Math.ceil(chartBounds.height - 2 * chartPadding),\n }\n const curAspectRatio = chartSizePx.y / chartSizePx.x\n if (curAspectRatio < targetAspectRatio) {\n // Add horizontal chart padding to maintain Map picture aspect ratio.\n const targetAxisWidth = chartSizePx.y / targetAspectRatio\n const horizontalPadding = Math.max(chartSizePx.x - targetAxisWidth, 0)\n chart.setPadding({ left: horizontalPadding / 2, right: horizontalPadding / 2, top: chartPadding, bottom: chartPadding })\n } else if (curAspectRatio > targetAspectRatio) {\n // Add vertical chart padding to maintain Map picture aspect ratio.\n const targetAxisHeight = chartSizePx.x * targetAspectRatio\n const verticalPadding = Math.max(chartSizePx.y - targetAxisHeight, 0)\n chart.setPadding({ top: verticalPadding / 2, bottom: verticalPadding / 2, left: chartPadding, right: chartPadding })\n }\n }\n updateChartAspectRatio()\n window.addEventListener('resize', updateChartAspectRatio)\n\n // Load heat map data visualization layer data set.\n fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0025/office-wifi-strength.json',\n )\n .then((r) => r.json())\n .then((data) => {\n const wifiStrengthMatrix = data.data\n const heatmap = chart\n .addHeatmapGridSeries({\n columns: wifiStrengthMatrix.length,\n rows: wifiStrengthMatrix[0].length,\n start: { x: 0, y: 0 },\n end: { x: 1, y: 1 },\n })\n .setName('Wi-Fi Strength')\n .invalidateIntensityValues(wifiStrengthMatrix)\n .setWireframeStyle(emptyLine)\n .setFillStyle(\n new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n interpolate: false,\n steps: [\n // Value 0 = no measurement.\n { value: 0, color: ColorRGBA(0, 0, 0, 0), label: '' },\n // Value 1 = weak wifi strength.\n { value: 0.9, color: ColorRGBA(255, 0, 0, 50), label: 'Weak' },\n // Value 2 = medium wifi strength.\n { value: 1.9, color: ColorRGBA(255, 255, 0, 50), label: 'Medium' },\n // Value 3 = good wifi strength.\n { value: 2.9, color: ColorRGBA(0, 255, 0, 50), label: 'Good' },\n ],\n }),\n }),\n )\n .setCursorResultTableFormatter((builder, series, dataPoint) =>\n builder\n .addRow(series.getName())\n .addRow(\n dataPoint.intensity === 0\n ? 'No measurement'\n : dataPoint.intensity === 1\n ? 'Weak'\n : dataPoint.intensity === 2\n ? 'Medium'\n : dataPoint.intensity === 3\n ? 'Good'\n : '?',\n ),\n )\n\n legend.add(heatmap)\n })\n\n // Load router icon.\n const routerImage = new Image()\n routerImage.crossOrigin = ''\n routerImage.src = new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0025/router.png'\n routerImage.onload = () => {\n const iconAspectRatio = routerImage.height / routerImage.width\n const iconWidthPx = 48\n // Display router icon inside chart at preset X and Y axis coordinates (range 0-1)\n const routerIcon = chart\n .addUIElement(UIElementBuilders.TextBox, { x: chart.getDefaultAxisX(), y: chart.getDefaultAxisY() })\n .setText('')\n .setPadding({ left: iconWidthPx, top: iconWidthPx * iconAspectRatio })\n .setBackground((background) =>\n background.setStrokeStyle(emptyLine).setFillStyle(\n new ImageFill({\n source: routerImage,\n }),\n ),\n )\n .setPosition({ x: 0.322, y: 0.09 })\n .setOrigin(UIOrigins.Center)\n }\n}\n","url":null,"readme":"Example showcasing LightningChart JS capabilities with external pictures.\n\nThis example takes place in the context of data visualization in office premises.\nFor this purpose, the series area is styled by a digital picture of the office layout.\n\nIn code, this is implemented by loading the `Image` (in this case PNG file), and creating a new `ImageFill` object using that image.\nWhile it might not be obvious from looking at it, the chart type used in this example is a `ChartXY`.\nThe picture is shown by configuring the fill style of the series background.\n\n```ts\nconst image = new Image()\nimage.src = 'office-layout.png'\n\nconst imageFill = new ImageFill({ source: image })\n\nchart.setSeriesBackgroundFillStyle(imageFill)\n```\n\nOnce, the `ChartXY` is laid over the office layout, any of the numerous data visualization features of the chart type can be used to add detail to the chart.\n\nIn this case, we used a `Heatmap Series` to display the distribution of WiFi strength across the entire office, where the data values are distributed to 4 categories (No measurement, Weak, Medium and Good).\n\n## Adding Icons to LightningCharts\n\nAdditionally, this example showcases how icons can be used inside charts.\nThe example uses this by displaying the WiFi router location as a picture of a router device (bottom of chart).\n\nThis is achieved similarly to the office layout picture by utilizing `ImageFill`.\nHowever, this time instead of styling the series background, an `UIElement` is created and the image is attached to its background.\n\n```ts\nconst uiIcon = chart\n .addUIElement()\n .setBackground((background) => background.setFillStyle(imageFill))\n // Icon size is controlled using padding.\n .setPadding({ left: widthPx, top: heightPx })\n .setText('')\n```\n\n[Office layout picture](https://www.edrawsoft.com/template-colored-office-layout.html) by [Edraw](https://www.edrawsoft.com)\n","image":"officeDataVisualizationLayer"},{"id":"lcjs-example-0026-temperatureAnomalyChart","title":"JavaScript Temperature Anomaly Chart","tags":["xy","line","image"],"description":"Visualization of Temperature Anomaly Index and CO2 amount for period from 1880 to 2020. Showcases animated video icons","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChart JS Example that showcases embedding animated GIF icons inside XY charts.\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, AxisTickStrategies, UIElementBuilders, UIOrigins, ImageFill, emptyLine, ImageFitMode, emptyFill, Themes } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('')\n\nconst axisY1 = chart.getDefaultAxisY().setTitle('Atmospheric Carbon Dioxide (ppm)')\n\nconst axisY2 = chart\n .addAxisY({\n opposite: true,\n })\n .setTitle('Temperature Anomaly Index (°C)')\n // Hide tick grid-lines from second Y axis.\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMinorTickStyle((minor) => minor.setGridStrokeStyle(emptyLine))\n .setMajorTickStyle((major) => major.setGridStrokeStyle(emptyLine)),\n )\n\nconst axisX = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime)\n\n// Fetch example data sets.\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + `examples/assets/0026/anomaly-data.json`)\n .then((r) => r.json())\n .then((data) => {\n const { temperature, co2 } = data\n\n // Visualize Atmospheric Carbon Dioxide (ppm).\n const carbonDioxideSeries = chart\n .addLineSeries({\n yAxis: axisY1,\n })\n .setName('Atmospheric Carbon Dioxide (ppm)')\n // Data set contains PPM measurement values only. First measurement is from year 1880, and each consecutive measurement is 1 year after previous.\n .add(\n co2.map((ppm, i) => ({\n y: ppm,\n x: new Date(1880 + i, 0, 1, 0, 0, 0, 0).getTime(),\n })),\n )\n\n // Visualize Temperature Anomaly Index (°C).\n const temperatureAnomalyIndexSeries = chart\n .addLineSeries({\n yAxis: axisY2,\n // Specify index for automatic color selection. By default this would be 1, but a larger number is supplied to increase contrast between series.\n automaticColorIndex: 2,\n })\n .setName('Temperature Anomaly Index (°C)')\n // Data set contains PPM measurement values only. First measurement is from year 1880, and each consecutive measurement is 1 year after previous.\n .add(\n temperature.map((index, i) => ({\n y: index,\n x: new Date(1880 + i, 0, 1, 0, 0, 0, 0).getTime(),\n })),\n )\n\n // Add legend.\n const legend = chart\n .addLegendBox(undefined, { x: axisX, y: axisY1 })\n .add(chart)\n // Move to non-default location, top left of chart.\n .setOrigin(UIOrigins.LeftTop)\n .setMargin(4)\n const positionLegendOnAxes = () => legend.setPosition({ x: axisX.getInterval().start, y: axisY1.getInterval().end })\n positionLegendOnAxes()\n axisX.onIntervalChange(positionLegendOnAxes)\n axisY1.onIntervalChange(positionLegendOnAxes)\n\n // Add thundercloud icons to predefined X and Y2 (anomaly index) axis locations.\n const video = document.createElement('video')\n video.crossOrigin = ''\n video.autoplay = true\n video.muted = true\n video.loop = true\n video.src =\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + `examples/assets/0026/thundercloud.webm`\n video.load()\n video.addEventListener('loadeddata', (e) => {\n video.play()\n const thunderCloudPositions = [\n { x: new Date(1962, 0, 1).getTime(), y: 0.15 },\n { x: new Date(1999, 0, 1).getTime(), y: 0.7 },\n ]\n const thunderCloudImgSize = { x: video.videoWidth, y: video.videoHeight }\n const thunderCloudImgAspectRatio = thunderCloudImgSize.y / thunderCloudImgSize.x\n // NOTE: Visible icon size can be affected by device pixel ratio.\n const thunderCloudIconSizePx = { x: 100, y: 100 * thunderCloudImgAspectRatio }\n thunderCloudPositions.forEach((position) => {\n // UI Picture Icon can be created by creating a TextBox, removing text and controlling the icons size by padding.\n const uiIcon = chart\n .addUIElement(UIElementBuilders.TextBox, { x: axisX, y: axisY2 })\n .setPosition(position)\n .setOrigin(UIOrigins.CenterBottom)\n .setTextFillStyle(emptyFill)\n .setPadding({ left: thunderCloudIconSizePx.x, top: thunderCloudIconSizePx.y })\n .setBackground((background) =>\n background.setStrokeStyle(emptyLine).setFillStyle(\n new ImageFill({\n source: video,\n fitMode: ImageFitMode.Fit,\n }),\n ),\n )\n })\n })\n })\n","url":null,"readme":"This example shows visualization of **Temperature anomaly index** and **Atmospheric Carbon Dioxide** in parts per million (ppm for short) for period from 1880 to 2020.\n\n- **Temperature anomaly** means a departure from a reference value or long-term average. A positive anomaly indicates that the observed temperature was warmer than the reference value, while a negative anomaly indicates that the observed temperature was cooler than the reference value.\n\nThis chart has two Y axes since it displays two trends on the same time range, but with different value ranges.\n\nThe extra Y axis on the right side is created like this\n\n```ts\nconst axisY2 = chart.addAxisY({ opposite: true })\n```\n\nWhen creating series, the connected axes can be explicitly defined like so\n\n```ts\nconst temperatureAnomalyIndexSeries = chart.addLineSeries({ yAxis: axisY2 })\n```\n\nAdditionally, this example showcases adding animated video icons inside the chart. The thunderclouds in this example are displayed from an attached `.mp4` asset file, which is displayed using an `UIElement`.\n\n```ts\nconst video = document.createElement('video')\nvideo.src = 'thundercloud.mp4'\n\nconst uiIcon = chart.addUIElement().setBackground((background) => background.setFillStyle(new ImageFill({ source: video })))\n```\n\n[Storm](https://icons8.com/icon/9t5k4YMYvtFl/storm) icon by [Icons8](https://icons8.com)\n","image":"temperatureAnomalyChart"},{"id":"lcjs-example-0027-visibleFitYAxis","title":"JavaScript Visible Fitting Y Axis Chart","tags":["xy","line","line","realtime"],"description":"Example how Y axis fitting to visible data can be achieved in scrolling line chart applications","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Example how Y axis fitting to visible data can be achieved in scrolling line chart applications\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\nconst { lightningChart, AxisScrollStrategies, Themes } = lcjs\nconst { createProgressiveTraceGenerator } = xydata\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Axis Y Fitting to visible data')\n .setMouseInteractions(false)\n\nconst lineSeries = chart.addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n})\n\n// Setup scrolling X Axis.\nconst dataPointsHistory = 500\nconst axisX = chart\n .getDefaultAxisX()\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - dataPointsHistory, stopAxisAfter: false }))\n .setMouseInteractions(false)\n\nconst axisY = chart.getDefaultAxisY().setMouseInteractions(false)\n\n// Keep track of n last data points (visible data points).\nconst lastYValues = []\n// Value that controls how often visible Y interval should be updated. Frequent updates can be CPU intensive especially if there are a lot of data points in view.\nconst updateYViewIntervalMs = 100\nlet lastYViewIntervalUpdate = 0\n\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(10000)\n .generate()\n .setStreamInterval(1000 / 60)\n .setStreamBatchSize(1)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => {\n // Add point to line series.\n lineSeries.add(point)\n\n // Keep track of n last data points (visible last points)\n if (lastYValues.length >= dataPointsHistory) {\n lastYValues.shift()\n }\n lastYValues.push(point.y)\n\n const tNow = window.performance.now()\n if (tNow - lastYViewIntervalUpdate >= updateYViewIntervalMs) {\n lastYViewIntervalUpdate = tNow\n // Calculate Y values range of visible data points.\n let yMin = Number.MAX_SAFE_INTEGER\n let yMax = -Number.MAX_SAFE_INTEGER\n for (const y of lastYValues) {\n yMin = Math.min(yMin, y)\n yMax = Math.max(yMax, y)\n }\n // Actively set displayed Y axis interval to the range of visible data points.\n axisY.setInterval({ start: yMin, end: yMax })\n }\n })\n","url":null,"readme":"Example showcasing how active Y fitting to range of visible data points can be achieved in scrolling applications.\n\nBy default, the _fitting_ axis scroll strategy considers the full data set, not only the data points that are visible.\n\nIn some applications, this can be counter intuitive, which is why we created this example. This should provide a concrete reference on how this kind of \"active fitting\" can be implemented.\n\nThe idea is tracking the last couple of Y values and updating axis Y interval manually to only act according to the visible data points instead of entire data set.\n\n## Participating in the development of LightningChart JS\n\nIn case this particular mode of axis fitting is especially interesting/important to you, please don't hesitate to [contact our support](https://lightningchart.com/support-services/) and share your very own requirements with us. As we've mentioned before, all our development is driven by user requirements so be sure to get your voice included!\n","image":"visibleFitYAxis"},{"id":"lcjs-example-0028-multiChannelLineProgressiveOwnAxes","title":"Multi-channel real-time data monitoring JavaScript Chart","tags":["dashboard","line","xy","realtime","datapattern","datacleaning"],"description":"Lightning-fast Line Chart visualization over multiple channels that progress on the same X Axis","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Lightning-fast Line Chart visualization over multiple channels that progress on the same X Axis\n */\n\nconst lcjs = require('@lightningchart/lcjs')\n\n// NOTE: Assuming predefined number of stacked channels.\nconst SIGNALS = new Array(5).fill(0).map((_, i) => ({\n title: `Ch ${i + 1}`,\n}))\nconst DEFAULT_X_RANGE_MS = 30 * 1000\n\nconst {\n lightningChart,\n emptyFill,\n emptyLine,\n AxisTickStrategies,\n AxisScrollStrategies,\n UIOrigins,\n UIDraggingModes,\n LegendBoxBuilders,\n Themes,\n} = lcjs\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle(`Multi-channel real-time monitoring (${SIGNALS.length} chs, 1000 Hz)`)\n .setMouseInteractions(false)\n\nconst ekgImage = new Image()\nekgImage.crossOrigin = ''\nekgImage.src = document.head.baseURI + 'examples/assets/0028/ekg.png'\nconst ekgIcon = chart.engine.addCustomIcon(ekgImage, { height: 18 })\n\nconst axisX = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time)\n .setStrokeStyle(emptyLine)\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - DEFAULT_X_RANGE_MS, stopAxisAfter: false }))\n\nchart.getDefaultAxisY().dispose()\nconst channels = SIGNALS.map((signal, iSignal) => {\n const iStack = SIGNALS.length - (iSignal + 1)\n const axisY = chart\n .addAxisY({ iStack })\n .setTitle(signal.title)\n .setTitleRotation(0)\n .setAnimationScroll(false)\n .setMargins(iStack > 0 ? 5 : 0, iSignal === 0 ? 35 : iStack < SIGNALS.length - 1 ? 5 : 0)\n .setMouseInteractions(false)\n const series = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n automaticColorIndex: iSignal,\n yAxis: axisY,\n })\n .setName(`Channel ${iSignal + 1}`)\n .setAreaFillStyle(emptyFill)\n .setMaxSampleCount(50000)\n // Use 2 thickness for smooth anti-aliased thick lines with the best visual look\n .setStrokeStyle((style) => style.setThickness(2))\n .setIcon(ekgIcon)\n\n // When series is hidden, also hide the entire Y axis.\n series.onVisibleStateChanged((_, visible) => {\n axisY.setVisible(visible)\n })\n\n return { series, axisY }\n})\n\n// Add legend\nconst legend = chart.addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\nchannels.forEach((channel) => legend.add(channel.series))\n\n// Custom interactions for zooming in/out along Time axis while keeping data scrolling.\naxisX.setNibInteractionScaleByDragging(false).setNibInteractionScaleByWheeling(false).setAxisInteractionZoomByWheeling(false)\nconst customZoomX = (_, event) => {\n const interval = axisX.getInterval()\n const range = interval.end - interval.start\n const newRange = range + Math.sign(event.deltaY) * 0.1 * Math.abs(range)\n axisX.setInterval({ start: interval.end - newRange, end: interval.end, stopAxisAfter: false })\n event.preventDefault()\n event.stopPropagation()\n}\naxisX.onAxisInteractionAreaMouseWheel(customZoomX)\nchart.onSeriesBackgroundMouseWheel(customZoomX)\nchannels.forEach((channel) => {\n channel.series.onMouseWheel(customZoomX)\n})\n\n// Add LCJS user interface button for resetting view.\nconst buttonReset = chart\n .addUIElement()\n .setText('Reset')\n .setPosition({ x: 0, y: 0 })\n .setOrigin(UIOrigins.LeftBottom)\n .setMargin({ left: 4, bottom: 4 })\n .setDraggingMode(UIDraggingModes.notDraggable)\nbuttonReset.onMouseClick((_) => {\n const xMax = channels[0].series.getXMax()\n axisX.setInterval({ start: xMax - DEFAULT_X_RANGE_MS, end: xMax, stopAxisAfter: false })\n channels.forEach((channel) => channel.axisY.fit())\n})\n\n// Generate data sets that is repeated for each channel for demonstration purposes.\nconst dataSets = [\n { length: Math.ceil(400 * Math.PI), func: (x) => 8 * Math.sin(x / 200) },\n { length: Math.ceil(3200 * Math.PI), func: (x) => 7 * Math.sin(x / 1600) },\n { length: Math.ceil(800 * Math.PI), func: (x) => 4 * (Math.cos(x / 400) + Math.sin(x / 200)) },\n { length: Math.ceil(800 * Math.PI), func: (x) => 6 * Math.sin(x / 100) + Math.cos(x / 400) },\n { length: Math.ceil(1800 * Math.PI), func: (x) => 8 * Math.cos(x / 900) },\n].map((config) => {\n const data = []\n data.length = config.length\n for (let i = 0; i < config.length; i += 1) {\n const y = config.func(i)\n data[i] = y\n }\n return data\n})\n\n// Stream data into series.\nlet tStart = window.performance.now()\nlet pushedDataCount = 0\nconst dataPointsPerSecond = 1000 // 1000 Hz\nconst xStep = 1000 / dataPointsPerSecond\nconst streamData = () => {\n const tNow = window.performance.now()\n // NOTE: This code is for example purposes (streaming stable data rate without destroying browser when switching tabs etc.)\n // In real use cases, data should be pushed in when it comes.\n const shouldBeDataPointsCount = Math.floor((dataPointsPerSecond * (tNow - tStart)) / 1000)\n const newDataPointsCount = Math.min(shouldBeDataPointsCount - pushedDataCount, 1000) // Add max 1000 data points per frame into a series. This prevents massive performance spikes when switching tabs for long times\n const seriesNewDataPoints = []\n for (let iChannel = 0; iChannel < channels.length; iChannel++) {\n const dataSet = dataSets[iChannel % dataSets.length]\n const newDataPoints = []\n for (let iDp = 0; iDp < newDataPointsCount; iDp++) {\n const x = (pushedDataCount + iDp) * xStep\n const iData = (pushedDataCount + iDp) % dataSet.length\n const y = dataSet[iData]\n const point = { x, y }\n newDataPoints.push(point)\n }\n seriesNewDataPoints[iChannel] = newDataPoints\n }\n channels.forEach((channel, iChannel) => channel.series.appendJSON(seriesNewDataPoints[iChannel]))\n pushedDataCount += newDataPointsCount\n requestAnimationFrame(streamData)\n}\nstreamData()\n\n// Measure FPS.\nlet tFpsStart = window.performance.now()\nlet frames = 0\nlet fps = 0\nconst title = chart.getTitle()\nconst recordFrame = () => {\n frames++\n const tNow = window.performance.now()\n fps = 1000 / ((tNow - tFpsStart) / frames)\n requestAnimationFrame(recordFrame)\n\n chart.setTitle(`${title} (FPS: ${fps.toFixed(1)})`)\n}\nrequestAnimationFrame(recordFrame)\nsetInterval(() => {\n tFpsStart = window.performance.now()\n frames = 0\n}, 5000)\n","url":null,"readme":"Lightning-fast Line Chart visualization over multiple high speed (1000 Hz) trends that progress along the same scrolling Time X Axis.\n\nWidely used in all kinds of fields for monitoring live data from many (hundreds or even thousands) of data sources at the same time.\n\nFrames rendered per second (FPS) is recorded live, and displayed on the chart title. FPS of 40-60 indicates a smooth running performance.\n\nThis line chart uses smooth anti-aliased thick lines for the best visual look, which is pretty GPU heavy with high data rates.\nFor a lighter alternative you can check out [a similar line chart with best-performance graphics](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0010-multiChannelLineProgressive.html)\n\n## Automatic Data Cleaning\n\nOne of the most ground breaking features of LightningChart JS is _automatic data cleaning_.\n\nBecause LightningChart JS is designed for real-time data streaming solutions, it is essential that old, out of view data is automatically cleaned in the most performant manner.\n\nIn practice, this results in an application where you can even scroll back for some distance and see older data, but if you scroll far enough, you will find that the old data has been cleaned. This allows the application to run _forever_!\n\n## Several times proven performance leader in JS charting\n\nLightningChart is the pioneer group among JavaScript chart providers who started the study of data visualization performance comparison.\nThis activity is based on open-source applications that test several different charting tools with an identical use case.\n\nDuring the test, different metrics of performance are measured which indicate how efficiently the data visualization software performs. Common metrics are:\n\n- _Refresh rate_ (FPS), how rapidly the displayed visualization is updated as times per second.\n- _CPU usage_ (%), how much of available computing resource is utilized.\n - This is very important, because almost entirety of the computing power allocated to browsing a single web page is SHARED between all the content on the web page.\n - In simple terms, if you have a badly performing chart on your web page then it means your whole page will perform bad.\n- _Data amount_, how much data can be shown. In practice, limitations could be imposed on how long history can be displayed or how precisely the data can be visualized.\n\n**Since November 2021**, LightningChart JS has dominated all performance tests which have since covered a large set of data visualization use cases in various industries:\n\n- [_Static line graphs_](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0017-largeLineChartXY.html) | These days LightningChart loads far larger data sets and over 50 times faster than your average web chart.\n\n- [_Real-time line charts_](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0010-multiChannelLineProgressive.html) | In the original motivation for its development, LightningChart JS performs over **500000** times more efficiently than the average JS chart - processing tens of thousands more data samples, using 4 times less processing power and refreshing 7 times in the same time others do just once.\n\n- [_Heatmap charts_](https:/lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0803-scrollingHeatmap.html) | Traditional JS heatmaps can be used to visualize small grids with total of 1000 data points and under. LCJS enables visualization of BILLION large data sets that could cover for example large geographical areas such as entire countries.\n\n**Find all the information of open-source LightningChart JS performance studies on our** [web page](https://lightningchart.com/high-performance-javascript-charts/)!\n","image":"multiChannelLineProgressiveOwnAxes","showNew":true},{"id":"lcjs-example-0029-htmlScrollDashboard","title":"JavaScript HTML Scroll Bars Dashboard","tags":["dashboard","line","xy","realtime","datapattern","datacleaning"],"description":"Showcases how to fit a large number of charts into 1 by utilizing HTML scroll bars","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Lightning-fast Line Chart visualization over multiple channels that progress on the same X Axis\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\n\n// NOTE: Assuming predefined number of stacked channels.\nconst SIGNALS = new Array(20).fill(0).map((_, i) => ({\n title: `Ch ${i + 1}`,\n}))\nconst DEFAULT_X_RANGE_MS = 10 * 1000\nconst DASHBOARD_HEIGHT = 1400\n\nconst {\n lightningChart,\n AutoCursorModes,\n emptyLine,\n AxisTickStrategies,\n AxisScrollStrategies,\n UIOrigins,\n UIDraggingModes,\n emptyFill,\n Themes,\n} = lcjs\n\nconst { createProgressiveFunctionGenerator } = xydata\n\nconst exampleContainer = document.getElementById('chart') || document.body\nconst chartContainer = document.createElement('div')\nexampleContainer.append(chartContainer)\nchartContainer.style.width = '100%'\nchartContainer.style.height = `${DASHBOARD_HEIGHT}px`\nchartContainer.style.display = 'flex'\nchartContainer.style.flexDirection = 'column'\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n container: chartContainer,\n // theme: Themes.darkGold\n })\n .setTitle(`Multi-channel real-time monitoring (${SIGNALS.length} chs, 1000 Hz)`)\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setMouseInteractions(false)\n\nconst axisX = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time)\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - DEFAULT_X_RANGE_MS, stopAxisAfter: false }))\n\nchart.getDefaultAxisY().dispose()\nconst channels = SIGNALS.map((signal, iSignal) => {\n const iStack = SIGNALS.length - (iSignal + 1)\n const axisY = chart\n .addAxisY({ iStack })\n .setTickStrategy(AxisTickStrategies.Empty)\n .setTitle(`Ch ${SIGNALS.length - iSignal}`)\n .setTitleRotation(0)\n .setMargins(iStack > 0 ? 3 : 0, iStack < SIGNALS.length - 1 ? 3 : 0)\n .setStrokeStyle(emptyLine)\n\n const series = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n automaticColorIndex: iSignal,\n yAxis: axisY,\n })\n .setMaxSampleCount(20_000)\n .setAreaFillStyle(emptyFill)\n // Use -1 thickness for best performance, especially on low end devices like mobile / laptops.\n .setStrokeStyle((style) => style.setThickness(-1))\n\n return { series, axisY }\n})\n\n// Custom interactions for zooming in/out along Time axis while keeping data scrolling.\naxisX.setNibInteractionScaleByDragging(false).setNibInteractionScaleByWheeling(false).setAxisInteractionZoomByWheeling(false)\nconst customZoomX = (_, event) => {\n const interval = axisX.getInterval()\n const range = interval.end - interval.start\n const newRange = range + Math.sign(event.deltaY) * 0.1 * Math.abs(range)\n axisX.setInterval({ start: interval.end - newRange, end: interval.end, stopAxisAfter: false })\n event.preventDefault()\n event.stopPropagation()\n}\naxisX.onAxisInteractionAreaMouseWheel(customZoomX)\nchart.onSeriesBackgroundMouseWheel(customZoomX)\nchannels.forEach((channel) => {\n channel.series.onMouseWheel(customZoomX)\n})\n\n// Add LCJS user interface button for resetting view.\nconst buttonReset = chart\n .addUIElement()\n .setText('Reset')\n .setPosition({ x: 0, y: 0 })\n .setOrigin(UIOrigins.LeftBottom)\n .setMargin({ left: 4, bottom: 4 })\n .setDraggingMode(UIDraggingModes.notDraggable)\nbuttonReset.onMouseClick((_) => {\n const xMax = channels[0].series.getXMax()\n axisX.setInterval({ start: xMax - DEFAULT_X_RANGE_MS, end: xMax, stopAxisAfter: false })\n channels.forEach((channel) => channel.axisY.fit())\n})\n\n// Define unique signals that will be used for channels.\nconst signals = [\n { length: 400 * Math.PI, func: (x) => Math.sin(x / 200) },\n { length: 400 * Math.PI, func: (x) => Math.cos(x / 200) },\n {\n length: 800 * Math.PI,\n func: (x) => Math.cos(x / 400) + Math.sin(x / 200),\n },\n {\n length: 800 * Math.PI,\n func: (x) => Math.sin(x / 100) + Math.cos(x / 400),\n },\n {\n length: 800 * Math.PI,\n func: (x) => Math.sin(x / 200) * Math.cos(x / 400),\n },\n { length: 1800 * Math.PI, func: (x) => Math.cos(x / 900) },\n { length: 3200 * Math.PI, func: (x) => Math.sin(x / 1600) },\n {\n length: 2600 * Math.PI,\n func: (x) => Math.sin(x / 400) * Math.cos(x / 1300),\n },\n]\n\n// Generate data sets for each signal.\nPromise.all(\n signals.map((signal) =>\n createProgressiveFunctionGenerator()\n .setStart(0)\n .setEnd(signal.length)\n .setStep(1)\n .setSamplingFunction(signal.func)\n .generate()\n .toPromise()\n .then((data) => data.map((xy) => xy.y)),\n ),\n).then((dataSets) => {\n // Stream data into series.\n let tStart = window.performance.now()\n let pushedDataCount = 0\n const dataPointsPerSecond = 1000 // 1000 Hz\n const xStep = 1000 / dataPointsPerSecond\n const streamData = () => {\n const tNow = window.performance.now()\n // NOTE: This code is for example purposes (streaming stable data rate without destroying browser when switching tabs etc.)\n // In real use cases, data should be pushed in when it comes.\n const shouldBeDataPointsCount = Math.floor((dataPointsPerSecond * (tNow - tStart)) / 1000)\n const newDataPointsCount = Math.min(shouldBeDataPointsCount - pushedDataCount, 1000) // Add max 1000 data points per frame into a series. This prevents massive performance spikes when switching tabs for long times\n const seriesNewDataPoints = []\n for (let iChannel = 0; iChannel < channels.length; iChannel++) {\n const dataSet = dataSets[iChannel % dataSets.length]\n const newDataPoints = []\n for (let iDp = 0; iDp < newDataPointsCount; iDp++) {\n const x = (pushedDataCount + iDp) * xStep\n const iData = (pushedDataCount + iDp) % dataSet.length\n const y = dataSet[iData]\n const point = { x, y }\n newDataPoints.push(point)\n }\n seriesNewDataPoints[iChannel] = newDataPoints\n }\n channels.forEach((channel, iChannel) => channel.series.appendJSON(seriesNewDataPoints[iChannel]))\n pushedDataCount += newDataPointsCount\n requestAnimationFrame(streamData)\n }\n streamData()\n})\n\n// Measure FPS.\nlet tFpsStart = window.performance.now()\nlet frames = 0\nlet fps = 0\nconst title = chart.getTitle()\nconst recordFrame = () => {\n frames++\n const tNow = window.performance.now()\n fps = 1000 / ((tNow - tFpsStart) / frames)\n requestAnimationFrame(recordFrame)\n\n chart.setTitle(`${title} (FPS: ${fps.toFixed(1)})`)\n}\nrequestAnimationFrame(recordFrame)\nsetInterval(() => {\n tFpsStart = window.performance.now()\n frames = 0\n}, 5000)\n","url":null,"readme":"Showcases how to fit a large number of charts into 1 view and fallback to HTML scroll bars when all of the content does not fit to view.\n\nThis approach allows fitting incredible amounts of data visualization into a single view.\n\nThis line chart uses thin line rendering for the best performance, especially visible on devices with weak GPUs such as mobile devices and laptops.\nFor a thicker alternative you can check out [a similar line chart with best-looking line graphics](https://www.lightningchart.com/lightningchart-js-interactive-examples/examples/0028-multiChannelLineProgressiveOwnAxes.html)\n","image":"htmlScrollDashboard"},{"id":"lcjs-example-0030-logLine","title":"JavaScript Logarithmic Line Chart","tags":["line","xy","logarithmic"],"description":"Example showcasing logarithmic Axis with LineSeries.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChart JS Example that showcases Logarithmic Axes feature.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, ColorHEX, SolidLine, SolidFill, emptyLine, Themes } = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveFunctionGenerator } = xydata\n\n// Initialize chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n // Specify default Y Axis as logarithmic.\n defaultAxisY: {\n type: 'logarithmic',\n // Use 10 as base number.\n base: '10',\n },\n })\n .setTitle('Logarithmic Axis vs Linear Axis')\n\nconst yAxisLogarithmic = chart.getDefaultAxisY().setTitle('Logarithmic Y Axis')\n\n// Add a second Y Axis that is linear.\nconst yAxisLinear = chart\n .addAxisY({\n type: 'linear',\n })\n .setTitle('Linear Y Axis')\n // Remove tick grid lines from second Y Axis\n .setTickStrategy('Numeric', (tickStrategy) =>\n tickStrategy\n .setMinorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine))\n .setMajorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine)),\n )\n\n// Add LegendBox.\nconst legend = chart\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n\n// Graph 2 functions on both Axes.\nconst xStep = 0.1\nconst functions = [\n { label: 'f(x) = x', xStart: xStep, xEnd: 10, Y: (x) => x },\n { label: 'f(x) = 10^x', xStart: xStep, xEnd: 3.0, Y: (x) => 10 ** x },\n]\n\n// Generate function data in predefined X values range.\nPromise.all(\n functions.map((info) =>\n createProgressiveFunctionGenerator()\n .setStart(info.xStart)\n .setEnd(info.xEnd)\n .setStep(xStep)\n .setSamplingFunction(info.Y)\n .generate()\n .toPromise(),\n ),\n).then((dataSets) => {\n // Create two series for each function, one on each Axis.\n dataSets.forEach((dataSet, iFunction) => {\n const info = functions[iFunction]\n const legendEntries = []\n ;[yAxisLinear, yAxisLogarithmic].forEach((yAxis, iAxis) => {\n const series = chart\n .addLineSeries({\n yAxis,\n })\n .setCursorResultTableFormatter((builder, _, x, y) =>\n builder\n .addRow(`${info.label} (${iAxis === 0 ? 'linear' : 'logarithmic'})`)\n .addRow('X', '', x.toFixed(1))\n .addRow('Y', '', y.toFixed(1)),\n )\n .setName(info.label)\n .setStrokeStyle((style) => style.setThickness(5))\n .add(dataSet)\n\n console.log(series.getBoundaries())\n\n // Share LegendBoxEntry for both Series of the function.\n if (iAxis === 0) {\n legend.add(series)\n legend.setEntries((entry, component) => {\n if (component === series) {\n legendEntries[iFunction] = entry\n }\n })\n } else {\n series.attach(legendEntries[iFunction])\n }\n })\n })\n\n // Fit Axes immediately.\n yAxisLinear.fit()\n yAxisLogarithmic.fit()\n})\n","url":null,"readme":"This example showcases creation of logarithmic axes, highlighting the functional differences between linear and logarithmic axes using _line series_.\n\nLogarithmic Axis can be created by supplying `type: 'logarithmic'` argument when the Axis is created:\n\n```typescript\nconst chart = lightningChart().ChartXY({\n // Specify default Y Axis as logarithmic (10).\n defaultAxisY: {\n type: 'logarithmic',\n base: 10,\n },\n})\n\n// Add second Y Axis that is also logarithmic (Math.E).\nconst axis = chart.addAxisY({\n type: 'logarithmic',\n base: 'e',\n})\n```\n","image":"logLine"},{"id":"lcjs-example-0031-logBars","title":"JavaScript Grouped Bars with Logarithmic Y Axis","tags":["bar","logarithmic","column","group"],"description":"Example showcasing grouped bars chart with Logarithmic Y Axis","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChart JS Example that showcases logarithmic Y Axis in a Grouped Bars Chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, BarChartSorting, LegendBoxBuilders, Themes } = lcjs\n\nconst barChart = lightningChart()\n .BarChart({\n valueAxis: {\n type: 'logarithmic',\n },\n // theme: Themes.darkGold\n })\n .setTitle('Grouped Bars Chart with Logarithmic Y Axis')\n .setValueLabels(undefined)\n .setCursorResultTableFormatter((builder, category, value, bar) => {\n builder.addRow('Department:', bar.subCategory).addRow('# of employees:', String(value))\n return builder\n })\n\nbarChart\n .setDataGrouped(\n ['Quarter 1', 'Quarter 2', 'Quarter 3', 'Quarter 4'],\n [\n { subCategory: 'Product 1', values: [152000, 218000, 526900, 726500] },\n { subCategory: 'Product 2', values: [28300, 32600, 18000, 54600] },\n { subCategory: 'Product 3', values: [120000, 105600, 98500, 13400] },\n ],\n )\n .setSorting(BarChartSorting.Alphabetical)\n\nbarChart.valueAxis.setTitle('Product sales (€)')\n\n// Add LegendBox.\nconst legend = barChart\n .addLegendBox(LegendBoxBuilders.VerticalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\nlegend.add(barChart)\n","url":null,"readme":"Example of visualizing a _Grouped Bars Chart_ with a logarithmic Y Axis.\n","image":"logBars"},{"id":"lcjs-example-0033-sweepingLineDashboard","title":"JavaScript Sweeping Line Chart Dashboard","tags":["dashboard","line","xy","realtime"],"description":"Showcases sweeping ECG line chart with LightningChart JS","metaDescription":"An interactive example with the code editor shows a sweeping ECG line chart created with the LightningChart JS library. Test the performance of the library using our online code editor.","src":"/**\n * Example showcasing sweeping ECG line charts.\n *\n * Sweeping line chart functionality is not built-in into the library.\n * However, it is very well possible to build performant and good looking sweeping line applications\n * with LightningChart JS. Performance is not affected, but application code is slightly more complicated than\n * scrolling axis and some built-in features like real-time axis ticks and glow effects are not applicable.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, Themes, emptyLine, AutoCursorModes, AxisTickStrategies, ColorHEX, SolidFill, PointShape } = lcjs\n\nconst channelCount = 6\nconst dataRateHz = 1000\nconst xViewMs = 15 * 1000\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0033/ecg.json')\n .then((r) => r.json())\n .then((ecgData) => {\n const CHANNELS = new Array(channelCount).fill(0).map((_, i) => ({ name: `ECG-${i + 1}`, yMin: -2500, yMax: 2500 }))\n\n const lc = lightningChart()\n const chart = lc.ChartXY({\n // theme: Themes.darkGold\n })\n const theme = chart.getTheme()\n const ecgBackgroundFill = new SolidFill({\n color: theme.isDark ? ColorHEX('#000000') : ColorHEX('#ffffff'),\n })\n chart\n .setSeriesBackgroundFillStyle(ecgBackgroundFill)\n .setSeriesBackgroundStrokeStyle(emptyLine)\n .setMouseInteractions(false)\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setTitle(`Sweeping line chart ${CHANNELS.length} channels 1000 Hz`)\n const axisX = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Empty)\n .setStrokeStyle(emptyLine)\n .setScrollStrategy(undefined)\n .setInterval({ start: 0, end: xViewMs, stopAxisAfter: false })\n chart.getDefaultAxisY().dispose()\n const channels = CHANNELS.map((info, iCh) => {\n const axisY = chart\n .addAxisY({ iStack: CHANNELS.length - iCh })\n .setStrokeStyle(emptyLine)\n .setInterval({ start: info.yMin, end: info.yMax })\n .setTickStrategy(AxisTickStrategies.Empty)\n .setTitle(info.name)\n .setTitleRotation(0)\n .setMouseInteractions(false)\n\n // Series for displaying \"old\" data.\n const seriesRight = chart\n .addLineSeries({\n dataPattern: { pattern: 'ProgressiveX' },\n automaticColorIndex: iCh,\n yAxis: axisY,\n })\n .setName(info.name)\n .setStrokeStyle((stroke) => stroke.setThickness(2))\n .setEffect(false)\n\n // Rectangle for hiding \"old\" data under incoming \"new\" data.\n const seriesOverlayRight = chart.addRectangleSeries({ yAxis: axisY }).setEffect(false)\n const figureOverlayRight = seriesOverlayRight\n .add({ x1: 0, y1: 0, x2: 0, y2: 0 })\n .setFillStyle(ecgBackgroundFill)\n .setStrokeStyle(emptyLine)\n .setMouseInteractions(false)\n\n // Series for displaying new data.\n const seriesLeft = chart\n .addLineSeries({\n dataPattern: { pattern: 'ProgressiveX' },\n automaticColorIndex: iCh,\n yAxis: axisY,\n })\n .setName(info.name)\n .setStrokeStyle((stroke) => stroke.setThickness(2))\n .setEffect(false)\n\n const seriesHighlightLastPoints = chart\n .addPointSeries({ pointShape: PointShape.Circle, yAxis: axisY })\n .setPointFillStyle(new SolidFill({ color: theme.examples.highlightPointColor }))\n .setPointSize(5)\n .setEffect(false)\n\n // Synchronize highlighting of \"left\" and \"right\" series.\n let isHighlightChanging = false\n ;[seriesLeft, seriesRight].forEach((series) => {\n series.onHighlight((value) => {\n if (isHighlightChanging) {\n return\n }\n isHighlightChanging = true\n seriesLeft.setHighlight(value)\n seriesRight.setHighlight(value)\n isHighlightChanging = false\n })\n })\n\n return {\n seriesLeft,\n seriesRight,\n seriesOverlayRight,\n figureOverlayRight,\n seriesHighlightLastPoints,\n axisY,\n }\n })\n\n // Setup logic for pushing new data points into a \"custom sweeping line chart\".\n // LightningChart JS does not provide built-in functionalities for sweeping line charts.\n // This example shows how it is possible to implement a performant sweeping line chart, with a little bit of extra application complexity.\n let prevPosX = 0\n // Keep track of data pushed to each channel.\n const handleIncomingData = (dataPointsAllChannels) => {\n // Keep track of the latest X (time position), clamped to the sweeping axis range.\n let posX = 0\n\n for (let iCh = 0; iCh < CHANNELS.length; iCh += 1) {\n const newDataPointsTimestamped = dataPointsAllChannels[iCh]\n const channel = channels[iCh]\n\n // NOTE: Incoming data points are timestamped, meaning their X coordinates can go outside sweeping axis interval.\n // Clamp timestamps onto the sweeping axis range.\n const newDataPointsSweeping = newDataPointsTimestamped.map((dp) => ({\n x: dp.x % xViewMs,\n y: dp.y,\n }))\n const newDataPointsCount = newDataPointsSweeping.length\n\n posX = Math.max(posX, newDataPointsSweeping[newDataPointsSweeping.length - 1].x)\n\n // Check if the channel completes a full sweep (or even more than 1 sweep even though it can't be displayed).\n let fullSweepsCount = 0\n let signPrev = false\n for (const dp of newDataPointsSweeping) {\n const sign = dp.x < prevPosX\n if (sign === true && sign !== signPrev) {\n fullSweepsCount += 1\n }\n signPrev = sign\n }\n\n if (fullSweepsCount > 1) {\n // The below algorithm is incapable of handling data input that spans over several full sweeps worth of data.\n // To prevent visual errors, reset sweeping graph and do not process the data.\n // This scenario is triggered when switching tabs or minimizing the example for extended periods of time.\n channel.seriesRight.clear()\n channel.seriesLeft.clear()\n } else if (fullSweepsCount === 1) {\n // Sweeping cycle is completed.\n // Categorize new data points into those belonging to current sweep and the next.\n let dataCurrentSweep = []\n let dataNextSweep = []\n for (let i = 0; i < newDataPointsCount; i += 1) {\n if (newDataPointsSweeping[i].x <= prevPosX) {\n dataCurrentSweep = newDataPointsSweeping.slice(0, i)\n dataNextSweep = newDataPointsSweeping.slice(i + 1)\n break\n }\n }\n // Finish current sweep.\n channel.seriesLeft.add(dataCurrentSweep)\n // Swap left and right series.\n const nextLeft = channel.seriesRight\n const nextRight = channel.seriesLeft\n channel.seriesLeft = nextLeft\n channel.seriesRight = nextRight\n channel.seriesRight.setDrawOrder({ seriesDrawOrderIndex: 0 })\n channel.seriesOverlayRight.setDrawOrder({ seriesDrawOrderIndex: 1 })\n channel.seriesLeft.setDrawOrder({ seriesDrawOrderIndex: 2 })\n // Start sweeping from left again.\n channel.seriesLeft.clear()\n channel.seriesLeft.add(dataNextSweep)\n } else {\n // Append data to left.\n channel.seriesLeft.add(newDataPointsSweeping)\n }\n\n // Highlight last data point.\n const highlightPoints = [newDataPointsSweeping[newDataPointsSweeping.length - 1]]\n channel.seriesHighlightLastPoints.clear().add(highlightPoints)\n }\n\n // Move overlays of old data to right locations.\n const overlayXStart = 0\n const overlayXEnd = posX + xViewMs * 0.03\n channels.forEach((channel) => {\n channel.figureOverlayRight.setDimensions({\n x1: overlayXStart,\n x2: overlayXEnd,\n y1: channel.axisY.getInterval().start,\n y2: channel.axisY.getInterval().end,\n })\n })\n\n prevPosX = posX\n }\n\n // Setup example data streaming\n let tStart = window.performance.now()\n let pushedDataCount = 0\n const xStep = 1000 / dataRateHz\n const streamData = () => {\n const tNow = window.performance.now()\n // NOTE: This code is for example purposes only (streaming stable data rate)\n // In real use cases, data should be pushed in when it comes.\n const shouldBeDataPointsCount = Math.floor((dataRateHz * (tNow - tStart)) / 1000)\n const newDataPointsCount = shouldBeDataPointsCount - pushedDataCount\n if (newDataPointsCount > 0) {\n const newDataPoints = []\n for (let iDp = 0; iDp < newDataPointsCount; iDp++) {\n const x = (pushedDataCount + iDp) * xStep\n const iData = (pushedDataCount + iDp) % ecgData.length\n const y = ecgData[iData]\n const point = { x, y }\n newDataPoints.push(point)\n }\n\n // For this examples purposes, stream same data into all channels.\n handleIncomingData(new Array(CHANNELS.length).fill(0).map((_) => newDataPoints))\n pushedDataCount += newDataPointsCount\n }\n\n requestAnimationFrame(streamData)\n }\n streamData()\n })\n","url":null,"readme":"This interactive example with the code editor shows a sweeping ECG line chart created with LightningChart JS library. You can experiment with the variables and parameters to see how the library performs using our online code editor.\n\nSweeping line chart functionality is not built-in in the library. However, it is entirely possible to create performant and visually appealing sweeping line applications with LightningChart JS. Performance is unaffected, but the application code is slightly more complex than the scrolling axis. Some built-in features are also inapplicable, such as real-time axis ticks and glow effects.\n\nThis example displays 6 ECG channels, each with a 1000 Hz frequency.\n\nStress testing has concluded that even 100s of such high-frequency channels can be displayed at the same time. To squeeze more GPU performance out, you can try setting line series thickness to -1 for the best performance.\n\n---\n\nA simplified version of sweeping charts can be found in [this example](https://lightningchart.com/js-charts/interactive-examples/examples/lcjs-example-0041-sweepingLineChartNew.html).\n\nThese two examples have slightly different approaches to realizing the sweeping display, each having their own advantages and disadvantages:\n\nA) **This example, \"sweeping line dashboard\"**\n\n- Extremely performant, recommended for extremely performance demanding applications with 100+ channels and 10+ kHz stream rates.\n\n* Relatively complicated application code, having to manage multiple series instances per trend and rectangle overlays to hide old data.\n* Some chart features are not supported, such as: axis ticks, series glow/drop shadow effects, gradient backgrounds.\n\nB) **\"sweeping line chart\" example**\n\nFound [here](https://lightningchart.com/js-charts/interactive-examples/examples/lcjs-example-0041-sweepingLineChartNew.html)\n\n- Less performant, works up to 100 channels and 1 kHz stream rate. If less channels can work with higher stream rates too. Just more CPU intensive than the other approach.\n\n* Very simple to implement and maintain.\n* No limitations to chart features - axis ticks, cursors, effects, backgrounds all work as normally.\n","image":"sweepingLineDashboard","showNew":true},{"id":"lcjs-example-0034-dashedProjection","title":"JavaScript Dashed Line Projection Chart","tags":["xy","line","dashed","band"],"description":"Example showcasing use of DashedLine style to reflect a projected (or predicted) time trend.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Example showcasing use of `DashedLine` style to reflect a projected (or _predicted_) time trend.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, Themes, AxisTickStrategies, emptyLine, DashedLine, StipplePatterns } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Historical and projected revenue')\n\nconst axisX = chart\n .getDefaultAxisX()\n // Configure DateTime X ticks\n .setTickStrategy(AxisTickStrategies.DateTime, (ticks) =>\n // Show month, day and year in cursor result table\n ticks.setCursorFormatter((timestamp) =>\n new Date(timestamp).toLocaleDateString(undefined, { month: 'short', day: '2-digit', year: 'numeric' }),\n ),\n )\n\nconst axisY = chart\n .getDefaultAxisY()\n // Configure Y axis formatting as \"100 k€\"\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setFormattingFunction((euros) => `${(euros / 1000).toFixed(0)} k€`))\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0034/revenue.json')\n .then((r) => r.json())\n .then((revenueData) => {\n const tNow = Date.now()\n const dataPast = revenueData.filter((p) => p.x <= tNow)\n const dataProjection = revenueData.filter((p) => p.x > tNow)\n dataProjection.unshift(dataPast[dataPast.length - 1])\n\n const seriesPast = chart\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveX' } })\n .add(dataPast)\n .setName('Revenue (past)')\n const seriesProjection = chart\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveX' }, automaticColorIndex: 0 })\n .add(dataProjection)\n .setStrokeStyle(\n (stroke) =>\n new DashedLine({\n thickness: stroke.getThickness(),\n fillStyle: stroke.getFillStyle(),\n pattern: StipplePatterns.Dashed,\n patternScale: 4,\n }),\n )\n .setName('Revenue (projected)')\n\n axisX\n .addBand()\n .setValueStart(dataProjection[0].x)\n .setValueEnd(dataProjection[dataProjection.length - 1].x)\n .setStrokeStyle(emptyLine)\n .setMouseInteractions(false)\n .setEffect(false)\n\n axisX\n .addCustomTick()\n .setValue(dataProjection[0].x)\n .setTickLength(20)\n .setTextFormatter((_) => 'Today')\n\n axisX.fit()\n axisY.fit()\n })\n","url":null,"readme":"Example showcasing use of `DashedLine` style to reflect a projected (or _predicted_) time trend.\n\nThis approach could be utilized in applications that involve time series data that is uncertain - for example produced using Artificial Intelligence or predictive algorithms.\n\nFor the user, the dashed line stands out as less opaque than the rest of the line trend, which helps in understanding the meaning of the data visualization.\n\nAdditionally, the example adds an Axis `Band` over the prediction range (on X Axis) to further highlight the split.\n","image":"dashedProjection"},{"id":"lcjs-example-0035-dashedSupplementaryTrends","title":"JavaScript Dashed Spline Chart","tags":["xy","line","dashed"],"description":"Example showcasing use of DashedLine style in a chart with two time series trends along the same Y axis.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Example showcasing use of `DashedLine` style in a chart with two time series trends along the same Y axis.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, Themes, AxisTickStrategies, DashedLine, PointShape, StipplePatterns } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Total revenue and renewal revenue')\n\nconst axisX = chart\n .getDefaultAxisX()\n // Configure DateTime X ticks\n .setTickStrategy(AxisTickStrategies.DateTime, (ticks) =>\n // Show only month like \"September\" in cursor result table\n ticks.setCursorFormatter((timestamp) => new Date(timestamp).toLocaleDateString(undefined, { month: 'long' })),\n )\n\nconst axisY = chart\n .getDefaultAxisY()\n // Configure Y axis formatting as \"100 k€\"\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setFormattingFunction((euros) => `${(euros / 1000).toFixed(0)} k€`))\n\nconst seriesTotalRevenue = chart\n .addSplineSeries({ pointShape: PointShape.Circle })\n .setName('Total revenue')\n .setCursorInterpolationEnabled(false)\n\nconst seriesRenewalRevenue = chart\n .addSplineSeries({ pointShape: PointShape.Circle })\n .setName('Renewal revenue')\n .setCursorInterpolationEnabled(false)\n .setStrokeStyle(\n (stroke) =>\n new DashedLine({\n fillStyle: stroke.getFillStyle(),\n thickness: stroke.getThickness(),\n pattern: StipplePatterns.Dashed,\n patternScale: 2,\n }),\n )\n\nseriesTotalRevenue.add([\n // NOTE: X coordinates are millisecond timestamps\n { x: new Date(2022, 5, 1).getTime(), y: 80140 },\n { x: new Date(2022, 6, 1).getTime(), y: 102200 },\n { x: new Date(2022, 7, 1).getTime(), y: 95920 },\n { x: new Date(2022, 8, 1).getTime(), y: 99010 },\n { x: new Date(2022, 9, 1).getTime(), y: 69560 },\n { x: new Date(2022, 10, 1).getTime(), y: 72800 },\n { x: new Date(2022, 11, 1).getTime(), y: 94200 },\n { x: new Date(2023, 0, 1).getTime(), y: 72560 },\n { x: new Date(2023, 1, 1).getTime(), y: 88560 },\n])\n\nseriesRenewalRevenue.add([\n { x: new Date(2022, 5, 1).getTime(), y: 36220 },\n { x: new Date(2022, 6, 1).getTime(), y: 40190 },\n { x: new Date(2022, 7, 1).getTime(), y: 44520 },\n { x: new Date(2022, 8, 1).getTime(), y: 41200 },\n { x: new Date(2022, 9, 1).getTime(), y: 50220 },\n { x: new Date(2022, 10, 1).getTime(), y: 51650 },\n { x: new Date(2022, 11, 1).getTime(), y: 54980 },\n { x: new Date(2023, 0, 1).getTime(), y: 56240 },\n { x: new Date(2023, 1, 1).getTime(), y: 62820 },\n])\n\n// Configure both Axis intervals manually to add some extra space around line series\naxisX.setInterval({\n start: seriesTotalRevenue.getXMin() - 7 * 24 * 60 * 60 * 1000,\n end: seriesTotalRevenue.getXMax() + 7 * 24 * 60 * 60 * 1000,\n})\n\naxisY.setInterval({\n start: seriesRenewalRevenue.getYMin() - 10000,\n end: seriesTotalRevenue.getYMax() + 10000,\n})\n","url":null,"readme":"Example showcasing use of `DashedLine` style in a chart with two time series trends along the same Y axis.\n\nThis approach could be used in use cases with 1 \"primary\" trend, and 1 or more \"supplementary\" trends, which don't reflect the primary message of the data visualization but rather some \"extra\" information that may be useful along-side.\n\nIn this case, the dashed line style helps convey the message that this trend is not the main point to look at.\n","image":"dashedSupplementaryTrends"},{"id":"lcjs-example-0036-dashedThresholds","title":"JavaScript Threshold Line Chart","tags":["xy","line","dashed","constantline"],"description":"Example showcasing use of ConstantLine and DashedLine style in a threshold indicator.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Example showcasing use of `DashedLine` style in a _threshold_ indicator.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, Themes, AxisTickStrategies, DashedLine, SolidFill, StipplePatterns } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Machine temperatures')\n\n// Example uses Theme properties that are only guaranteed to be included in official LC themes (intended for example purposes only)\nconst theme = chart.getTheme()\nconst exampleThemeProperties = theme.examples\nif (!exampleThemeProperties) {\n throw new Error('Unofficial theme used')\n}\n\n// Configure X Axis as Time\nconst axisX = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Time)\nconst axisY = chart\n .getDefaultAxisY()\n .setTitle('Temperature °C')\n // Configure Y value cursor formatting as celsius with 1 decimal precision.\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setCursorFormatter((celsius) => `${celsius.toFixed(1)} °C`))\n\nPromise.all([\n fetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0036/temperature.json').then(\n (r) => r.json(),\n ),\n fetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0036/temperature2.json').then(\n (r) => r.json(),\n ),\n]).then(([temperatureData, temperatureData2]) => {\n const seriesMachine1 = chart\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveX' } })\n .setName('Machine 1 temperature')\n .add(temperatureData)\n\n const seriesMachine2 = chart\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveX' } })\n .setName('Machine 2 temperature')\n .add(temperatureData2)\n\n const thresholdLine = axisY\n .addConstantLine(true)\n .setValue(120)\n .setStrokeStyle(\n new DashedLine({\n thickness: 4,\n fillStyle: new SolidFill({ color: exampleThemeProperties.badGoodColorPalette[0] }),\n pattern: StipplePatterns.Dashed,\n patternScale: 4,\n }),\n )\n // Prevent users from moving constant line with mouse interactions.\n .setMouseInteractions(false)\n\n // Configure both Axis intervals manually to add some extra space around line series\n axisX.setInterval({\n start: Math.min(seriesMachine1.getXMin(), seriesMachine2.getXMin()) - 1000,\n end: Math.max(seriesMachine1.getXMax(), seriesMachine2.getXMax()) + 1000,\n })\n\n axisY.setInterval({\n start: 0,\n end: Math.max(seriesMachine1.getYMax(), seriesMachine2.getYMax()) + 20,\n })\n})\n","url":null,"readme":"Example showcasing use of `DashedLine` style in a _threshold_ indicator.\nIn this case, the Y axis (temperature celsius) has a threshold value of 120 celsius. Imagine, that it is a value that should not be exceeded to stay in safe limits.\n\nThe application uses a `ConstantLine` on the Y Axis to display this threshold value to the user. The line is drawn across the Axis, which makes it easy to spot when a line trend goes over the threshold.\n\n`DashedLine` style is used on this `ConstantLine` to clearly separate its style from the main data (line trends).","image":"dashedThresholds"},{"id":"lcjs-example-0037-bubbleChart","title":"JavaScript Bubble Chart","tags":["xy","point"],"description":"Example of using LightningChart PointSeries for an interactive Bubble Chart with individual point sizes and data grouping to different colors.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, PointShape, Themes } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Bubble Chart with 3 KPIs and data grouping')\n\n// Generate random data set for example purposes\n// color by group where data point belongs\n// x = kpi\n// y = kpi\n// size = kpi\nconst groupsData = new Array(3).fill(0).map((_) => {\n const dataCount = 1_000\n const data = new Array(dataCount)\n for (let i = 0; i < dataCount; i += 1) {\n const x = Math.random()\n const y = Math.random()\n const kpi3 = Math.random()\n // Map 3rd performance indicator value to a point size as pixels.\n const size = 1 + 19 * kpi3 ** 3\n // kpi3 value is also stored in data point for use in cursor formatting\n data[i] = { x, y, size, kpi3 }\n }\n return data\n})\n\n// Bubble chart can be visualized with a PointSeries.\n// This supports several display methods, including the one used here where each data point has an individual size.\n// In this example, separate groups of data are split into their own series. This way they can be toggled on/off from the legend.\n\nconst groupsSeries = groupsData.map((data, i) => {\n const pointSeries = chart\n .addPointSeries({ pointShape: PointShape.Circle })\n .setName(`Group ${i + 1}`)\n .setPointFillStyle((fillStyle) => fillStyle.setA(100))\n .setIndividualPointSizeEnabled(true)\n .add(data)\n .setCursorResultTableFormatter((builder, _, x, y, dataPoint) =>\n builder\n .addRow(pointSeries.getName())\n .addRow(pointSeries.axisX.getTitle(), '', pointSeries.axisX.formatValue(dataPoint.x))\n .addRow(pointSeries.axisY.getTitle(), '', pointSeries.axisY.formatValue(dataPoint.y))\n .addRow('KPI 3', '', dataPoint.kpi3.toFixed(3)),\n )\n return pointSeries\n})\n\nchart.getDefaultAxisX().setTitle('KPI X').fit(false)\nchart.getDefaultAxisY().setTitle('KPI Y').fit(false)\n\nconst legend = chart.addLegendBox().add(chart)\n","url":null,"readme":"Example of using LightningChart PointSeries for an interactive Bubble Chart with individual point sizes and data grouping to different colors.\n\nThe example context takes place in a setting where the relations between three performance indicators - or data properties - have to be visualized.\nIn this examples case, each property is mapped to X coordinate, Y coordinate and the size of the point respectively.\n\nFurthermore, the data set is separated into three groups. This could mean for example, different products or origins of data, or other kind of classification. These groups are colored with their own unique color, and their data points can be hidden by clicking from the legend.\n","image":"bubbleChart","showNew":true},{"id":"lcjs-example-0038-bubbleChart3D","title":"JavaScript 3D Bubble Chart","tags":["3d","point"],"description":"Example of using LightningChart PointSeries3D for an interactive 3D Bubble Chart with individual point sizes and data grouping to different colors.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, PointShape, Themes } = lcjs\n\nconst chart = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle('Bubble Chart with 4 KPIs and data grouping')\n\n// Generate random data set for example purposes\n// color by group where data point belongs\n// x = kpi\n// y = kpi\n// z = kpi\n// size = kpi\nconst groupsData = new Array(3).fill(0).map((_) => {\n const dataCount = 1_000\n const data = new Array(dataCount)\n for (let i = 0; i < dataCount; i += 1) {\n const x = Math.random()\n const y = Math.random() ** 10\n const z = Math.random()\n const kpi4 = Math.random()\n // Map 4th performance indicator value to a point size as pixels.\n const size = 1 + 19 * kpi4 ** 3\n data[i] = { x, y, z, size }\n }\n return data\n})\n\n// Bubble chart can be visualized with a PointSeries.\n// This supports several display methods, including the one used here where each data point has an individual size.\n// In this example, separate groups of data are split into their own series. This way they can be toggled on/off from the legend.\n\nconst groupsSeries = groupsData.map((data, i) => {\n const pointSeries = chart\n .addPointSeries({\n individualPointSizeEnabled: true,\n })\n .setName(`Group ${i + 1}`)\n .add(data)\n return pointSeries\n})\n\nchart.getDefaultAxisX().setTitle('KPI X').fit(false)\nchart.getDefaultAxisY().setTitle('KPI Y').fit(false)\nchart.getDefaultAxisZ().setTitle('KPI Z').fit(false)\n\nconst legend = chart.addLegendBox().add(chart)\n","url":null,"readme":"Example of using LightningChart PointSeries3D for an interactive 3D Bubble Chart with individual point sizes and data grouping to different colors.\n\nThe example context takes place in a setting where the relations between four performance indicators - or data properties - have to be visualized.\nIn this examples case, each property is mapped to X coordinate, Y coordinate, Z coordinate and the size of the point respectively.\n\nFurthermore, the data set is separated into three groups. This could mean for example, different products or origins of data, or other kind of classification. These groups are colored with their own unique color, and their data points can be hidden by clicking from the legend.\n","image":"bubbleChart3D","showNew":true},{"id":"lcjs-example-0039-audioVisualization","title":"JavaScript Real-Time MP3 Visualization","tags":["xy","axis","time","line"],"description":"Example of using LightningChart to visualize a MP3 audio file in real-time.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, emptyFill, PalettedFill, LUT, AxisTickStrategies, AxisScrollStrategies, emptyLine, regularColorSteps } =\n lcjs\n\nconst exampleContainer = document.getElementById('chart') || document.body\nif (exampleContainer === document.body) {\n exampleContainer.style.width = '100vw'\n exampleContainer.style.height = '100vh'\n exampleContainer.style.margin = '0px'\n}\n\nconst lc = lightningChart()\n\nconst temporaryPanelAtStart = lc.UIPanel({\n container: exampleContainer,\n // theme: Themes.darkGold\n})\nconst ui = temporaryPanelAtStart.addUIElement().setPadding(12).setText('Click anywhere to start playing audio').setMouseInteractions(false)\ntemporaryPanelAtStart.onBackgroundMouseClick((_) => startAudioVisualization())\nconst theme = temporaryPanelAtStart.getTheme()\n\nconst startAudioVisualization = () => {\n temporaryPanelAtStart.dispose()\n const containerChart1 = document.createElement('div')\n const containerChart2 = document.createElement('div')\n exampleContainer.append(containerChart1)\n exampleContainer.append(containerChart2)\n containerChart1.style.width = '100%'\n containerChart1.style.height = '50%'\n containerChart2.style.width = '100%'\n containerChart2.style.height = '50%'\n\n // Loosely based on: https://blog.logrocket.com/audio-visualizer-from-scratch-javascript/\n let audio1 = new Audio()\n audio1.crossOrigin = 'anonymous'\n audio1.src =\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0039/alex-productions-noise.mp3'\n const audioCtx = new (window.AudioContext || window.webkitAudioContext)()\n let audioSource = null\n let analyser = null\n audioSource = audioCtx.createMediaElementSource(audio1)\n analyser = audioCtx.createAnalyser()\n audioSource.connect(analyser)\n analyser.connect(audioCtx.destination)\n analyser.fftSize = 128\n audio1.play()\n const bufferLength = analyser.frequencyBinCount\n\n // (1) Frequency visualization\n const chartFrequency = lc\n .ChartXY({\n container: containerChart1,\n })\n .setTitle('Alex-Productions - Noise')\n .setTitlePosition('series-right-top')\n .setPadding(30)\n .setMouseInteractions(false)\n const palette = new PalettedFill({\n lookUpProperty: 'y',\n lut: new LUT({\n interpolate: true,\n steps: regularColorSteps(0, 200, theme.examples.spectrogramColorPalette),\n }),\n })\n const seriesFrequency = chartFrequency\n .addPointLineAreaSeries({ dataPattern: 'ProgressiveX' })\n .setCurvePreprocessing({ type: 'spline', resolution: 10 })\n .setPointFillStyle(emptyFill)\n .setAreaFillStyle(palette)\n .setCursorEnabled(false)\n const axisY = chartFrequency.getDefaultAxisY().setInterval({ start: 0, end: 256 })\n chartFrequency.forEachAxis((axis) => axis.setTickStrategy(AxisTickStrategies.Empty).setMouseInteractions(false))\n\n // (2) Waveform\n const chartWaveform = lc\n .ChartXY({\n container: containerChart2,\n })\n .setTitle('')\n .setPadding(30)\n const seriesWaveform = chartWaveform\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n allowInputModification: false,\n })\n .setMaxSampleCount(100_000)\n .setPointFillStyle(emptyFill)\n .setAreaFillStyle(emptyFill)\n .setCursorEnabled(false)\n chartWaveform\n .getDefaultAxisX()\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setTickStrategy(AxisTickStrategies.Time)\n .setDefaultInterval((state) => ({\n start: (state.dataMax ?? 0) - 5_000,\n end: state.dataMax,\n stopAxisAfter: false,\n }))\n .fit(false)\n chartWaveform.getDefaultAxisY().setAnimationScroll(false).setChartInteractionZoomByWheel(false)\n chartWaveform.getDefaultAxisY().setTickStrategy(AxisTickStrategies.Empty)\n chartWaveform.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Time)\n\n //\n const dataArrayFrequency = new Uint8Array(bufferLength)\n const dataArrayTimeDomain = new Float32Array(analyser.fftSize)\n let tPrev = undefined\n const tFirst = performance.now()\n let framesCount = 0\n const title = chartFrequency.getTitle()\n const frame = () => {\n const tNow = performance.now()\n if (tPrev) {\n analyser.getByteFrequencyData(dataArrayFrequency)\n analyser.getFloatTimeDomainData(dataArrayTimeDomain)\n seriesFrequency.clear().appendSamples({\n yValues: dataArrayFrequency,\n })\n const waveformTimestamps = new Array(dataArrayTimeDomain.length)\n .fill(0)\n .map((_, i, arr) => tPrev + ((tNow - tPrev) * (i + 1)) / arr.length)\n seriesWaveform.appendSamples({\n xValues: waveformTimestamps,\n yValues: dataArrayTimeDomain,\n })\n chartWaveform.getDefaultAxisX().setStopped(false)\n\n const fps = 1000 / ((tNow - tFirst) / framesCount)\n chartFrequency.setTitle(`${title} - ${fps.toFixed(0)} FPS`)\n }\n requestAnimationFrame(frame)\n tPrev = tNow\n framesCount += 1\n }\n frame()\n}\n","url":null,"readme":"Example of using LightningChart JS to visualize a MP3 audio file in real-time.\n\n---\n\nNoise by Alex-Productions | https://onsound.eu/\n\nMusic promoted by https://www.free-stock-music.com\n\nCreative Commons / Attribution 3.0 Unported License (CC BY 3.0)\n\nhttps://creativecommons.org/licenses/by/3.0/deed.en_US\n","image":"audioVisualization","showNew":true},{"id":"lcjs-example-0040-customLassoInteraction","title":"JavaScript Lasso Selection Chart","tags":["xy","point","polygon","interactions"],"description":"Example showcasing a custom ChartXY interaction for highlighting selected data points","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Multiple chart examples, dynamic point coloring, Scatter Charts, Point Cluster Charts, 3D charts for JS.","src":"// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, emptyFill, emptyLine, AutoCursorModes, Themes } = lcjs\n\nconst exampleContainer = document.getElementById('chart') || document.body\nif (exampleContainer === document.body) {\n exampleContainer.style.width = '100vw'\n exampleContainer.style.height = '100vh'\n exampleContainer.style.margin = '0px'\n}\nexampleContainer.style.display = 'flex'\nexampleContainer.style.flexDirection = 'row'\nconst containerChart1 = document.createElement('div')\nconst containerChart2 = document.createElement('div')\nexampleContainer.append(containerChart1)\nexampleContainer.append(containerChart2)\ncontainerChart1.style.flexGrow = '1'\ncontainerChart1.style.height = '100%'\ncontainerChart2.style.width = '50%'\ncontainerChart2.style.height = '100%'\ncontainerChart2.style.display = 'none'\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n container: containerChart1,\n // theme: Themes.darkGold\n })\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setTitle('Click to select points, close selection by clicking on polygon corner')\nconst dataGrid = lc\n .DataGrid({\n container: containerChart2,\n // theme: Themes.darkGold\n })\n .setTitle('Selected samples')\n\nconst data = new Array(5000).fill(0).map((_, i) => ({ id: i, x: Math.random() ** 2, y: Math.random() ** 1.5 }))\n\nconst scatterSeries = chart\n .addPointLineAreaSeries({ dataPattern: null, sizes: true })\n .setAreaFillStyle(emptyFill)\n .setStrokeStyle(emptyLine)\n .appendJSON(data)\n .fill({ size: 3 })\n .setMouseInteractions(false)\n\n// Disable conflicting built-in interactions\nchart.setMouseInteractionRectangleFit(false).setMouseInteractionRectangleZoom(false)\nchart.onSeriesBackgroundMouseDoubleClick(() => chart.forEachAxis((axis) => axis.fit(false)))\n\n// Add custom lasso polygon interaction using events API and Polygon series\nconst polygonSeries = chart.addPolygonSeries({ automaticColorIndex: 2 }).setMouseInteractions(false).setCursorEnabled(false)\nconst polygonFigure = polygonSeries.add([]).setFillStyle((fill) => fill.setA(50))\nconst polygonMarkers = chart.addPointLineAreaSeries({ dataPattern: null }).setCursorEnabled(false)\nlet lassoState\nchart.onSeriesBackgroundMouseMove((_, event) => {\n if (!lassoState || lassoState.closed) return\n const coordAxis = chart.translateCoordinate(event, chart.coordsAxis)\n const polygonPreview = [...lassoState.polygon, coordAxis]\n polygonFigure.setDimensions(polygonPreview)\n})\nchart.onSeriesBackgroundMouseLeave(() => {\n if (!lassoState || lassoState.closed) return\n polygonFigure.setDimensions(lassoState.polygon)\n})\nchart.onSeriesBackgroundMouseClick((_, event) => {\n // Add coordinate to polygon\n const coordAxis = chart.translateCoordinate(event, chart.coordsAxis)\n if (!lassoState || lassoState.closed) {\n lassoState = { polygon: [coordAxis] }\n scatterSeries.fill({ size: 3 })\n } else {\n lassoState.polygon.push(coordAxis)\n }\n polygonFigure.setDimensions(lassoState.polygon)\n polygonMarkers.appendSample(coordAxis)\n dataGrid.removeCells()\n})\npolygonMarkers.onMouseClick(() => {\n // Close polygon\n lassoState.closed = true\n polygonFigure.setDimensions(lassoState.polygon)\n polygonMarkers.clear()\n\n // Routine for checking if data point is inside a polygon.\n const coords = lassoState.polygon\n const xMin = coords.reduce((prev, cur) => Math.min(prev, cur.x), Number.MAX_SAFE_INTEGER)\n const xMax = coords.reduce((prev, cur) => Math.max(prev, cur.x), -Number.MAX_SAFE_INTEGER)\n const yMin = coords.reduce((prev, cur) => Math.min(prev, cur.y), Number.MAX_SAFE_INTEGER)\n const yMax = coords.reduce((prev, cur) => Math.max(prev, cur.y), -Number.MAX_SAFE_INTEGER)\n const dataPointSizes = new Array(data.length)\n const dataGridContent = [['ID', 'X', 'Y']]\n for (let i = 0; i < data.length; i += 1) {\n const sample = data[i]\n let insidePolygon = false\n if (sample.x >= xMin && sample.x <= xMax && sample.y >= yMin && sample.y <= yMax) {\n if (getIsPointInsidePolygon(sample, coords)) {\n insidePolygon = true\n }\n }\n dataPointSizes[i] = insidePolygon ? 7 : 3\n if (insidePolygon) {\n dataGridContent.push([sample.id, sample.x.toFixed(3), sample.y.toFixed(3)])\n }\n }\n scatterSeries.alterSamples(0, { sizes: dataPointSizes })\n dataGrid.setTableContent(dataGridContent)\n containerChart2.style.display = 'block'\n})\n\n// https://stackoverflow.com/a/72434617/9288063\nconst getIsPointInsidePolygon = (point, vertices) => {\n const x = point.x\n const y = point.y\n let inside = false\n for (let i = 0, j = vertices.length - 1; i < vertices.length; j = i++) {\n const xi = vertices[i].x,\n yi = vertices[i].y\n const xj = vertices[j].x,\n yj = vertices[j].y\n const intersect = yi > y != yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi\n if (intersect) inside = !inside\n }\n return inside\n}\n","url":null,"readme":"This example showcases the creation of a custom user interaction.\n\nBy default, dragging left mouse inside the series area, a zoom/fit interaction is activated.\nThis default interaction can be disabled:\n\n```js\nchart\n // Disable default chart interactions with left mouse button.\n .setMouseInteractionRectangleFit(false)\n .setMouseInteractionRectangleZoom(false)\n```\n\nAnd any custom interaction can be implemented with different event subscription methods.\nIn this example, `ChartXY.onSeriesBackgroundMouseClick` is used to hook on to the event when user clicks mouse button inside the series area.\n`PolygonSeries` are used to draw a _lasso selection_ as the user clicks with mouse on the chart.\nFinally, after user clicks on any existing polygon point to close it, the data points that are inside the lasso are solved and highlighted using edit data API.\n\nThis idea of custom interactions can be extended to any application specific dynamic interaction, like deleting selected points, displaying them in a separate chart or moving them - imagination is the limit!\n\nSee also:\n\n- https://lightningchart.com/js-charts/interactive-examples/examples/lcjs-example-0043-customTimeSelectionInteraction.html\n","image":"customLassoInteraction","showNew":true},{"id":"lcjs-example-0041-sweepingLineChartNew","title":"JavaScript Sweeping Area Chart","tags":["area","xy","realtime"],"description":"Showcases simple real-time sweeping charts with LightningChart JS","metaDescription":"An interactive example with the code editor shows a sweeping ECG line chart created with the LightningChart JS library. Test the performance of the library using our online code editor.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, AxisTickStrategies } = lcjs\n\nconst CONFIG = {\n timeView: 5_000, // milliseconds\n sampleRate: 1_000, // Hz, samples per second\n}\nconst sampleCount = Math.ceil((CONFIG.sampleRate * CONFIG.timeView) / 1000)\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Sweeping Real-Time Chart')\n .setAutoCursor((cursor) => cursor.setTickMarkerXVisible(false))\n\nchart.getDefaultAxisX().setDefaultInterval({ start: 0, end: CONFIG.timeView }).setTickStrategy(AxisTickStrategies.Empty)\nconst series = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n })\n .setMaxSampleCount(sampleCount)\n\n// Keep track which index last existing sample is positioned at\nlet lastSampleIndex = -1\nconst handleIncomingData = (yValues) => {\n const count = yValues.length\n // Calculate which samples can be appended to right side, and which have to be started again from left side of sweeping history.\n const space = sampleCount - (lastSampleIndex + 1)\n // Put first set of samples to extend previous samples.\n const countRight = Math.min(space, count)\n series.alterSamples(lastSampleIndex + 1, { yValues, count: countRight })\n lastSampleIndex += countRight\n if (countRight < space) {\n // Remove the few oldest points that would be connected to last points pushed just now, to leave a gap between newest and oldest data.\n const gapCount = Math.min(Math.round(sampleCount * 0.05), sampleCount - (lastSampleIndex + 1))\n // Gap is displayed by using NaN as Y values.\n series.alterSamples(lastSampleIndex + 1, { yValues: new Array(gapCount).fill(Number.NaN) })\n }\n // Put other samples (if any) to beginning of sweeping history.\n const countLeft = count - countRight\n if (countLeft > 0) {\n series.alterSamples(0, { yValues, offset: countRight })\n lastSampleIndex = countLeft - 1\n }\n\n // NOTE: Case not handled if remaining data would somehow immediately complete another full sweep.\n}\n\n// Push random data to chart every ~16 milliseconds (60 FPS)\nlet tLast = performance.now()\nlet dModulus = 0\nlet yPrev = 100\nconst streamRandomExampleData = () => {\n const tNow = performance.now()\n const tDelta = Math.min(tNow - tLast, 2000) // if tab is inactive for more than 2 seconds, prevent adding crazy amounts of data in attempt to catch up.\n let pointsToAdd = (tDelta * CONFIG.sampleRate) / 1000 + dModulus\n dModulus = pointsToAdd % 1\n pointsToAdd = Math.floor(pointsToAdd)\n tLast = tNow\n //\n const yValues = new Array(pointsToAdd)\n for (let i = 0; i < pointsToAdd; i += 1) {\n const y = yPrev + (Math.random() * 2 - 1)\n yPrev = y\n yValues[i] = y\n }\n handleIncomingData(yValues)\n //\n requestAnimationFrame(streamRandomExampleData)\n}\nstreamRandomExampleData()\n","url":null,"readme":"Simple example of how to create sweeping real-time charts with LightningChart JS data edit API.\n\nIn this example, a real-time trend is displayed as an Area Chart.\nNew data points are appended to the right, until reaching the edge of the chart.\nAt this point, the new data starts appending again from left, clearing away the previously displayed data.\n\nContrary to traditional \"scrolling\" approach to displaying streaming data, this \"sweeping\" approach is often preferred by medical industries.\n\n---\n\nThis approach to sweeping charts is very simple to implement, and works well up to 100 channels and 1 kHz stream rates.\n\nHowever, if more performance is required, then there is an alternate and slightly more complicated approach which is showcased in [this example](https://lightningchart.com/js-charts/interactive-examples/examples/lcjs-example-0033-sweepingLineDashboard.html).\n","image":"sweepingLineChartNew","showNew":true},{"id":"lcjs-example-0042-multiAxisLayout","title":"JavaScript Multi Axis Layout","tags":["line","xy","realtime"],"description":"Showcase of axis layout capabilities of LightningChart JS","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, AxisTickStrategies, emptyTick, AxisScrollStrategies, emptyLine } = lcjs\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n defaultAxisY: { type: 'linear-highPrecision' },\n // theme: Themes.darkGold,\n })\n .setTitle('Multi-dimensional Axis Chart')\nconst timeAxis = chart\n .getDefaultAxisY()\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setMouseInteractions(false)\n .setTickStrategy(AxisTickStrategies.DateTime, (ticks) =>\n ticks\n .setDateOrigin(new Date())\n .setGreatTickStyle(emptyTick)\n .setFormatting(undefined, { second: '2-digit', minute: '2-digit', hour: '2-digit' }, undefined)\n .setCursorFormatter((time) =>\n new Date(time).toLocaleTimeString(undefined, { second: '2-digit', minute: '2-digit', hour: '2-digit' }),\n ),\n )\n .setDefaultInterval((state) => ({\n start: state.dataMax ?? 0,\n end: (state.dataMax ?? 0) - 1 * 30 * 1000,\n stopAxisAfter: false,\n }))\n .setTitle('Time')\n\nchart.getDefaultAxisX().dispose()\nconst axisCh1 = chart.addAxisX({ opposite: true, iParallel: 0, iStack: 0 }).setTitle('Ch 1').setMargins(0, 10)\nconst axisCh2 = chart.addAxisX({ opposite: true, iParallel: 1, iStack: 0 }).setTitle('Ch 2').setMargins(0, 10)\nconst emptyAxis1 = chart.addAxisX({ opposite: true, iParallel: 2, iStack: 0 })\nconst emptyAxis2 = chart.addAxisX({ opposite: true, iParallel: 3, iStack: 0 })\nconst axisCh3 = chart.addAxisX({ opposite: true, iParallel: 0, iStack: 1 }).setTitle('Ch 3').setMargins(10, 0)\nconst axisCh4 = chart.addAxisX({ opposite: true, iParallel: 1, iStack: 1 }).setTitle('Ch 4').setMargins(10, 0)\nconst axisCh5 = chart.addAxisX({ opposite: true, iParallel: 2, iStack: 1 }).setTitle('Ch 5').setMargins(10, 0)\nconst axisCh6 = chart.addAxisX({ opposite: true, iParallel: 3, iStack: 1 }).setTitle('Ch 6').setMargins(10, 0)\n\nchart.forEachAxisX((axisX) =>\n axisX.setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setGridStrokeStyle(emptyLine))\n .setMinorTickStyle((minor) => minor.setGridStrokeStyle(emptyLine)),\n ),\n)\n// NOTE: Empty styled axes are accounted in axis layout (unlike completely hidden axes), which is utilized in this example.\nemptyAxis1.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine).setMouseInteractions(false)\nemptyAxis2.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine).setMouseInteractions(false)\n\nconst LineSeries = (xAxis) => {\n xAxis.setInterval({ start: 0, end: 300 })\n return chart\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveY' }, xAxis })\n .setStrokeStyle((stroke) => stroke.setThickness(1))\n .setCursorSolveBasis('nearest-y')\n .setDataCleaning({ minDataPointCount: 1 })\n}\nconst series1 = LineSeries(axisCh1)\nconst series2 = LineSeries(axisCh2)\nconst series3 = LineSeries(axisCh3)\nconst series4 = LineSeries(axisCh4)\nconst series5 = LineSeries(axisCh5)\nconst series6 = LineSeries(axisCh6)\n\nconst RandomTraceData = () => {\n let prev = 10 + Math.random() * 190\n return () => {\n const cur = prev + 1 * (Math.random() * 2 - 1)\n prev = cur\n return cur\n }\n}\nconst rand1 = RandomTraceData()\nconst rand2 = RandomTraceData()\nconst rand3 = RandomTraceData()\nconst rand4 = RandomTraceData()\nconst rand5 = RandomTraceData()\nconst rand6 = RandomTraceData()\n\nsetInterval(() => {\n const timeStep = 1000 / 60\n series1.addArrayX([rand1()], timeStep)\n series2.addArrayX([rand2()], timeStep)\n series3.addArrayX([rand3()], timeStep)\n series4.addArrayX([rand4()], timeStep)\n series5.addArrayX([rand5()], timeStep)\n series6.addArrayX([rand6()], timeStep)\n}, 1000 / 60)\n","url":null,"readme":"Showcase of axis layout capabilities of LightningChart JS.\n\nLightningChart `ChartXY` allows placing any number of individual axes on any side of the chart - left, top, right, bottom. As well as placing axes on top of each other (stacks).\n","image":"multiAxisLayout","showNew":true},{"id":"lcjs-example-0043-customTimeSelectionInteraction","title":"JavaScript Custom Time Selection Chart","tags":["xy","line","interactions"],"description":"Example showcasing a custom ChartXY interaction for selecting range of data points","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, AxisTickStrategies, emptyFill, AutoCursorModes, IndividualPointFill, Themes } = lcjs\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n defaultAxisX: { type: 'linear-highPrecision' },\n // theme: Themes.darkGold\n })\n .setTitle('Custom data selection interaction (drag with left mouse above chart)')\nconst axisX = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime).setAnimationScroll(false)\n\n// Disable built-in interactions\nchart\n .setMouseInteractionPan(false)\n .setMouseInteractionRectangleFit(false)\n .setMouseInteractionRectangleZoom(false)\n .setMouseInteractionWheelZoom(false)\nchart.forEachAxis((axis) => axis.setMouseInteractions(false))\n\n// Generate random data for example\nconst data = []\nlet yPrev = 100\nfor (let i = 0; i < 1000; i += 1) {\n const x = Date.UTC(2023, 0, i)\n const y = yPrev + (Math.random() * 2 - 1)\n const id = i\n yPrev = y\n data.push({ x, y, id })\n}\n\nconst lineSeries = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n colors: true,\n ids: true,\n })\n .appendJSON(data, { x: 'x', y: 'y', id: 'id' })\n .setMouseInteractions(false)\nconst colorNormal = lineSeries.getStrokeStyle().getFillStyle().getColor()\nconst colorUnselected = chart.getTheme().examples.unfocusedDataColor\nconst colorSelected = chart.getTheme().examples.positiveFillStyle.getColor()\nlineSeries\n .setAreaFillStyle(emptyFill)\n .setStrokeStyle((stroke) => stroke.setFillStyle(new IndividualPointFill()))\n .fill({ color: colorNormal })\n\n// Setup custom user interaction\nconst band = axisX.addBand(false).setVisible(false)\nchart.onSeriesBackgroundMouseDragStart((_, event) => {\n const locAxis = chart.translateCoordinate(event, chart.coordsAxis)\n band.setVisible(true)\n band.setValueStart(locAxis.x).setValueEnd(locAxis.x)\n chart.setAutoCursorMode(AutoCursorModes.disabled)\n})\nchart.onSeriesBackgroundMouseDrag((_, event) => {\n const locAxis = chart.translateCoordinate(event, chart.coordsAxis)\n band.setValueEnd(locAxis.x)\n})\nchart.onSeriesBackgroundMouseDragStop((_, event) => {\n band.setVisible(false)\n chart.setAutoCursorMode(AutoCursorModes.snapToClosest)\n // Highlight all data points inside band\n const xMin = Math.min(band.getValueStart(), band.getValueEnd())\n const xMax = Math.max(band.getValueStart(), band.getValueEnd())\n // NOTE: In this example, could just as well use `data` variable directly. But showing use of `readback` for example purposes.\n const dataSet = lineSeries.readBack()\n const idsInsideBand = []\n for (let i = 0; i < dataSet.xValues.length; i += 1) {\n const x = dataSet.xValues[i]\n if (x >= xMin && x <= xMax) idsInsideBand.push(dataSet.ids[i])\n }\n lineSeries.fill({ color: colorUnselected }).alterSamplesByID(idsInsideBand, { color: colorSelected })\n})\n","url":null,"readme":"This example showcases the creation of a custom user interaction.\n\nBy default, dragging left mouse inside the series area, a zoom/fit interaction is activated.\nThis default interaction can be disabled:\n\n```js\nchart\n // Disable default chart interactions with left mouse button.\n .setMouseInteractionRectangleFit(false)\n .setMouseInteractionRectangleZoom(false)\n```\n\nAnd any custom interaction can be implemented with different event subscription methods.\nIn this example, `ChartXY.onSeriesBackgroundMouseDrag` is used to hook on to the event when user drags with mouse inside the series area.\nAn Axis band is used to highlight the selected time range, and after user stops dragging the Line series is colored so that selected points are focused whereas other points are \"unfocused\".\n\nThis idea of custom interactions can be extended to any application specific dynamic interaction, like deleting selected points, displaying them in a separate chart or moving them - imagination is the limit!\n\nSee also:\n\n- https://lightningchart.com/js-charts/interactive-examples/examples/lcjs-example-0040-customLassoInteraction.html\n","image":"customTimeSelectionInteraction"},{"id":"lcjs-example-0050-linePaletteX","title":"JavaScript ECG Chart with Highlighted Beats","tags":["xy","line","palette"],"description":"Example showcasing Line Series feature for coloring line dynamically based on X coordinates","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Example showcasing Line Series feature for coloring line dynamically based on X coordinates\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, PalettedFill, LUT, ColorRGBA, AxisTickStrategies, Themes } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('ECG chart with color highlighted heart beats')\n\nconst axisX = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Time)\n\nconst axisY = chart.getDefaultAxisY().setTitle('mV')\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0050/data.json')\n .then((r) => r.json())\n .then((ecgValuesY) => {\n const lineSeries = chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .addArrayY(ecgValuesY)\n\n // Detect beats from ECG data set, listing the ranges as X coordinates (data point indexes).\n const beats = []\n let yPrev\n let iPeakHigh\n let iPeakLow\n for (let i = 0; i < ecgValuesY.length; i += 1) {\n const y = ecgValuesY[i]\n if (iPeakHigh === undefined) {\n // Check for high peak.\n if (y > 700 && y < yPrev) {\n // High peak.\n iPeakHigh = i\n }\n } else if (iPeakLow === undefined) {\n // Check for low peak.\n if (y < -700 && y > yPrev) {\n iPeakLow = i\n // Mark beat range as data point indexes.\n beats.push({ iStart: iPeakHigh - 40, iEnd: iPeakLow + 120 })\n iPeakHigh = undefined\n iPeakLow = undefined\n }\n }\n yPrev = y\n }\n\n // Style line series so that beat X ranges are highlighted with a special color.\n const colorDefault = lineSeries.getStrokeStyle().getFillStyle().getColor()\n const colorNormal = colorDefault\n const colorHighlight = new ColorRGBA(0, 255, 0)\n const xPalette = new PalettedFill({\n lookUpProperty: 'x',\n lut: new LUT({\n interpolate: false,\n steps: [\n { value: 0, color: colorNormal },\n ...beats\n .map((beat) => [\n { value: beat.iStart, color: colorHighlight },\n { value: beat.iEnd, color: colorNormal },\n ])\n .flat(),\n ],\n }),\n })\n\n lineSeries.setStrokeStyle((stroke) => stroke.setFillStyle(xPalette))\n axisX.setStrokeStyle((stroke) => stroke.setFillStyle(xPalette))\n })\n","url":null,"readme":"Example that showcases `LineSeries` feature for coloring line dynamically based on X coordinates.\n\nIn this example, there is a ECG data set (voltage measurements from a heart over short period of time).\nThis data is visualized as a _Line Chart_ where X dimension represents _time_ and Y dimension measured _voltage_.\n\nThis is a very traditional and well known setting, but this example adds a little twist to it in order to showcase the dynamic X coloring feature.\n\nThe example code automatically detects heart beats from the data set and tracks the X coordinate intervals that contain active heart beats.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/picture1.jpg)\n\nThis heart beat information is then used to prepare a _Value - Color lookup table_, a conceptually simple object that can be widely used with many different LightningChart JS components.\n\nThe lookup table associates a range of _Values_ with corresponding _Colors_. In this example, this means defining the X value ranges which should be colored \"normally\" and ranges which should be colored in \"highlighted\" manner.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/picture2.jpg)\n\nDynamic line coloring is a powerful feature which can serve many different needs. The best thing about it is that it doesn't compromise performance, meaning that you can use it just as well with 100 data points or 100 million data points.\n\nIn addition to dynamic coloring by X coordinate there are also more dynamic coloring modes available:\n\n- [Line dynamic coloring by Y coordinates](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0051-linePaletteY.html)\n- [Line dynamic coloring by separate Value data set](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0052-linePaletteValue.html)\n","image":"linePaletteX"},{"id":"lcjs-example-0051-linePaletteY","title":"JavaScript Good/Bad Values Threshold Line Chart","tags":["xy","line","palette"],"description":"Example showcasing Line Series feature for coloring line dynamically based on Y coordinates","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Example showcasing Line Series feature for coloring line dynamically based on Y coordinates\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, PalettedFill, LUT, ColorRGBA, SolidFill, Themes } = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Line Chart with dynamic good/bad values highlighting')\n\nconst thresholdBadY = -30000\nconst thresholdGoodY = 10000\nconst colorBad = ColorRGBA(255, 0, 0)\nconst colorGood = ColorRGBA(0, 255, 0)\n\nconst axisX = chart.getDefaultAxisX()\nconst axisY = chart.getDefaultAxisY()\n\naxisY\n .addConstantLine()\n .setMouseInteractions(false)\n .setValue(thresholdBadY)\n .setStrokeStyle((stroke) => stroke.setFillStyle(new SolidFill({ color: colorBad.setA(50) })))\n\naxisY\n .addConstantLine()\n .setMouseInteractions(false)\n .setValue(thresholdGoodY)\n .setStrokeStyle((stroke) => stroke.setFillStyle(new SolidFill({ color: colorGood.setA(50) })))\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0051/data.json')\n .then((r) => r.json())\n .then((valuesY) => {\n const lineSeries = chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .addArrayY(valuesY)\n\n const colorNormal = lineSeries.getStrokeStyle().getFillStyle().getColor()\n const yMin = lineSeries.getYMin()\n const yPalette = new PalettedFill({\n lookUpProperty: 'y',\n lut: new LUT({\n interpolate: false,\n steps: [\n { value: yMin, color: colorBad },\n { value: thresholdBadY, color: colorNormal },\n { value: thresholdGoodY, color: colorGood },\n ],\n }),\n })\n\n lineSeries.setStrokeStyle((stroke) => stroke.setFillStyle(yPalette))\n axisY.setStrokeStyle((stroke) => stroke.setFillStyle(yPalette))\n })\n","url":null,"readme":"Example that showcases `LineSeries` feature for coloring line dynamically based on Y coordinates.\n\nThis example is based on a completely normal _Line Chart_, where the Y value depicts some trend, such as a stock price, sensor measurement, etc.\n\nProbably the most common need for dynamic Y based coloring comes from scenarios where the values have a range of Bad, Normal and Good values. A practical example could be a greenhouse where the room temperature is measured. For best results, the temperature should stay within acceptable range - neither too cold or too hot.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/picture1.jpg)\n\nThe dynamic Y coloring feature allows the visualization of this kind of value thresholds very intuitively, by automatically changing color of each data point based on the Y coordinate.\n\nThe logic of selecting color based on Y coordinate is done with a _Value - Color lookup table_, a conceptually simple object that can be widely used with many different LightningChart JS components.\n\nThe lookup table associates a range of _Values_ with corresponding _Colors_.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/picture2.png)\n\nDynamic line coloring is a powerful feature which can serve many different needs. The best thing about it is that it doesn't compromise performance, meaning that you can use it just as well with 100 data points or 100 million data points.\n\nIn addition to dynamic coloring by Y coordinate there are also more dynamic coloring modes available:\n\n- [Line dynamic coloring by X coordinates](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0050-linePaletteX.html)\n- [Line dynamic coloring by separate Value data set](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0052-linePaletteValue.html)\n","image":"linePaletteY"},{"id":"lcjs-example-0052-linePaletteValue","title":"JavaScript Racecar Track Data Analysis Chart","tags":["xy","line","palette"],"description":"Example showcasing Line Series feature for coloring line dynamically based on separate Value data set","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/**\n * Example showcasing Line Series feature for coloring line dynamically based on separate Value data set\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst {\n lightningChart,\n UIElementBuilders,\n UIOrigins,\n PalettedFill,\n LUT,\n ColorRGBA,\n regularColorSteps,\n emptyLine,\n AxisTickStrategies,\n Themes,\n} = lcjs\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Loading example data ...')\n .setAutoCursor((cursor) => cursor.setTickMarkerXVisible(false).setTickMarkerYVisible(false))\n\nconst theme = chart.getTheme()\nconst axisX = chart.getDefaultAxisX()\nconst axisY = chart.getDefaultAxisY()\nchart.getDefaultAxes().forEach((axis) => axis.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine))\n\nconst lineSeries = chart\n .addLineSeries({ individualLookupValuesEnabled: true })\n .setCursorSolveBasis('nearest')\n .setCursorInterpolationEnabled(false)\n .setStrokeStyle((stroke) => stroke.setThickness(10))\n\nconst labelStart = chart.addUIElement(UIElementBuilders.TextBox, { x: axisX, y: axisY }).setVisible(false)\n\nconst dataSources = [\n {\n name: 'Speed',\n file: 'demo-data-speed.json',\n lut: new LUT({\n steps: regularColorSteps(0, 50, theme.examples.intensityColorPalette),\n interpolate: true,\n units: 'km/h',\n }),\n format: (value) => `${value.toFixed(1)} km/h`,\n },\n {\n name: 'Steering',\n file: 'demo-data-steering.json',\n lut: new LUT({\n steps: [\n { value: -100, color: ColorRGBA(255, 255, 0) },\n { value: 0, color: ColorRGBA(255, 255, 255) },\n { value: 100, color: ColorRGBA(0, 0, 255) },\n ],\n interpolate: true,\n units: '%',\n }),\n format: (value) => `${value.toFixed(1)} %`,\n },\n {\n name: 'Throttle',\n file: 'demo-data-throttle.json',\n lut: new LUT({\n steps: regularColorSteps(0, 100, theme.examples.intensityColorPalette),\n interpolate: true,\n units: '%',\n }),\n format: (value) => `${value.toFixed(1)} %`,\n },\n]\n\nlet legend\nconst displayDataSource = async (sourceName) => {\n // CLeanup previously displayed data source\n if (legend) {\n legend.dispose()\n legend = undefined\n }\n\n const dataSource = dataSources.find((item) => item.name === sourceName)\n let data = dataSource.data\n if (!data) {\n console.time(`Load data set ${sourceName}`)\n data = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + `examples/assets/0052/${dataSource.file}`,\n ).then((r) => r.json())\n dataSource.data = data\n console.timeEnd(`Load data set ${sourceName}`)\n }\n\n lineSeries\n .clear()\n .setName(sourceName)\n .add(data)\n .setStrokeStyle((stroke) => stroke.setFillStyle(new PalettedFill({ lut: dataSource.lut })))\n .setCursorResultTableFormatter((builder, _, __, ___, dataPoint) =>\n builder.addRow(sourceName).addRow(dataPoint.value ? dataSource.format(dataPoint.value) : ''),\n )\n\n const start = data[0]\n labelStart.setVisible(true).setPosition(start).setOrigin(UIOrigins.CenterBottom).setMargin(10).setText('START')\n\n chart.setTitle(`Racecar ${sourceName} progression during 1 lap`)\n\n legend = chart.addLegendBox().add(chart)\n}\ndisplayDataSource('Speed')\n\n// Embed HTML UI inside the chart for selecting between different data sources.\nconst uiDiv = document.createElement('div')\nchart.engine.container.append(uiDiv)\nuiDiv.style.position = 'absolute'\nuiDiv.style.top = `${chart.getTitleMargin().top}px`\nuiDiv.style.right = `${chart.getPadding().right}px`\nconst inputDataSource = document.createElement('select')\nuiDiv.append(inputDataSource)\ndataSources.forEach((dataSource) => {\n const option = document.createElement('option')\n inputDataSource.append(option)\n option.innerHTML = dataSource.name\n})\ninputDataSource.onchange = (e) => {\n displayDataSource(e.target.value)\n}\n","url":null,"readme":"Example that showcases `LineSeries` feature for coloring line dynamically based on separate Value data set.\n\nThis example takes place in the field of motor-sports, more specifically the analysis of data gathered from a remote controlled racecar while driving on a race track.\n\n**Both the data as well as use case in this example originates from a real user of LightningChart JS** - TestLogger produces a complete data management and analytics system for RC cars and is one of our satisfied long-time partners. You can read more how they are able to take advantage of LightningChart JS in their craft at our [case study](https://lightningchart.com/news/data-analytics-for-racing-testlogger-case-study-lightningchart/).\n\nThe TestLogger software gathers an immense amount of high precision data from the RC car in real-time - for example in this application, speed, steering and throttle information are visualized. Each measurement is paired with a location information, which tells where the RC car was located at the time of measurement.\n\nSomething that we found amazing was that the RC car location information is actually calculated in real-time by tracking the orientation and speed of the RC car itself - it is not relying on GPS or any other positioning system!\n\nIn this example, the RC car data is used to dynamically color the path of the RC car based on the selected data set. For example, when \"Speed\" is analyzed, low speeds are colored as white and high speeds are colored as red.\n\nBy looking at the produced visualization, bottlenecks in the race can be spotted easily even with the naked eye.\n\nDynamic line coloring is a powerful feature which can serve many different needs. The best thing about it is that it doesn't compromise performance, meaning that you can use it just as well with 100 data points or 100 million data points.\n\nIn addition to dynamic coloring by separate Value data set there are also more dynamic coloring modes available:\n\n- [Line dynamic coloring by X coordinates](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0050-linePaletteX.html)\n- [Line dynamic coloring by Y coordinates](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0051-linePaletteY.html)\n","image":"linePaletteValue"},{"id":"lcjs-example-0053-dataGaps","title":"JavaScript Data Gaps Trading Chart","tags":["xy","area","line","zoomband"],"description":"Example showcasing how data gaps can be handled XY series. Particularly highlights line and area series in a trading use case","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * Example showcasing how data gaps can be handled XY series. Particularly highlights line and area series in a trading use case\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, emptyLine, LegendBoxBuilders, Themes } = lcjs\n\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart()\n .Dashboard({\n numberOfColumns: 1,\n numberOfRows: 2,\n // theme: Themes.darkGold\n })\n .setRowHeight(0, 1)\n .setRowHeight(1, 0.2)\n\nconst chart = dashboard.createChartXY({ columnIndex: 0, rowIndex: 0 }).setTitle('Chart with data gaps')\n\nconst axisClose = chart.getDefaultAxisY().setTitle('Stock price (€)')\n\nconst seriesClose = chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .setName('Stock price (€)')\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((builder, series, x, y, dataPoint) =>\n builder\n .addRow(series.getName())\n .addRow(series.axisX.formatValue(dataPoint.x))\n .addRow(`${series.axisY.formatValue(dataPoint.y)} €`),\n )\n\nconst axisVolume = chart\n .addAxisY({ opposite: true })\n .setTitle('Volume (€)')\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setGridStrokeStyle(emptyLine))\n .setMinorTickStyle((minor) => minor.setGridStrokeStyle(emptyLine)),\n )\n\nconst seriesVolume = chart\n .addAreaSeries({ yAxis: axisVolume })\n .setName('Volume (€)')\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((builder, series, position, high, low) =>\n builder\n .addRow(series.getName())\n .addRow(series.axisX.formatValue(position))\n .addRow(`${series.axisY.formatValue(high)} €`),\n )\n\nconst dateOrigin = new Date('2021-01-01')\nconst dateOriginTime = dateOrigin.getTime()\n\nconst axisX = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime, (ticks) => ticks.setDateOrigin(dateOrigin))\n // Set preset X default view.\n .setInterval({\n start: new Date('2021-12-07 20:00:00').getTime() - dateOriginTime,\n end: new Date('2021-12-11 06:00:00').getTime() - dateOriginTime,\n })\nconst legend = chart.addLegendBox(LegendBoxBuilders.HorizontalLegendBox).add(chart)\n\nconst zoomBandChart = dashboard.createZoomBandChart({ columnIndex: 0, rowIndex: 1 }).setTitle('')\nzoomBandChart.add(seriesClose)\nzoomBandChart.add(seriesVolume)\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0053/data.json')\n .then((r) => r.json())\n .then((data) => {\n // Compile XY data point lists for close series and volume series.\n // Data gaps are programmatically detected and marked into the data set.\n const dataGapThresholdX = 1 * 60 * 60 * 1000 // 1 hour as milliseconds\n const closeDataXY = []\n const volumeDataXY = []\n let xPrev\n for (let i = 0; i < data.length; i += 1) {\n const p = data[i]\n if (xPrev !== undefined) {\n const xGap = p.time - xPrev\n if (xGap > dataGapThresholdX) {\n // There is a gap in the data set between data points [i - 1] and [i]\n // Disconnect the series at this point by adding an extra data point with NaN value between these two data points.\n closeDataXY.push({ x: p.time - dateOriginTime, y: Number.NaN })\n volumeDataXY.push({ x: p.time - dateOriginTime, y: Number.NaN })\n i += 1\n }\n }\n closeDataXY.push({ x: p.time - dateOriginTime, y: p.close })\n volumeDataXY.push({ x: p.time - dateOriginTime, y: p.volume })\n xPrev = p.time\n }\n\n seriesClose.add(closeDataXY)\n seriesVolume.add(volumeDataXY)\n })\n","url":null,"readme":"Normally, series types such as `LineSeries`, `AreaSeries`, etc. automatically connect data points to highlight the progression of trend values. In some specific use cases, this is not the ideal behavior as data may contain frequent _data gaps_, meaning relatively large time intervals when there are no data samples available.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/pic1.png)\n\nIn LightningChart JS, data gaps can be specified by adding an extra data point with value of `NaN` (_Not-A-Number_).\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/pic2.png)\n\nThe code of this example shows one way of automatically detecting gaps in data sets and adding the `NaN` data points in. By default it looks for 1 hour difference between two data points, but this can be easily modified.\n","image":"dataGaps"},{"id":"lcjs-example-0054-scatterImageFill","title":"JavaScript Custom Event Chart","tags":["xy","scatter","line","realtime","date-time"],"description":"Example showcasing custom events display in a time-series XY chart","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, emptyFill, AxisTickStrategies, AxisScrollStrategies, DashedLine, emptyLine, ImageFill } = lcjs\n\nconst exampleContainer = document.getElementById('chart') || document.body\nif (exampleContainer === document.body) {\n exampleContainer.style.width = '100vw'\n exampleContainer.style.height = '100vh'\n exampleContainer.style.margin = '0px'\n}\nconst containerChart1 = document.createElement('div')\nconst containerChart2 = document.createElement('div')\nexampleContainer.append(containerChart1)\nexampleContainer.append(containerChart2)\ncontainerChart1.style.width = '100%'\ncontainerChart1.style.height = '70%'\ncontainerChart2.style.width = '100%'\ncontainerChart2.style.height = '30%'\n\nconst threshold = 70\n\nconst lc = lightningChart()\nconst chart = lc.ChartXY({\n container: containerChart1,\n // theme: Themes.darkGold\n})\nconst timeAxis = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time)\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({\n end: state.dataMax ?? 0,\n start: (state.dataMax ?? 0) - 15_000,\n stopAxisAfter: false,\n }))\nconst axisY = chart.getDefaultAxisY().setDefaultInterval({ start: 0, end: 100 })\n\nconst eventSeries = chart\n .addPointLineAreaSeries({ dataPattern: null })\n .setAreaFillStyle(emptyFill)\n .setStrokeStyle(emptyLine)\n .setAutoScrollingEnabled(false)\n .setCursorEnabled(false)\nconst warningImage = new Image()\nwarningImage.crossOrigin = ''\nwarningImage.src = document.head.baseURI + 'examples/assets/0054/warning.png'\neventSeries\n .setPointFillStyle(new ImageFill({ source: warningImage }))\n .setPointAlignment({ x: 0, y: -1.1 })\n .setPointSize(0.8)\n\nconst lineSeries = chart.addPointLineAreaSeries({ dataPattern: 'ProgressiveX' }).setAreaFillStyle(emptyFill).setMaxSampleCount(100_000)\naxisY\n .addConstantLine()\n .setValue(threshold)\n .setStrokeStyle((stroke) => new DashedLine({ fillStyle: stroke.getFillStyle() }))\n\nconst zoomBandChart = lc.ZoomBandChart({ container: containerChart2 })\nzoomBandChart.add(eventSeries).setAutoScrollingEnabled(false).setPointAlignment({ x: 0, y: -1.1 }).setPointSize(0.5)\nzoomBandChart.add(lineSeries)\nzoomBandChart.getDefaultAxisY().setInterval({ start: 0, end: 100 })\n\nlet yPrev = 50\nsetInterval(() => {\n const x = performance.now()\n const y = yPrev + (Math.random() - 0.4)\n lineSeries.appendSample({ x, y })\n yPrev = y\n if (y > threshold) {\n yPrev *= Math.random()\n // Add automatically generated event indicator at X + Y location.\n eventSeries.appendSample({ x, y })\n }\n}, 1000 / 60)\n","url":null,"readme":"Example showcasing use of `ImageFill` in a scatter series.\n\nThis feature allows displaying any number of custom image assets (.png, .jpg, etc.) within a `ChartXY`. These images are clipped by the visible area of X and Y axes.\n\nSee also, using [custom Icons as point shape](https://lightningchart.com/js-charts/interactive-examples/examples/lcjs-example-0055-scatterIcons.html).\n\n---\n\nimage: Flaticon.com\n","image":"scatterImageFill","showNew":true},{"id":"lcjs-example-0055-scatterIcons","title":"JavaScript Annotation Chart","tags":["xy","line","realtime","date-time"],"description":"Example showing how a time-series chart where user can drag and drop annotations","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, emptyFill, AxisTickStrategies, AxisScrollStrategies, emptyLine, IndividualPointFill, ColorHEX } = lcjs\n\nconst imgFlag = new Image()\nimgFlag.crossOrigin = ''\nimgFlag.src = document.head.baseURI + 'examples/assets/0055/flag.png'\n\nlet channels = new Array(3).fill(0).map((_, i) => ({ label: `Channel ${i + 1}` }))\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Drag different colored annotations from left')\nchart.getDefaultAxisY().dispose()\nchannels = channels.map((ch, i) => {\n const iStack = channels.length - (i + 1)\n const axisY = chart\n .addAxisY({ iStack })\n .setDefaultInterval({ start: 0, end: 1 })\n .setMargins(iStack > 0 ? 15 : 0, iStack < channels.length - 1 ? 15 : 0)\n .setMouseInteractions(false)\n .setChartInteractions(false)\n const series = chart\n .addPointLineAreaSeries({ axisY, dataPattern: 'ProgressiveX' })\n .setAreaFillStyle(emptyFill)\n .setMaxSampleCount(100_000)\n return { axisY, series }\n})\nconst timeAxis = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time)\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({\n end: state.dataMax ?? 0,\n start: (state.dataMax ?? 0) - 15_000,\n stopAxisAfter: false,\n }))\n\nsetInterval(() => {\n const x = performance.now()\n channels.forEach((ch) => {\n const y = Math.random()\n ch.series.appendSample({ x, y })\n })\n}, 1000 / 60)\n\n// Drag & drop annotations\nconst annotationMenu = document.createElement('div')\nchart.engine.container.append(annotationMenu)\nannotationMenu.style.position = 'absolute'\nannotationMenu.style.display = 'flex'\nannotationMenu.style.flexDirection = 'row'\nannotationMenu.style.margin = '10px'\n;[\n { color: '#ff0000', label: 'Red' },\n { color: '#00ff00', label: 'Green' },\n { color: '#0000ff', label: 'Blue' },\n].forEach((item) => {\n const option = document.createElement('span')\n annotationMenu.append(option)\n option.style.height = option.style.width = '20px'\n option.style.fontFamily = 'Segoe UI'\n option.style.backgroundColor = item.color\n option.style.marginRight = '10px'\n option.style.border = `solid ${chart.getTheme().isDark ? 'white' : 'black'} 1px`\n option.style.borderRadius = '5px'\n option.style.cursor = 'pointer'\n option.draggable = true\n option.ondragstart = (event) => {\n event.dataTransfer.setData('text', JSON.stringify(item))\n }\n})\nconst uiAxisY = chart\n .addAxisY({ opposite: true })\n .setTickStrategy(AxisTickStrategies.Empty)\n .setStrokeStyle(emptyLine)\n .setMouseInteractions(false)\n .setInterval({ start: 0, end: 1 })\nconst pointSeries = chart\n .addPointLineAreaSeries({\n axisY: uiAxisY,\n dataPattern: null,\n colors: true,\n })\n .setAreaFillStyle(emptyFill)\n .setStrokeStyle(emptyLine)\n .setPointFillStyle(new IndividualPointFill())\n .setPointShape(chart.engine.addCustomIcon(imgFlag))\n .setPointSize(0.2)\n .setPointAlignment({ x: -1, y: 1 })\n .setAutoScrollingEnabled(false)\n .setCursorEnabled(false)\nchart.engine.container.ondragover = (event) => event.preventDefault()\nchart.engine.container.ondrop = (event) => {\n const item = JSON.parse(event.dataTransfer.getData('text'))\n const x = chart.translateCoordinate(event, chart.coordsAxis).x\n // Annotation is built from 2 components:\n // 1. ConstantLine (vertical line created on X axis)\n // 2. A single sample in Point series with Icon shape and individual sample colors.\n timeAxis.addConstantLine(false).setValue(x)\n pointSeries.appendSample({ x, y: 1, color: ColorHEX(item.color) })\n}\n","url":null,"readme":"Example showcasing use of custom Icons as shape of a Point series.\nIn this example, a .png image asset of a flag is loaded as a custom icon, and used as the shape of a point series.\nThis point series is then used to display flag annotations bound to a timestamp that can be dragged and dropped by the user. The flags are also available as different colors.\n\nAs such, this also showcases a simple example of chart as a drag & drop target.\n\nSee also, [displaying custom images in scatter chart](https://lightningchart.com/js-charts/interactive-examples/examples/lcjs-example-0054-scatterImageFill.html).\n","image":"scatterIcons","showNew":true},{"id":"lcjs-example-0056-scatterImageFill2","title":"JavaScript Review Analysis Chart","tags":["xy","scatter","date-time"],"description":"Example of displaying scatter data sets with custom pictures","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, ImageFill, AxisTickStrategies, emptyLine, emptyTick, emptyFill } = lcjs\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Visitor reviews by date and time of day')\n .setPadding({ left: 60 })\n .setAutoCursor((cursor) => cursor.setTickMarkerXVisible(false))\n\nconst reviewTypes = [\n {\n name: 'Unhappy',\n src: document.head.baseURI + 'examples/assets/0056/review-bad.png',\n },\n {\n name: 'Neutral',\n src: document.head.baseURI + 'examples/assets/0056/review-neutral.png',\n },\n {\n name: 'Happy',\n src: document.head.baseURI + 'examples/assets/0056/review-happy.png',\n },\n].map((item) => {\n const image = new Image()\n image.crossOrigin = ''\n image.src = item.src\n const imageFill = new ImageFill({ source: image })\n const icon = chart.engine.addCustomIcon(image, { height: 32 })\n const series = chart\n .addPointLineAreaSeries({ dataPattern: null })\n .setAreaFillStyle(emptyFill)\n .setStrokeStyle(emptyLine)\n .setPointFillStyle(imageFill)\n .setPointSize(0.1)\n .setName(item.name)\n .setIcon(icon)\n series.onHighlight((_, highlight) => {\n series.setPointSize(Number(highlight) > 0 ? 0.15 : 0.1)\n })\n return { ...item, series }\n})\n\nchart\n .getDefaultAxisX()\n .setTitle('Time of day')\n .setInterval({ start: 5.5, end: 22.5 })\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks.setMinorTickStyle(emptyTick).setFormattingFunction((hour) => hour.toFixed(0)),\n )\nchart.getDefaultAxisY().setTitle('Date').setTickStrategy(AxisTickStrategies.DateTime)\n\nconst legend = chart\n .addLegendBox()\n .add(chart)\n .setEntries((entry, component) => {\n entry.setButtonSize(20).setPadding(5)\n })\n\n// Generate random data set for example purposes\nlet time = Date.UTC(2021, 4, 4, 12)\nlet count = 0\ndo {\n time += 10 * 60 * 1000 + Math.random() * 240 * 60 * 1000\n const date = new Date(time)\n const hour = date.getUTCHours() + date.getUTCMinutes() / 60 + date.getUTCSeconds() / 3600\n const chanceNeutral = 0.05\n const chanceHappy = hour > 20 ? 1.0 : 0.05\n const chanceUnhappy = hour < 8 ? 1.0 : 0.05\n const chanceTotal = chanceNeutral + chanceHappy + chanceUnhappy\n const rand = Math.random() * chanceTotal\n const reviewType = rand <= chanceNeutral ? reviewTypes[1] : rand <= chanceNeutral + chanceHappy ? reviewTypes[2] : reviewTypes[0]\n reviewType.series.appendSample({ y: time, x: hour })\n count += 1\n} while (time < Date.UTC(2021, 5, 4, 12))\n","url":null,"readme":"Example of displaying scatter data sets with custom pictures.\n\n---\n\n<a href=\"https://www.flaticon.com/free-icons/smileys\" title=\"smileys icons\">Smileys icons created by Freepik - Flaticon</a>\n","image":"scatterIcons2","showNew":true},{"id":"lcjs-example-0100-areaRange","title":"JavaScript Area Range Chart","tags":["area","range","xy","date-time"],"description":"Example showcasing basic use of an Area Range Series. Also known as a Area Graph, Area Chart or Range Area Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Area charts for Scientific use, dynamic charts, High-Performance Charts, 2D JS charts with area graphs.","src":"/*\n * LightningChartJS example that showcases AreaRangeSeries.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Area Range')\n\n//Cache default X Axis for use.\nconst axisX = chart.getDefaultAxisX()\n\n// Use DateTime TickStrategy and set the interval\naxisX.setTickStrategy(AxisTickStrategies.DateTime).setInterval({\n start: new Date(2018, 0, 1).getTime(),\n end: new Date(2018, 11, 29).getTime(),\n})\n\n// Add AreaRange Series\nconst areaRange = chart.addAreaRangeSeries()\n\n// Modify the ResultTable formatting.\nareaRange.setCursorResultTableFormatter((builder, series, figure, yMax, yMin) => {\n return builder\n .addRow('Actual vs Expected Share Prices of Company')\n .addRow('Date: ' + axisX.formatValue(figure))\n .addRow('Actual: ' + yMax.toFixed(2) + ' $')\n .addRow('Expected: ' + yMin.toFixed(2) + ' $')\n})\nchart.getDefaultAxisY().setTitle('Share price ($)')\n\n// Data for the AreaRange Series\nlet areaRangeData = [\n {\n x: new Date(2018, 0, 1).getTime(),\n yMax: 24,\n yMin: -15,\n },\n {\n x: new Date(2018, 0, 6).getTime(),\n yMax: 11,\n yMin: -13,\n },\n {\n x: new Date(2018, 0, 13).getTime(),\n yMax: 16,\n yMin: -11,\n },\n {\n x: new Date(2018, 0, 20).getTime(),\n yMax: 26,\n yMin: -8,\n },\n {\n x: new Date(2018, 0, 27).getTime(),\n yMax: -2,\n yMin: -4,\n },\n {\n x: new Date(2018, 1, 3).getTime(),\n yMax: -16,\n yMin: 2,\n },\n {\n x: new Date(2018, 1, 10).getTime(),\n yMax: -10,\n yMin: 9,\n },\n {\n x: new Date(2018, 1, 17).getTime(),\n yMax: 3,\n yMin: 17,\n },\n {\n x: new Date(2018, 1, 24).getTime(),\n yMax: -1,\n yMin: 26,\n },\n {\n x: new Date(2018, 2, 3).getTime(),\n yMax: 6,\n yMin: 35,\n },\n {\n x: new Date(2018, 2, 10).getTime(),\n yMax: 17,\n yMin: 39,\n },\n {\n x: new Date(2018, 2, 17).getTime(),\n yMax: -10,\n yMin: 41,\n },\n {\n x: new Date(2018, 2, 24).getTime(),\n yMax: -8,\n yMin: 42,\n },\n {\n x: new Date(2018, 2, 31).getTime(),\n yMax: 13,\n yMin: 41,\n },\n {\n x: new Date(2018, 3, 7).getTime(),\n yMax: -12,\n yMin: 39,\n },\n {\n x: new Date(2018, 3, 14).getTime(),\n yMax: 6,\n yMin: 37,\n },\n {\n x: new Date(2018, 3, 21).getTime(),\n yMax: -10,\n yMin: 36.5,\n },\n {\n x: new Date(2018, 3, 28).getTime(),\n yMax: 27,\n yMin: 36,\n },\n {\n x: new Date(2018, 4, 5).getTime(),\n yMax: 52,\n yMin: 38,\n },\n {\n x: new Date(2018, 4, 12).getTime(),\n yMax: 59,\n yMin: 42,\n },\n {\n x: new Date(2018, 4, 19).getTime(),\n yMax: 64,\n yMin: 50,\n },\n\n {\n x: new Date(2018, 4, 26).getTime(),\n yMax: 59,\n yMin: 53,\n },\n {\n x: new Date(2018, 5, 2).getTime(),\n yMax: 71,\n yMin: 54,\n },\n {\n x: new Date(2018, 5, 9).getTime(),\n yMax: 63,\n yMin: 53,\n },\n {\n x: new Date(2018, 5, 16).getTime(),\n yMax: 79,\n yMin: 52,\n },\n {\n x: new Date(2018, 5, 23).getTime(),\n yMax: 62,\n yMin: 51,\n },\n {\n x: new Date(2018, 5, 30).getTime(),\n yMax: 81,\n yMin: 49,\n },\n {\n x: new Date(2018, 6, 7).getTime(),\n yMax: 53,\n yMin: 48,\n },\n {\n x: new Date(2018, 6, 14).getTime(),\n yMax: 89,\n yMin: 48.5,\n },\n {\n x: new Date(2018, 6, 21).getTime(),\n yMax: 99,\n yMin: 49,\n },\n {\n x: new Date(2018, 6, 28).getTime(),\n yMax: 79,\n yMin: 51,\n },\n {\n x: new Date(2018, 7, 4).getTime(),\n yMax: 51,\n yMin: 51,\n },\n {\n x: new Date(2018, 7, 11).getTime(),\n yMax: 36,\n yMin: 51,\n },\n {\n x: new Date(2018, 7, 18).getTime(),\n yMax: 79,\n yMin: 50,\n },\n {\n x: new Date(2018, 7, 25).getTime(),\n yMax: 49,\n yMin: 53,\n },\n {\n x: new Date(2018, 8, 1).getTime(),\n yMax: 33,\n yMin: 55,\n },\n {\n x: new Date(2018, 8, 8).getTime(),\n yMax: 51,\n yMin: 58,\n },\n {\n x: new Date(2018, 8, 15).getTime(),\n yMax: 43,\n yMin: 60,\n },\n {\n x: new Date(2018, 8, 22).getTime(),\n yMax: 72,\n yMin: 61,\n },\n {\n x: new Date(2018, 8, 29).getTime(),\n yMax: 82,\n yMin: 60.5,\n },\n {\n x: new Date(2018, 9, 6).getTime(),\n yMax: 73,\n yMin: 59,\n },\n\n {\n x: new Date(2018, 9, 13).getTime(),\n yMax: 73,\n yMin: 58,\n },\n {\n x: new Date(2018, 9, 20).getTime(),\n yMax: 67,\n yMin: 55,\n },\n {\n x: new Date(2018, 9, 27).getTime(),\n yMax: 43,\n yMin: 53,\n },\n {\n x: new Date(2018, 10, 3).getTime(),\n yMax: 12,\n yMin: 54,\n },\n {\n x: new Date(2018, 10, 10).getTime(),\n yMax: 26,\n yMin: 54.5,\n },\n {\n x: new Date(2018, 10, 17).getTime(),\n yMax: 46,\n yMin: 56,\n },\n {\n x: new Date(2018, 10, 24).getTime(),\n yMax: 43,\n yMin: 58,\n },\n {\n x: new Date(2018, 11, 1).getTime(),\n yMax: 72,\n yMin: 60,\n },\n {\n x: new Date(2018, 11, 8).getTime(),\n yMax: 82,\n yMin: 62.5,\n },\n {\n x: new Date(2018, 11, 15).getTime(),\n yMax: 73,\n yMin: 64,\n },\n {\n x: new Date(2018, 11, 22).getTime(),\n yMax: 92,\n yMin: 65,\n },\n {\n x: new Date(2018, 11, 29).getTime(),\n yMax: 107,\n yMin: 66,\n },\n]\n\nareaRangeData.forEach((point, i) => {\n areaRange.add({ position: point.x, high: point.yMax, low: point.yMin })\n})\n","url":null,"readme":"_Also known as a Area Graph, Area Chart or Range Area Chart_\n\nThe example shows the basic usage of an Area Range series. The Range Area Chart is similar to the **_Area series_**, which is plotted by shading the area between a range of values ( high & low ) represented by two curves of data.\n\nRange charts are generally used to show variations (low & high) simultaneously in the given period. Typical visualization applications use this type of graph shows temperature, price etc.\n\nThe series uses two fill styles, which can be configured individually, the identical behavior is applicable for borders:\n\n- the normal fill is used when High is greater than Low\n- the reversed fill is used when Low is greater than High\n\n```javascript\n// Create a new ChartXY.\nconst chart = lightningChart().ChartXY()\n\n// Add an area series with bipolar direction using default X and Y axes.\nconst areaRange = chart.addAreaRangeSeries()\n```\n\nThe series accepts **_AreaPoint_** type of points either as an object in format `{ position: number, high: number, low: number }`,\n\n```javascript\nseries.add({ position: 20, high: 45, low: -20 })\n```\n\nor via a factory that should be additionally imported.\n\n```javascript\nseries.add(AreaPoint(20, 45, -20))\n```\n\nAny number of points can be added with a single call.\n\n```javascript\n// Single point.\nseries.add({ position: 20, high: 45, low: -20 })\n\n// Multiple points at once.\nseries.add([\n { position: 20, high: 45, low: -20 },\n { position: 40, high: 95, low: 10 },\n { position: 60, high: 25, low: 60 },\n])\n```\n","image":"areaRange"},{"id":"lcjs-example-0101-multipleAreas","title":"JavaScript Multiple Areas Chart","tags":["range","area","xy"],"description":"Basic usage of a Monopolar Area series. Also known as a Area Graph or Area Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Area charts for Scientific use, dynamic charts, High-Performance Charts, 2D JS charts with area graphs.","src":"/*\n * LightningChart® example code: Demo shows how to draw multiple layered area series.\n *\n * http://lightningchart.com | [email protected] | [email protected]\n * © LightningChart Ltd 2009-2019. All rights reserved.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AreaSeriesTypes, UIElementBuilders, LegendBoxBuilders, PointShape, Themes } = lcjs\n\n// Create a XY Chart.\nconst xyChart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Expected Profits To Expenses')\n .setPadding({ right: 2 })\n\n// Create a LegendBox as part of the chart.\nconst legend = xyChart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n\n// ---- Add multiple Area series with different baselines and direction. ----\nconst areaProfit = xyChart.addAreaSeries({ type: AreaSeriesTypes.Positive }).setName('Profits')\n\nconst areaExpense = xyChart.addAreaSeries({ type: AreaSeriesTypes.Negative }).setName('Expenses')\n\n// Set Axis nicely\nxyChart.getDefaultAxisX().setTitle('Units Produced')\nxyChart.getDefaultAxisY().setTitle('USD')\n\nconst profitData = [\n { x: 0, y: 0 },\n { x: 10, y: 21 },\n { x: 20, y: 59 },\n { x: 30, y: 62 },\n { x: 40, y: 78 },\n { x: 50, y: 85 },\n { x: 60, y: 95 },\n { x: 70, y: 98 },\n { x: 80, y: 103 },\n { x: 90, y: 110 },\n { x: 100, y: 112 },\n { x: 110, y: 126 },\n { x: 120, y: 132 },\n { x: 130, y: 170 },\n { x: 140, y: 172 },\n { x: 150, y: 202 },\n { x: 160, y: 228 },\n { x: 170, y: 267 },\n { x: 180, y: 300 },\n { x: 190, y: 310 },\n { x: 200, y: 320 },\n { x: 210, y: 329 },\n { x: 220, y: 336 },\n { x: 230, y: 338 },\n { x: 240, y: 343 },\n { x: 250, y: 352 },\n { x: 260, y: 355 },\n { x: 270, y: 390 },\n { x: 280, y: 392 },\n { x: 290, y: 418 },\n { x: 300, y: 421 },\n { x: 310, y: 430 },\n { x: 320, y: 434 },\n { x: 330, y: 468 },\n { x: 340, y: 472 },\n { x: 350, y: 474 },\n { x: 360, y: 480 },\n { x: 370, y: 506 },\n { x: 380, y: 545 },\n { x: 390, y: 548 },\n { x: 400, y: 552 },\n { x: 410, y: 584 },\n { x: 420, y: 612 },\n { x: 430, y: 619 },\n { x: 440, y: 627 },\n { x: 450, y: 657 },\n { x: 460, y: 669 },\n { x: 470, y: 673 },\n { x: 480, y: 695 },\n { x: 490, y: 702 },\n { x: 500, y: 710 },\n]\nconst expensesData = [\n { x: 0, y: 0 },\n { x: 10, y: -58 },\n { x: 20, y: -61 },\n { x: 30, y: -62 },\n { x: 40, y: -66 },\n { x: 50, y: -88 },\n { x: 60, y: -93 },\n { x: 70, y: -124 },\n { x: 80, y: -126 },\n { x: 90, y: -136 },\n { x: 100, y: -152 },\n { x: 110, y: -156 },\n { x: 120, y: -190 },\n { x: 130, y: -199 },\n { x: 140, y: -200 },\n { x: 150, y: -208 },\n { x: 160, y: -210 },\n { x: 170, y: -235 },\n { x: 180, y: -270 },\n { x: 190, y: -299 },\n { x: 200, y: -321 },\n { x: 210, y: -342 },\n { x: 220, y: -350 },\n { x: 230, y: -360 },\n { x: 240, y: -374 },\n { x: 250, y: -413 },\n { x: 260, y: -433 },\n { x: 270, y: -447 },\n { x: 280, y: -449 },\n { x: 290, y: -454 },\n { x: 300, y: -461 },\n { x: 310, y: -461 },\n { x: 320, y: -492 },\n { x: 330, y: -496 },\n { x: 340, y: -518 },\n { x: 350, y: -522 },\n { x: 360, y: -557 },\n { x: 370, y: -562 },\n { x: 380, y: -596 },\n { x: 390, y: -599 },\n { x: 400, y: -609 },\n { x: 410, y: -611 },\n { x: 420, y: -628 },\n { x: 430, y: -635 },\n { x: 440, y: -636 },\n { x: 450, y: -643 },\n { x: 460, y: -643 },\n { x: 470, y: -647 },\n { x: 480, y: -648 },\n { x: 490, y: -659 },\n { x: 500, y: -665 },\n]\n\n// ---- Generate points using 'xydata'-library and add it to every plot. ----\nprofitData.forEach((point) => {\n areaProfit.add(point)\n})\nexpensesData.forEach((point) => {\n areaExpense.add(point)\n})\n\n// Set the custom result table for both areaSeries\nareaProfit.setCursorResultTableFormatter((builder, series, position, highValue, lowValue) => {\n return builder\n .addRow('Profits')\n .addRow('Amount: $' + highValue.toFixed(0))\n .addRow('Units Produced: ' + position.toFixed(0))\n})\nareaExpense.setCursorResultTableFormatter((builder, series, position, highValue, lowValue) => {\n return builder\n .addRow('Expenses')\n .addRow('Amount: $' + highValue.toFixed(0) * -1)\n .addRow('Units Produced: ' + position.toFixed(0))\n})\n\n// Add series to LegendBox and style entries.\nlegend.add(areaProfit, true, 'Expected Profits To Expenses', UIElementBuilders.CheckBox.setButtonShape(PointShape.Circle))\nlegend.add(areaExpense, true, 'Expected Profits To Expenses', UIElementBuilders.CheckBox.setButtonShape(PointShape.Circle))\n","url":null,"readme":"_Also known as a Area Graph or Area Chart_\n\nThe example shows the basic usage of a monopolar area series. The area series is based on **_line series_** with the area between the baseline and the given data filled with color. It is drawn on a Cartesian coordinate system and represents the quantitative data.\n\nCurrent example chart contains two monopolar area series. They are drawn on different sides of the specified baseline and the selected area type specifies the direction. The first area has a positive direction, the second one has a negative direction.\n\nThe simple area chart can be created with few simple lines of code:\n\n```javascript\n// Create a new ChartXY.\nconst chart = lightningChart().ChartXY()\n\n// Add an area series with positive direction using default X and Y axes.\nconst areaPositive = chart.addAreaSeries({\n baseline: 0,\n type: AreaSeriesTypes.Positive,\n})\n\n// Add an area series with negative direction using default X and Y axes.\nconst areaNegative = chart.addAreaSeries({\n baseline: 0,\n type: AreaSeriesTypes.Negative,\n})\n```\n\nThe baseline value the type of number and the type can be specified only during the creation of a series instance, where\n\n- The baseline is a fixed reference level of minimum or starting point used for comparisons, which allow customizing the position of the area.\n\n- The type of area series is an enum selector which defines the type of area series:\n - Select AreaSeriesTypes.Positive to show the data only above the baseline.\n - Select AreaSeriesTypes.Negative to show the data only below the baseline.\n - Select AreaSeriesTypes.Both to show the data from both sides of the baseline. _Bipolar area series will be explained in the future example_.\n\nThe series accepts points in format `{ x: number, y: number }`. Any number of points can be added with a single call.\n\n```javascript\n// Single point.\nseries.add({ x: 50, y: 60 })\n\n// Multiple points at once.\nseries.add([\n { x: 55, y: 60 },\n { x: 60, y: 62 },\n { x: 65, y: 65 },\n])\n```\n","image":"multipleAreas"},{"id":"lcjs-example-0102-areaBipolar","title":"Area Bipolar JavaScript Chart","tags":["area","xy","date-time"],"description":"Basic usage of Bipolar Area Series. Also known as a Bubble Series, Bubble Chart and Bubble Graph.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Area charts for Scientific use, dynamic charts, High-Performance Charts, 2D JS charts with area graphs.","src":"/*\n * LightningChart® example code: Demo shows how to draw multiple layered area series.\n * If you need any assistance, or notice error in this example code, please contact [email protected].\n *\n * http://www.lightningchart.com | [email protected]\n * © LightningChart Ltd 2009-2019. All rights reserved.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AreaSeriesTypes, AxisScrollStrategies, AxisTickStrategies, AutoCursorModes, Themes } = lcjs\n\n// Decide on an origin for DateTime axis.\nconst dateOrigin = new Date(2017, 0, 1)\n\n// Create a XY Chart.\nconst xyChart = lightningChart().ChartXY({\n // theme: Themes.darkGold\n})\n// Use DateTime TickStrategy and set the interval\nxyChart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setInterval({\n start: new Date(2017, 0, 1).getTime(),\n end: new Date(2017, 11, 26).getTime(),\n })\n\nxyChart.setTitle('Company growth in comparison to static baseline')\nxyChart.setAutoCursorMode(AutoCursorModes.onHover)\n\n// set y-axis title\nconst axisY = xyChart\n .getDefaultAxisY()\n .setTitle('Growth %')\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 80, stopAxisAfter: false }))\n\nlet areaBipolarData = [\n { x: new Date(2017, 0, 2).getTime(), y: 12 },\n { x: new Date(2017, 0, 9).getTime(), y: 71 },\n { x: new Date(2017, 0, 16).getTime(), y: 24 },\n { x: new Date(2017, 0, 23).getTime(), y: 39 },\n { x: new Date(2017, 0, 30).getTime(), y: 24 },\n { x: new Date(2017, 1, 6).getTime(), y: 10 },\n { x: new Date(2017, 1, 13).getTime(), y: 58 },\n { x: new Date(2017, 1, 20).getTime(), y: 10 },\n { x: new Date(2017, 1, 27).getTime(), y: 74 },\n { x: new Date(2017, 2, 6).getTime(), y: 23 },\n { x: new Date(2017, 2, 13).getTime(), y: 19 },\n { x: new Date(2017, 2, 20).getTime(), y: 25 },\n { x: new Date(2017, 2, 27).getTime(), y: 51 },\n { x: new Date(2017, 3, 3).getTime(), y: 20 },\n { x: new Date(2017, 3, 10).getTime(), y: 40 },\n { x: new Date(2017, 3, 17).getTime(), y: 50 },\n { x: new Date(2017, 3, 24).getTime(), y: 26 },\n { x: new Date(2017, 4, 1).getTime(), y: 72 },\n { x: new Date(2017, 4, 8).getTime(), y: 39 },\n { x: new Date(2017, 4, 15).getTime(), y: 49 },\n { x: new Date(2017, 4, 22).getTime(), y: 22 },\n { x: new Date(2017, 4, 29).getTime(), y: 21 },\n { x: new Date(2017, 5, 5).getTime(), y: 36 },\n { x: new Date(2017, 5, 12).getTime(), y: 73 },\n { x: new Date(2017, 5, 19).getTime(), y: 67 },\n { x: new Date(2017, 5, 26).getTime(), y: 53 },\n { x: new Date(2017, 6, 3).getTime(), y: 8 },\n { x: new Date(2017, 6, 10).getTime(), y: 7 },\n { x: new Date(2017, 6, 17).getTime(), y: 71 },\n { x: new Date(2017, 6, 24).getTime(), y: 29 },\n { x: new Date(2017, 6, 31).getTime(), y: 56 },\n { x: new Date(2017, 7, 7).getTime(), y: 18 },\n { x: new Date(2017, 7, 14).getTime(), y: 15 },\n { x: new Date(2017, 7, 21).getTime(), y: 9 },\n { x: new Date(2017, 7, 28).getTime(), y: 29 },\n { x: new Date(2017, 8, 4).getTime(), y: 64 },\n { x: new Date(2017, 8, 11).getTime(), y: 44 },\n { x: new Date(2017, 8, 18).getTime(), y: 62 },\n { x: new Date(2017, 8, 25).getTime(), y: 70 },\n { x: new Date(2017, 9, 2).getTime(), y: 19 },\n { x: new Date(2017, 9, 9).getTime(), y: 55 },\n { x: new Date(2017, 9, 16).getTime(), y: 15 },\n { x: new Date(2017, 9, 23).getTime(), y: 48 },\n { x: new Date(2017, 9, 30).getTime(), y: 23 },\n { x: new Date(2017, 10, 6).getTime(), y: 51 },\n { x: new Date(2017, 10, 13).getTime(), y: 51 },\n { x: new Date(2017, 10, 20).getTime(), y: 64 },\n { x: new Date(2017, 10, 27).getTime(), y: 15 },\n { x: new Date(2017, 11, 4).getTime(), y: 31 },\n { x: new Date(2017, 11, 11).getTime(), y: 40 },\n { x: new Date(2017, 11, 18).getTime(), y: 11 },\n { x: new Date(2017, 11, 25).getTime(), y: 30 },\n]\n\n// Add dynamic bipolar Area Series.\nconst areaBipolar = xyChart\n .addAreaSeries({ baseline: 40, type: AreaSeriesTypes.Bipolar })\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((builder, series, position, high, low) =>\n builder\n .addRow(series.getName())\n .addRow('Date:', series.axisX.formatValue(position))\n .addRow('Growth:', series.axisY.formatValue(high), '%'),\n )\n\nareaBipolar.add(areaBipolarData)\n","url":null,"readme":"_Also known as a Area Graph, Area Chart or Area Chart with Negative values_\n\nThe example shows the basic usage of a bipolar area series. The area series is based on **_line series_** with the area between the baseline and the given data filled with color. It is drawn on a Cartesian coordinate system and represents the quantitative data.\n\nCurrent example chart contains one bipolar area series. The data is drawn from both sides of the specified baseline.\n\nThe simple area chart can be created with few simple lines of code:\n\n```javascript\n// Create a new ChartXY.\nconst chart = lightningChart().ChartXY()\n\n// Add an area series with bipolar direction using default X and Y axes.\nconst areaBipolar = chart.addAreaSeries({\n baseline: 0,\n type: AreaSeriesTypes.Both,\n})\n```\n\nThe baseline value the type of number and the type can be specified only during the creation of a series instance, where\n\n- The baseline is a fixed reference level of minimum or starting point used for comparisons, which allow customizing the position of the area.\n\n- The type of area series is an enum selector which defines the type of area series:\n - Select AreaSeriesTypes.Both to show the data from both sides of the baseline.\n\nThe series accepts points in format `{ x: number, y: number }`. Any number of points can be added with a single call.\n\n```javascript\n// Single point.\nseries.add({ x: 50, y: 60 })\n\n// Multiple points at once.\nseries.add([\n { x: 55, y: 60 },\n { x: 60, y: 62 },\n { x: 65, y: 65 },\n])\n```\n","image":"areaBipolar"},{"id":"lcjs-example-0103-layeredAreas","title":"Layered Areas JavaScript Chart","tags":["area","xy","date-time"],"description":"Layered Area Chart done by layering multiple Area Series on top of each other. Also known as a Layered Area Graph, Layered Area Chart or Multiple Area Charts.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Area charts for Scientific use, dynamic charts, High-Performance Charts, 2D JS charts with area graphs.","src":"/*\n * LightningChartJS example that showcases creation and styling of Area Series in a layered setting.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, UIElementBuilders, Themes } = lcjs\n\n// Create a XY Chart.\nconst xyChart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Product version distribution')\n .setMouseInteractions(true)\n .setPadding({ right: 25 })\n\n// Custom tick labels for X Axis.\nconst reportTableXlable = [\n 'Jan-17',\n 'Feb-17',\n 'Mar-17',\n 'Apr-17',\n 'May-17',\n 'Jun-17',\n 'Jul-17',\n 'Aug-17',\n 'Sep-17',\n 'Oct-17',\n 'Nov-17',\n 'Dec-17',\n]\n\n// Creating AreaSeries\nconst createAreaSeries = (versionNumber, index) => {\n return xyChart\n .addAreaSeries()\n .setName(`Version ${versionNumber}`)\n .setCursorResultTableFormatter((builder, series, xValue, yValue) => {\n return builder\n .addRow(series.getName())\n .addRow('Date: ', reportTableXlable[parseInt(xValue)])\n .addRow('Distribution: ' + yValue.toFixed(2))\n })\n}\n\n// Create the area series\nconst V1Area = createAreaSeries(1, 0)\nconst V2Area = createAreaSeries(2, 2)\nconst V3Area = createAreaSeries(3, 2)\nconst V4Area = createAreaSeries(4, 0)\nconst V5Area = createAreaSeries(5, 1)\nconst V6Area = createAreaSeries(6, 2)\nconst V7Area = createAreaSeries(7, 0)\nconst V8Area = createAreaSeries(8, 1)\nconst V9Area = createAreaSeries(9, 2)\nconst V10Area = createAreaSeries(10, 0)\nconst V11Area = createAreaSeries(11, 1)\nconst V12Area = createAreaSeries(12, 2)\n\n// DataSet for all versions\nconst version1 = [\n {\n x: 'Jan-17',\n y: 1.3,\n },\n {\n x: 'Feb-17',\n y: 1.1,\n },\n {\n x: 'Mar-17',\n y: 1,\n },\n {\n x: 'Apr-17',\n y: 0.8,\n },\n {\n x: 'May-17',\n y: 0.7,\n },\n {\n x: 'Jun-17',\n y: 0.6,\n },\n {\n x: 'Jul-17',\n y: 0.6,\n },\n {\n x: 'Aug-17',\n y: 0.5,\n },\n {\n x: 'Sep-17',\n y: 0.4,\n },\n {\n x: 'Oct-17',\n y: 0.4,\n },\n {\n x: 'Nov-17',\n y: 0.3,\n },\n {\n x: 'Dec-17',\n y: 0.3,\n },\n]\n\nconst version2 = [\n {\n x: 'Jan-17',\n y: 4.9,\n },\n {\n x: 'Feb-17',\n y: 4,\n },\n {\n x: 'Mar-17',\n y: 3.7,\n },\n {\n x: 'Apr-17',\n y: 3.2,\n },\n {\n x: 'May-17',\n y: 2.8,\n },\n {\n x: 'Jun-17',\n y: 2.4,\n },\n {\n x: 'Jul-17',\n y: 2.3,\n },\n {\n x: 'Aug-17',\n y: 2,\n },\n {\n x: 'Sep-17',\n y: 1.7,\n },\n {\n x: 'Oct-17',\n y: 1.5,\n },\n {\n x: 'Nov-17',\n y: 1.2,\n },\n {\n x: 'Dec-17',\n y: 1.1,\n },\n]\n\nconst version3 = [\n {\n x: 'Jan-17',\n y: 6.8,\n },\n {\n x: 'Feb-17',\n y: 5.9,\n },\n {\n x: 'Mar-17',\n y: 5.4,\n },\n {\n x: 'Apr-17',\n y: 4.6,\n },\n {\n x: 'May-17',\n y: 4.1,\n },\n {\n x: 'Jun-17',\n y: 3.5,\n },\n {\n x: 'Jul-17',\n y: 3.3,\n },\n {\n x: 'Aug-17',\n y: 3,\n },\n {\n x: 'Sep-17',\n y: 2.6,\n },\n {\n x: 'Oct-17',\n y: 2.2,\n },\n {\n x: 'Nov-17',\n y: 1.8,\n },\n {\n x: 'Dec-17',\n y: 1.5,\n },\n]\n\nconst version4 = [\n {\n x: 'Jan-17',\n y: 2,\n },\n {\n x: 'Feb-17',\n y: 1.7,\n },\n {\n x: 'Mar-17',\n y: 1.5,\n },\n {\n x: 'Apr-17',\n y: 1.3,\n },\n {\n x: 'May-17',\n y: 1.2,\n },\n {\n x: 'Jun-17',\n y: 1,\n },\n {\n x: 'Jul-17',\n y: 1,\n },\n {\n x: 'Aug-17',\n y: 0.9,\n },\n {\n x: 'Sep-17',\n y: 0.7,\n },\n {\n x: 'Oct-17',\n y: 0.6,\n },\n {\n x: 'Nov-17',\n y: 0.5,\n },\n {\n x: 'Dec-17',\n y: 0.4,\n },\n]\n\nconst version5 = [\n {\n x: 'Jan-17',\n y: 25.2,\n },\n {\n x: 'Feb-17',\n y: 22.6,\n },\n {\n x: 'Mar-17',\n y: 20.8,\n },\n {\n x: 'Apr-17',\n y: 18.8,\n },\n {\n x: 'May-17',\n y: 17.1,\n },\n {\n x: 'Jun-17',\n y: 15.1,\n },\n {\n x: 'Jul-17',\n y: 14.5,\n },\n {\n x: 'Aug-17',\n y: 13.4,\n },\n {\n x: 'Sep-17',\n y: 12,\n },\n {\n x: 'Oct-17',\n y: 10.3,\n },\n {\n x: 'Nov-17',\n y: 8.6,\n },\n {\n x: 'Dec-17',\n y: 7.6,\n },\n]\n\nconst version6 = [\n {\n x: 'Jan-17',\n y: 11.3,\n },\n {\n x: 'Feb-17',\n y: 10.1,\n },\n {\n x: 'Mar-17',\n y: 9.4,\n },\n {\n x: 'Apr-17',\n y: 8.7,\n },\n {\n x: 'May-17',\n y: 7.8,\n },\n {\n x: 'Jun-17',\n y: 7.1,\n },\n {\n x: 'Jul-17',\n y: 6.7,\n },\n {\n x: 'Aug-17',\n y: 6.1,\n },\n {\n x: 'Sep-17',\n y: 5.4,\n },\n {\n x: 'Oct-17',\n y: 4.8,\n },\n {\n x: 'Nov-17',\n y: 3.8,\n },\n {\n x: 'Dec-17',\n y: 3.5,\n },\n]\n\nconst version7 = [\n {\n x: 'Jan-17',\n y: 22.8,\n },\n {\n x: 'Feb-17',\n y: 23.3,\n },\n {\n x: 'Mar-17',\n y: 23.1,\n },\n {\n x: 'Apr-17',\n y: 23.3,\n },\n {\n x: 'May-17',\n y: 23.3,\n },\n {\n x: 'Jun-17',\n y: 21.7,\n },\n {\n x: 'Jul-17',\n y: 21,\n },\n {\n x: 'Aug-17',\n y: 20.2,\n },\n {\n x: 'Sep-17',\n y: 19.2,\n },\n {\n x: 'Oct-17',\n y: 17.6,\n },\n {\n x: 'Nov-17',\n y: 15.4,\n },\n {\n x: 'Dec-17',\n y: 14.4,\n },\n]\n\nconst version8 = [\n {\n x: 'Jan-17',\n y: 24,\n },\n {\n x: 'Feb-17',\n y: 29.6,\n },\n {\n x: 'Mar-17',\n y: 31.3,\n },\n {\n x: 'Apr-17',\n y: 31.2,\n },\n {\n x: 'May-17',\n y: 31.8,\n },\n {\n x: 'Jun-17',\n y: 32.2,\n },\n {\n x: 'Jul-17',\n y: 32,\n },\n {\n x: 'Aug-17',\n y: 29.7,\n },\n {\n x: 'Sep-17',\n y: 28.1,\n },\n {\n x: 'Oct-17',\n y: 25.5,\n },\n {\n x: 'Nov-17',\n y: 22.7,\n },\n {\n x: 'Dec-17',\n y: 21.3,\n },\n]\n\nconst version9 = [\n {\n x: 'Jan-17',\n y: 0.3,\n },\n {\n x: 'Feb-17',\n y: 0.5,\n },\n {\n x: 'Mar-17',\n y: 2.4,\n },\n {\n x: 'Apr-17',\n y: 6.6,\n },\n {\n x: 'May-17',\n y: 10.6,\n },\n {\n x: 'Jun-17',\n y: 14.2,\n },\n {\n x: 'Jul-17',\n y: 15.8,\n },\n {\n x: 'Aug-17',\n y: 19.3,\n },\n {\n x: 'Sep-17',\n y: 22.3,\n },\n {\n x: 'Oct-17',\n y: 22.9,\n },\n {\n x: 'Nov-17',\n y: 20.3,\n },\n {\n x: 'Dec-17',\n y: 18.1,\n },\n]\n\nconst version10 = [\n {\n x: 'Jan-17',\n y: 0,\n },\n {\n x: 'Feb-17',\n y: 0.2,\n },\n {\n x: 'Mar-17',\n y: 0.4,\n },\n {\n x: 'Apr-17',\n y: 0.5,\n },\n {\n x: 'May-17',\n y: 0.9,\n },\n {\n x: 'Jun-17',\n y: 1.6,\n },\n {\n x: 'Jul-17',\n y: 2,\n },\n {\n x: 'Aug-17',\n y: 4,\n },\n {\n x: 'Sep-17',\n y: 6.2,\n },\n {\n x: 'Oct-17',\n y: 8.2,\n },\n {\n x: 'Nov-17',\n y: 10.5,\n },\n {\n x: 'Dec-17',\n y: 10.1,\n },\n]\n\nconst version11 = [\n {\n x: 'Jan-17',\n y: 0,\n },\n {\n x: 'Feb-17',\n y: 0,\n },\n {\n x: 'Mar-17',\n y: 0,\n },\n {\n x: 'Apr-17',\n y: 0,\n },\n {\n x: 'May-17',\n y: 0,\n },\n {\n x: 'Jun-17',\n y: 0,\n },\n {\n x: 'Jul-17',\n y: 0.2,\n },\n {\n x: 'Aug-17',\n y: 0.5,\n },\n {\n x: 'Sep-17',\n y: 0.8,\n },\n {\n x: 'Oct-17',\n y: 4.9,\n },\n {\n x: 'Nov-17',\n y: 11.4,\n },\n {\n x: 'Dec-17',\n y: 14,\n },\n]\n\nconst version12 = [\n {\n x: 'Jan-17',\n y: 0,\n },\n {\n x: 'Feb-17',\n y: 0,\n },\n {\n x: 'Mar-17',\n y: 0,\n },\n {\n x: 'Apr-17',\n y: 0,\n },\n {\n x: 'May-17',\n y: 0,\n },\n {\n x: 'Jun-17',\n y: 0,\n },\n {\n x: 'Jul-17',\n y: 0,\n },\n {\n x: 'Aug-17',\n y: 0,\n },\n {\n x: 'Sep-17',\n y: 0.3,\n },\n {\n x: 'Oct-17',\n y: 0.8,\n },\n {\n x: 'Nov-17',\n y: 3.2,\n },\n {\n x: 'Dec-17',\n y: 7.5,\n },\n]\n\nconst axisX = xyChart\n .getDefaultAxisX()\n .setMouseInteractions(false)\n .setScrollStrategy(undefined)\n // Disable default ticks.\n .setTickStrategy(AxisTickStrategies.Empty)\n\n// Create Custom Axis\nlet customAxisX = (data, index) => {\n axisX\n .addCustomTick()\n .setValue(index)\n .setGridStrokeLength(0)\n .setTextFormatter((_) => data[index].x)\n}\n\n// Generate Chart\nconst generateChart = (data, area, createTicks) => {\n data.map((p, index) => ({ x: index, y: p.y })).forEach((point, index) => {\n area.add(point)\n if (createTicks) {\n customAxisX(data, index)\n }\n })\n}\n\n// generating different layered for charts\ngenerateChart(version1, V1Area, true)\ngenerateChart(version2, V2Area)\ngenerateChart(version3, V3Area)\ngenerateChart(version4, V4Area)\ngenerateChart(version5, V5Area)\ngenerateChart(version6, V6Area)\ngenerateChart(version7, V7Area)\ngenerateChart(version8, V8Area)\ngenerateChart(version9, V9Area)\ngenerateChart(version10, V10Area)\ngenerateChart(version11, V11Area)\ngenerateChart(version12, V12Area)\n\n// Enable AutoCursor auto-fill.\nxyChart.setAutoCursor((cursor) => cursor.setResultTableAutoTextStyle(false).setTickMarkerXVisible(false))\n\nxyChart\n .getDefaultAxisY()\n .setTitle('Percentage')\n .setScrollStrategy(undefined)\n .setInterval({ start: 0, end: 50, stopAxisAfter: false })\n .setMouseInteractions(false)\n","url":null,"readme":"_Also known as a Layered Area Graph, Layered Area Chart or Multiple Area Charts_\n\nLayers mean individual slices of information (series) which can be stacked to create your composition of multiple series within the same chart view using overlapping.\n\nIn this example, layered area chart is basically multiple areas layered by either making use of transparency or perspective. It can be used instead of a multiple **_LineSeries_** to compare development of a trend, to search patterns and relationships both within a collection and across collections over the period.\n","image":"layeredAreas"},{"id":"lcjs-example-0104-stackedMountains","title":"JavaScript Stacked Mountains Chart","tags":["area","xy","date-time"],"description":"Stacked Charts are a popular visual aid for comparing parts of a whole. Also known as Stacked Area Graph or Stacked Areas.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Area charts for Scientific use, dynamic charts, High-Performance Charts, 2D JS charts with area graphs.","src":"/*\n * LightningChartJS example that showcases stacked mountains chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, AutoCursorModes, Themes } = lcjs\n\n// Create a XY Chart.\nconst xyChart = lightningChart().ChartXY({\n // theme: Themes.darkGold\n})\n\n// Set up the Chart, disable zooming and panning mouse interactions\n// and set AutoCursor to show when hovering mouse over Series.\nxyChart.setTitle('Product Version Distribution').setMouseInteractions(false).setAutoCursorMode(AutoCursorModes.onHover)\n\n// Set up the X and Y Axes for the chart.\nxyChart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setInterval({\n start: new Date(2017, 0, 1).getTime(),\n end: new Date(2018, 3, 1).getTime(),\n })\n .setMouseInteractions(false)\n\nxyChart.getDefaultAxisY().setTitle('Distribution %').setInterval({ start: 0, end: 100, stopAxisAfter: false }).setMouseInteractions(false)\n\n// ---- Add multiple series with different names and values. ----\nconst versionName = [\n 'Version 1',\n 'Version 2',\n 'Version 3',\n 'Version 4',\n 'Version 5',\n 'Version 6',\n 'Version 7',\n 'Version 8',\n 'Version 9',\n 'Version 10',\n 'Version 11',\n 'Version 12',\n]\n// Array to store the created Area Series.\nconst version = []\n// Create Series for each version name.\nversionName.forEach((v, k) => {\n // The first version (data) is drawn at the bottom of the chart, so we can just use a Area Series to render it.\n if (k == 0) {\n version[k] = xyChart.addAreaSeries().setName(v)\n } else {\n // Rest of the versions (data) are drawn based on the version before, so we'll use Area Range Series to render it.\n version[k] = xyChart.addAreaRangeSeries().setName(v)\n }\n // Set up how to display the Result Table.\n version[k].setCursorResultTableFormatter((builder, series, xValue, yValueHigh, yValueLow) => {\n return builder\n .addRow(v)\n .addRow('Date: ' + series.axisX.formatValue(xValue))\n .addRow('Distribution: ' + (yValueHigh - yValueLow).toFixed(2) + '%')\n })\n})\n// Create data for each Version.\nconst data = [\n [\n { x: new Date(2017, 0, 1).getTime(), y: 1.3 },\n { x: new Date(2017, 1, 1).getTime(), y: 1.2 },\n { x: new Date(2017, 2, 1).getTime(), y: 1.1 },\n { x: new Date(2017, 3, 1).getTime(), y: 1.1 },\n { x: new Date(2017, 4, 1).getTime(), y: 1 },\n { x: new Date(2017, 5, 1).getTime(), y: 0.9 },\n { x: new Date(2017, 6, 1).getTime(), y: 0.8 },\n { x: new Date(2017, 7, 1).getTime(), y: 0.8 },\n { x: new Date(2017, 8, 1).getTime(), y: 0.7 },\n { x: new Date(2017, 9, 1).getTime(), y: 0.7 },\n { x: new Date(2017, 10, 1).getTime(), y: 0.6 },\n { x: new Date(2017, 11, 1).getTime(), y: 0.6 },\n { x: new Date(2018, 0, 1).getTime(), y: 0.5 },\n { x: new Date(2018, 1, 1).getTime(), y: 0.5 },\n { x: new Date(2018, 2, 1).getTime(), y: 0.5 },\n { x: new Date(2018, 3, 1).getTime(), y: 0.4 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 4.9 },\n { x: new Date(2017, 1, 1).getTime(), y: 4.5 },\n { x: new Date(2017, 2, 1).getTime(), y: 4.2 },\n { x: new Date(2017, 3, 1).getTime(), y: 4 },\n { x: new Date(2017, 4, 1).getTime(), y: 3.7 },\n { x: new Date(2017, 5, 1).getTime(), y: 3.5 },\n { x: new Date(2017, 6, 1).getTime(), y: 3.3 },\n { x: new Date(2017, 7, 1).getTime(), y: 3.1 },\n { x: new Date(2017, 8, 1).getTime(), y: 2.9 },\n { x: new Date(2017, 9, 1).getTime(), y: 2.7 },\n { x: new Date(2017, 10, 1).getTime(), y: 2.5 },\n { x: new Date(2017, 11, 1).getTime(), y: 2.3 },\n { x: new Date(2018, 0, 1).getTime(), y: 2.2 },\n { x: new Date(2018, 1, 1).getTime(), y: 2 },\n { x: new Date(2018, 2, 1).getTime(), y: 1.9 },\n { x: new Date(2018, 3, 1).getTime(), y: 1.7 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 6.8 },\n { x: new Date(2017, 1, 1).getTime(), y: 6.4 },\n { x: new Date(2017, 2, 1).getTime(), y: 5.9 },\n { x: new Date(2017, 3, 1).getTime(), y: 5.7 },\n { x: new Date(2017, 4, 1).getTime(), y: 5.4 },\n { x: new Date(2017, 5, 1).getTime(), y: 5.2 },\n { x: new Date(2017, 6, 1).getTime(), y: 4.8 },\n { x: new Date(2017, 7, 1).getTime(), y: 4.4 },\n { x: new Date(2017, 8, 1).getTime(), y: 4.1 },\n { x: new Date(2017, 9, 1).getTime(), y: 3.9 },\n { x: new Date(2017, 10, 1).getTime(), y: 3.5 },\n { x: new Date(2017, 11, 1).getTime(), y: 3.3 },\n { x: new Date(2018, 0, 1).getTime(), y: 3.1 },\n { x: new Date(2018, 1, 1).getTime(), y: 3 },\n { x: new Date(2018, 2, 1).getTime(), y: 2.9 },\n { x: new Date(2018, 3, 1).getTime(), y: 2.6 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 3 },\n { x: new Date(2017, 1, 1).getTime(), y: 2.2 },\n { x: new Date(2017, 2, 1).getTime(), y: 1.7 },\n { x: new Date(2017, 3, 1).getTime(), y: 1.6 },\n { x: new Date(2017, 4, 1).getTime(), y: 1.5 },\n { x: new Date(2017, 5, 1).getTime(), y: 1.5 },\n { x: new Date(2017, 6, 1).getTime(), y: 1.3 },\n { x: new Date(2017, 7, 1).getTime(), y: 1.3 },\n { x: new Date(2017, 8, 1).getTime(), y: 1.2 },\n { x: new Date(2017, 9, 1).getTime(), y: 1.1 },\n { x: new Date(2017, 10, 1).getTime(), y: 1 },\n { x: new Date(2017, 11, 1).getTime(), y: 1 },\n { x: new Date(2018, 0, 1).getTime(), y: 0.9 },\n { x: new Date(2018, 1, 1).getTime(), y: 0.9 },\n { x: new Date(2018, 2, 1).getTime(), y: 0.8 },\n { x: new Date(2018, 3, 1).getTime(), y: 0.7 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 25.2 },\n { x: new Date(2017, 1, 1).getTime(), y: 24.5 },\n { x: new Date(2017, 2, 1).getTime(), y: 23.5 },\n { x: new Date(2017, 3, 1).getTime(), y: 21.9 },\n { x: new Date(2017, 4, 1).getTime(), y: 20.8 },\n { x: new Date(2017, 5, 1).getTime(), y: 20.5 },\n { x: new Date(2017, 6, 1).getTime(), y: 19.5 },\n { x: new Date(2017, 7, 1).getTime(), y: 18.6 },\n { x: new Date(2017, 8, 1).getTime(), y: 17.6 },\n { x: new Date(2017, 9, 1).getTime(), y: 16.5 },\n { x: new Date(2017, 10, 1).getTime(), y: 15.3 },\n { x: new Date(2017, 11, 1).getTime(), y: 14.7 },\n { x: new Date(2018, 0, 1).getTime(), y: 13.8 },\n { x: new Date(2018, 1, 1).getTime(), y: 13.4 },\n { x: new Date(2018, 2, 1).getTime(), y: 12.8 },\n { x: new Date(2018, 3, 1).getTime(), y: 11.7 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 11.3 },\n { x: new Date(2017, 1, 1).getTime(), y: 10.8 },\n { x: new Date(2017, 2, 1).getTime(), y: 10.1 },\n { x: new Date(2017, 3, 1).getTime(), y: 9.8 },\n { x: new Date(2017, 4, 1).getTime(), y: 9.4 },\n { x: new Date(2017, 5, 1).getTime(), y: 9.2 },\n { x: new Date(2017, 6, 1).getTime(), y: 8.7 },\n { x: new Date(2017, 7, 1).getTime(), y: 8.2 },\n { x: new Date(2017, 8, 1).getTime(), y: 7.8 },\n { x: new Date(2017, 9, 1).getTime(), y: 7.4 },\n { x: new Date(2017, 10, 1).getTime(), y: 7.1 },\n { x: new Date(2017, 11, 1).getTime(), y: 6.7 },\n { x: new Date(2018, 0, 1).getTime(), y: 6.4 },\n { x: new Date(2018, 1, 1).getTime(), y: 6.1 },\n { x: new Date(2018, 2, 1).getTime(), y: 5.7 },\n { x: new Date(2018, 3, 1).getTime(), y: 5.4 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 22.8 },\n { x: new Date(2017, 1, 1).getTime(), y: 23.2 },\n { x: new Date(2017, 2, 1).getTime(), y: 23.3 },\n { x: new Date(2017, 3, 1).getTime(), y: 23.2 },\n { x: new Date(2017, 4, 1).getTime(), y: 23.1 },\n { x: new Date(2017, 5, 1).getTime(), y: 23 },\n { x: new Date(2017, 6, 1).getTime(), y: 23.3 },\n { x: new Date(2017, 7, 1).getTime(), y: 22.6 },\n { x: new Date(2017, 8, 1).getTime(), y: 22.3 },\n { x: new Date(2017, 9, 1).getTime(), y: 21.8 },\n { x: new Date(2017, 10, 1).getTime(), y: 21.7 },\n { x: new Date(2017, 11, 1).getTime(), y: 21.2 },\n { x: new Date(2018, 0, 1).getTime(), y: 20.8 },\n { x: new Date(2018, 1, 1).getTime(), y: 20.2 },\n { x: new Date(2018, 2, 1).getTime(), y: 19.8 },\n { x: new Date(2018, 3, 1).getTime(), y: 19.2 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 24 },\n { x: new Date(2017, 1, 1).getTime(), y: 26.8 },\n { x: new Date(2017, 2, 1).getTime(), y: 29.5 },\n { x: new Date(2017, 3, 1).getTime(), y: 30.7 },\n { x: new Date(2017, 4, 1).getTime(), y: 31.3 },\n { x: new Date(2017, 5, 1).getTime(), y: 31.2 },\n { x: new Date(2017, 6, 1).getTime(), y: 31.2 },\n { x: new Date(2017, 7, 1).getTime(), y: 31.2 },\n { x: new Date(2017, 8, 1).getTime(), y: 31.8 },\n { x: new Date(2017, 9, 1).getTime(), y: 32.3 },\n { x: new Date(2017, 10, 1).getTime(), y: 32.2 },\n { x: new Date(2017, 11, 1).getTime(), y: 32 },\n { x: new Date(2018, 0, 1).getTime(), y: 30.9 },\n { x: new Date(2018, 1, 1).getTime(), y: 29.7 },\n { x: new Date(2018, 2, 1).getTime(), y: 28.6 },\n { x: new Date(2018, 3, 1).getTime(), y: 28.8 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 0.7 },\n { x: new Date(2017, 1, 1).getTime(), y: 0.4 },\n { x: new Date(2017, 2, 1).getTime(), y: 0.5 },\n { x: new Date(2017, 3, 1).getTime(), y: 1.7 },\n { x: new Date(2017, 4, 1).getTime(), y: 3.4 },\n { x: new Date(2017, 5, 1).getTime(), y: 4.6 },\n { x: new Date(2017, 6, 1).getTime(), y: 6.6 },\n { x: new Date(2017, 7, 1).getTime(), y: 9.1 },\n { x: new Date(2017, 8, 1).getTime(), y: 10.6 },\n { x: new Date(2017, 9, 1).getTime(), y: 12.3 },\n { x: new Date(2017, 10, 1).getTime(), y: 14.4 },\n { x: new Date(2017, 11, 1).getTime(), y: 16 },\n { x: new Date(2018, 0, 1).getTime(), y: 17.8 },\n { x: new Date(2018, 1, 1).getTime(), y: 19.3 },\n { x: new Date(2018, 2, 1).getTime(), y: 21.1 },\n { x: new Date(2018, 3, 1).getTime(), y: 22.3 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 0 },\n { x: new Date(2017, 1, 1).getTime(), y: 0 },\n { x: new Date(2017, 2, 1).getTime(), y: 0.2 },\n { x: new Date(2017, 3, 1).getTime(), y: 0.3 },\n { x: new Date(2017, 4, 1).getTime(), y: 0.4 },\n { x: new Date(2017, 5, 1).getTime(), y: 0.4 },\n { x: new Date(2017, 6, 1).getTime(), y: 0.5 },\n { x: new Date(2017, 7, 1).getTime(), y: 0.7 },\n { x: new Date(2017, 8, 1).getTime(), y: 1 },\n { x: new Date(2017, 9, 1).getTime(), y: 1.3 },\n { x: new Date(2017, 10, 1).getTime(), y: 1.7 },\n { x: new Date(2017, 11, 1).getTime(), y: 2 },\n { x: new Date(2018, 0, 1).getTime(), y: 3.3 },\n { x: new Date(2018, 1, 1).getTime(), y: 4.4 },\n { x: new Date(2018, 2, 1).getTime(), y: 5.2 },\n { x: new Date(2018, 3, 1).getTime(), y: 6.1 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 0 },\n { x: new Date(2017, 1, 1).getTime(), y: 0 },\n { x: new Date(2017, 2, 1).getTime(), y: 0 },\n { x: new Date(2017, 3, 1).getTime(), y: 0 },\n { x: new Date(2017, 4, 1).getTime(), y: 0 },\n { x: new Date(2017, 5, 1).getTime(), y: 0 },\n { x: new Date(2017, 6, 1).getTime(), y: 0 },\n { x: new Date(2017, 7, 1).getTime(), y: 0 },\n { x: new Date(2017, 8, 1).getTime(), y: 0 },\n { x: new Date(2017, 9, 1).getTime(), y: 0 },\n { x: new Date(2017, 10, 1).getTime(), y: 0 },\n { x: new Date(2017, 11, 1).getTime(), y: 0.2 },\n { x: new Date(2018, 0, 1).getTime(), y: 0.3 },\n { x: new Date(2018, 1, 1).getTime(), y: 0.5 },\n { x: new Date(2018, 2, 1).getTime(), y: 0.5 },\n { x: new Date(2018, 3, 1).getTime(), y: 0.8 },\n ],\n [\n { x: new Date(2017, 0, 1).getTime(), y: 0 },\n { x: new Date(2017, 1, 1).getTime(), y: 0 },\n { x: new Date(2017, 2, 1).getTime(), y: 0 },\n { x: new Date(2017, 3, 1).getTime(), y: 0 },\n { x: new Date(2017, 4, 1).getTime(), y: 0 },\n { x: new Date(2017, 5, 1).getTime(), y: 0 },\n { x: new Date(2017, 6, 1).getTime(), y: 0 },\n { x: new Date(2017, 7, 1).getTime(), y: 0 },\n { x: new Date(2017, 8, 1).getTime(), y: 0 },\n { x: new Date(2017, 9, 1).getTime(), y: 0 },\n { x: new Date(2017, 10, 1).getTime(), y: 0 },\n { x: new Date(2017, 11, 1).getTime(), y: 0 },\n { x: new Date(2018, 0, 1).getTime(), y: 0 },\n { x: new Date(2018, 1, 1).getTime(), y: 0 },\n { x: new Date(2018, 2, 1).getTime(), y: 0.2 },\n { x: new Date(2018, 3, 1).getTime(), y: 0.3 },\n ],\n]\n\n// Function to get the proper High value for a Series.\nconst getYHigh = (p, k) => {\n let sum = 0\n while (p >= 0) {\n sum += data[p][k].y\n p--\n }\n return sum\n}\n\n// Function to get the proper Low value for a Series.\nconst getYLow = (p, k) => {\n let sum = 0\n while (p - 1 >= 0) {\n sum += data[p - 1][k].y\n p--\n }\n return sum\n}\n\n/**\n * Fill each Area Series with the data created for them.\n */\ndata[0].forEach((point, i) => {\n version.forEach((series, index) => {\n // For the first series, only one Y value is needed.\n if (index == 0) {\n version[index].add({\n x: point.x,\n y: point.y,\n })\n // Rest of the series need both the High and Low values;\n // Low is the previous Series' High value.\n } else {\n version[index].add({\n position: point.x,\n high: getYHigh(index, i),\n low: getYLow(index, i),\n })\n }\n })\n})\n","url":null,"readme":"_Also known as Stacked Area Graph or Stacked Areas_\n\nThe stacked charts are a popular visual aid used for categorizing and comparing the parts of a whole using different colors to distinguish the categories.\n\nThis chart is created with custom stacking logic by using **_Area_** and **_AreaRange_** series and position each next data segment on top of the previous. Relying on characteristics and use cases of mountain series mentioned in previous examples, area is drawn on a Cartesian coordinate system and represents the quantitative data. Thus, in the example, the first data segment starts from a zero baseline and each next category would use the magnitude of previous segment as a low starting point.\n\n```javascript\n// Create one Area series to be the base.\nconst areaFirst = chart.addAreaSeries()\n\n// Create the next AreaRange series to be stacked on top of previous.\nconst areaNext1 = chart.addAreaRangeSeries()\nconst areaNext2 = chart.addAreaRangeSeries()\n```\n","image":"stackedMountains"},{"id":"lcjs-example-0105-temperatureVariations","title":"Temperature Variations JavaScript Chart","tags":["area","range","xy","date-time","legendbox"],"description":"The example shows the basic usage of Area Range series to display variation in temperature.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Area charts for Scientific use, dynamic charts, High-Performance Charts, 2D JS charts with area graphs.","src":"/*\n * LightningChartJS example that showcases a simulation of daily temperature variations.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, SolidFill, SolidLine, ColorRGBA, ColorHEX, LegendBoxBuilders, LinearGradientFill, Themes } =\n lcjs\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Daily temperature range, April 2019')\n\nconst axisX = chart.getDefaultAxisX()\nconst axisY = chart.getDefaultAxisY().setTitle('Temperature (°C)').setScrollStrategy(undefined)\n\n// Use DateTime TickStrategy and set the interval\naxisX.setTickStrategy(AxisTickStrategies.DateTime).setInterval({\n start: new Date(2019, 0, 1).getTime(),\n end: new Date(2019, 0, 31).getTime(),\n})\n\n// Daily temperature records\nconst recordRange = chart.addAreaRangeSeries()\n// Current month daily temperature variations\nconst currentRange = chart.addAreaRangeSeries()\n// ----- Series stylings\n// Temperature records fill style, gradient Red - Blue scale.\nconst recordRangeFillStyle = new LinearGradientFill({\n angle: 0,\n stops: [\n { color: ColorHEX('#0000FF9F'), offset: 0 },\n { color: ColorHEX('#FF00009F'), offset: 1 },\n ],\n})\n// Record range stroke fill style, high line\nconst recordRangeStrokeFillStyleHigh = new SolidLine().setFillStyle(new SolidFill({ color: ColorRGBA(250, 91, 70) }))\n// Record range stroke fill style, low line\nconst recordRangeStrokeFillStyleLow = new SolidLine().setFillStyle(new SolidFill({ color: ColorRGBA(63, 138, 250) }))\n// Current month temperature fill style\nconst currentRangeFillStyle = new SolidFill({ color: ColorRGBA(255, 174, 0, 200) })\n// Current range stroke fill style\nconst currentRangeStrokeFillStyle = new SolidLine().setFillStyle(new SolidFill({ color: ColorRGBA(250, 226, 105) }))\n// ----- Applying stylings\n// Record range\nrecordRange\n .setName('Temperature records range')\n .setHighFillStyle(recordRangeFillStyle)\n // Same fill style for the highlighted series\n .setHighStrokeStyle(recordRangeStrokeFillStyleHigh)\n .setLowStrokeStyle(recordRangeStrokeFillStyleLow)\n// Current range\ncurrentRange\n .setName('2019 temperatures')\n .setHighFillStyle(currentRangeFillStyle)\n .setHighStrokeStyle(currentRangeStrokeFillStyle)\n .setLowStrokeStyle(currentRangeStrokeFillStyle)\n\n// ----- Result tables settings\n// Record range\nrecordRange.setCursorResultTableFormatter((builder, series, figure, yMax, yMin) => {\n return builder\n .addRow('Temperature records range')\n .addRow('Date: ' + axisX.formatValue(figure))\n .addRow('Highest: ' + yMax.toFixed(2) + ' °C')\n .addRow('Lowest: ' + yMin.toFixed(2) + ' °C')\n})\n// Current range\ncurrentRange.setCursorResultTableFormatter((builder, series, figure, yMax, yMin) => {\n return builder\n .addRow('2019 temperatures')\n .addRow('Date: ' + axisX.formatValue(figure))\n .addRow('Highest: ' + yMax.toFixed(2) + ' °C')\n .addRow('Lowest: ' + yMin.toFixed(2) + ' °C')\n})\n// ----- Generating data\nconst randomInt = (min, max) => {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\nconst currentRangeData = []\nconst recordRangeData = []\n// Current range\nfor (let i = 0; i < 31; i++) {\n const randomPoint = () => {\n const x = new Date(2019, 0, i + 1).getTime()\n let yMax\n if (i > 0) {\n const previousYMax = currentRangeData[i - 1].yMax\n yMax = randomInt(previousYMax - 5, previousYMax + 5)\n } else {\n yMax = randomInt(-5, 25)\n }\n const yMin = randomInt(yMax - 5, yMax) - 5\n return {\n x,\n yMax,\n yMin,\n }\n }\n currentRangeData.push(randomPoint())\n}\n\nlet recordYMax = currentRangeData[0].yMax\nlet recordYMin = currentRangeData[0].yMin\nfor (let i = 1; i < currentRangeData.length; i++) {\n if (currentRangeData[i].yMin < recordYMin) recordYMin = currentRangeData[i].yMin\n if (currentRangeData[i].yMax > recordYMax) recordYMax = currentRangeData[i].yMax\n}\n// Set series interval\naxisY.setInterval({ start: recordYMin - 5, end: recordYMax + 5, stopAxisAfter: false })\n// ----- Generate record temperatures\nfor (let i = 0; i < 31; i++) {\n const randomPoint = () => {\n const x = new Date(2019, 0, i + 1).getTime()\n const yMax = randomInt(recordYMax - 2, recordYMax + 2)\n const yMin = randomInt(recordYMin - 1, recordYMin)\n return {\n x,\n yMax,\n yMin,\n }\n }\n recordRangeData.push(randomPoint())\n}\n// ----- Adding data points\nrecordRangeData.forEach((point, i) => {\n recordRange.add({ position: point.x, high: point.yMax, low: point.yMin })\n})\n\ncurrentRangeData.forEach((point, i) => {\n currentRange.add({ position: point.x, high: point.yMax, low: point.yMin })\n})\n// ----- Add legend box\nconst legendBox = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n\nlegendBox.add(chart)\n","url":null,"readme":"The example shows the basic usage of Area Range series to display variation in temperature.\n\nRange charts are generally used to show variations (low & high) simultaneously in the given period.\n\n```javascript\n// Create a new ChartXY.\nconst chart = lightningChart().ChartXY()\n\n// Add an area series with bipolar direction using default X and Y axes.\nconst areaRange = chart.addAreaRangeSeries()\n```\n\nThe series accepts **_AreaPoint_** type of points either as an object in format \n`{ position: number, high: number, low: number }`,\n\n```javascript\nseries.add({ position: 20, high: 45, low: -20 })\n```\n\nor via a factory that should be additionally imported.\n\n```javascript\nseries.add(AreaPoint(20, 45, -20))\n```\n\nAny number of points can be added with a single call.\n\n```javascript\n// Single point.\nseries.add({ position: 20, high: 45, low: -20 })\n\n// Multiple points at once.\nseries.add([\n { position: 20, high: 45, low: -20 },\n { position: 40, high: 95, low: 10 },\n { position: 60, high: 25, low: 60 },\n])\n```\n","image":"temperatureVariations"},{"id":"lcjs-example-0150-ecg","title":"JavaScript ECG Chart","tags":["line","xy","realtime","datapattern","datacleaning"],"description":"This example shows a simulated electrocardiogram(ECG)-signal by using a Line Series in a XY Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases a simulated ECG signal.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisScrollStrategies, Themes } = lcjs\n\n// Import data-generators from 'xydata'-library.\nconst { createSampledDataGenerator } = xydata\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('ECG')\n\n// Create line series optimized for regular progressive X data.\nconst series = chart\n .addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n // regularProgressiveStep: true => The X step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n })\n // Destroy automatically outscrolled data (old data becoming out of scrolling axis range).\n // Actual data cleaning can happen at any convenient time (not necessarily immediately when data goes out of range).\n .setDataCleaning({ minDataPointCount: 10000 })\n\n// Setup view nicely.\nchart\n .getDefaultAxisY()\n .setTitle('mV')\n .setInterval({ start: -1600, end: 1000, stopAxisAfter: false })\n .setScrollStrategy(AxisScrollStrategies.expansion)\n\nchart\n .getDefaultAxisX()\n .setTitle('milliseconds')\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 2500, stopAxisAfter: false }))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\n// Points that are used to generate a continuous stream of data.\nconst point = [\n { x: 2, y: 81 },\n { x: 3, y: 83 },\n { x: 4, y: 88 },\n { x: 5, y: 98 },\n { x: 6, y: 92 },\n { x: 7, y: 85 },\n { x: 8, y: 73 },\n { x: 9, y: 71 },\n { x: 10, y: 70 },\n { x: 11, y: 83 },\n { x: 12, y: 73 },\n { x: 13, y: 79 },\n { x: 14, y: 84 },\n { x: 15, y: 78 },\n { x: 16, y: 67 },\n { x: 17, y: 71 },\n { x: 18, y: 76 },\n { x: 19, y: 77 },\n { x: 20, y: 64 },\n { x: 21, y: 53 },\n { x: 22, y: 0 },\n { x: 23, y: 41 },\n { x: 24, y: 51 },\n { x: 25, y: 3 },\n { x: 26, y: 31 },\n { x: 27, y: 37 },\n { x: 28, y: 35 },\n { x: 29, y: 48 },\n { x: 30, y: 40 },\n { x: 31, y: 42 },\n { x: 32, y: 42 },\n { x: 33, y: 32 },\n { x: 34, y: 21 },\n { x: 35, y: 41 },\n { x: 36, y: 48 },\n { x: 37, y: 47 },\n { x: 38, y: 45 },\n { x: 39, y: 42 },\n { x: 40, y: 28 },\n { x: 41, y: 15 },\n { x: 42, y: 1 },\n { x: 43, y: -12 },\n { x: 44, y: -4 },\n { x: 45, y: 15 },\n { x: 46, y: 23 },\n { x: 47, y: 22 },\n { x: 48, y: 40 },\n { x: 49, y: 46 },\n { x: 50, y: 49 },\n { x: 51, y: 48 },\n { x: 52, y: 43 },\n { x: 53, y: 52 },\n { x: 54, y: 49 },\n { x: 55, y: 44 },\n { x: 56, y: 41 },\n { x: 57, y: 41 },\n { x: 58, y: 45 },\n { x: 59, y: 57 },\n { x: 60, y: 67 },\n { x: 61, y: 65 },\n { x: 62, y: 58 },\n { x: 63, y: 47 },\n { x: 64, y: 34 },\n { x: 65, y: 35 },\n { x: 66, y: 23 },\n { x: 67, y: 11 },\n { x: 68, y: 7 },\n { x: 69, y: 14 },\n { x: 70, y: 23 },\n { x: 71, y: 18 },\n { x: 72, y: 31 },\n { x: 73, y: 35 },\n { x: 74, y: 44 },\n { x: 75, y: 49 },\n { x: 76, y: 34 },\n { x: 77, y: 7 },\n { x: 78, y: -3 },\n { x: 79, y: -8 },\n { x: 80, y: -11 },\n { x: 81, y: -20 },\n { x: 82, y: -28 },\n { x: 83, y: -4 },\n { x: 84, y: 15 },\n { x: 85, y: 20 },\n { x: 86, y: 26 },\n { x: 87, y: 26 },\n { x: 88, y: 24 },\n { x: 89, y: 34 },\n { x: 90, y: 35 },\n { x: 91, y: 30 },\n { x: 92, y: 22 },\n { x: 93, y: 12 },\n { x: 94, y: 15 },\n { x: 95, y: 18 },\n { x: 96, y: 24 },\n { x: 97, y: 18 },\n { x: 98, y: 26 },\n { x: 99, y: 25 },\n { x: 100, y: 13 },\n { x: 101, y: 2 },\n { x: 102, y: 1 },\n { x: 103, y: -10 },\n { x: 104, y: -10 },\n { x: 105, y: -4 },\n { x: 106, y: 8 },\n { x: 107, y: 15 },\n { x: 108, y: 15 },\n { x: 109, y: 15 },\n { x: 110, y: 15 },\n { x: 111, y: 18 },\n { x: 112, y: 19 },\n { x: 113, y: 3 },\n { x: 114, y: -12 },\n { x: 115, y: -14 },\n { x: 116, y: -10 },\n { x: 117, y: -22 },\n { x: 118, y: -24 },\n { x: 119, y: -29 },\n { x: 120, y: -21 },\n { x: 121, y: -19 },\n { x: 122, y: -26 },\n { x: 123, y: -9 },\n { x: 124, y: -10 },\n { x: 125, y: -6 },\n { x: 126, y: -8 },\n { x: 127, y: -31 },\n { x: 128, y: -52 },\n { x: 129, y: -57 },\n { x: 130, y: -40 },\n { x: 131, y: -20 },\n { x: 132, y: 7 },\n { x: 133, y: 14 },\n { x: 134, y: 10 },\n { x: 135, y: 6 },\n { x: 136, y: 12 },\n { x: 137, y: -5 },\n { x: 138, y: -2 },\n { x: 139, y: 9 },\n { x: 140, y: 23 },\n { x: 141, y: 36 },\n { x: 142, y: 52 },\n { x: 143, y: 61 },\n { x: 144, y: 56 },\n { x: 145, y: 48 },\n { x: 146, y: 48 },\n { x: 147, y: 38 },\n { x: 148, y: 29 },\n { x: 149, y: 33 },\n { x: 150, y: 20 },\n { x: 151, y: 1 },\n { x: 152, y: -7 },\n { x: 153, y: -9 },\n { x: 154, y: -4 },\n { x: 155, y: -12 },\n { x: 156, y: -3 },\n { x: 157, y: 5 },\n { x: 158, y: -3 },\n { x: 159, y: 12 },\n { x: 160, y: 6 },\n { x: 161, y: -10 },\n { x: 162, y: -2 },\n { x: 163, y: 15 },\n { x: 164, y: 17 },\n { x: 165, y: 21 },\n { x: 166, y: 22 },\n { x: 167, y: 15 },\n { x: 168, y: 16 },\n { x: 169, y: 1 },\n { x: 170, y: -2 },\n { x: 171, y: -9 },\n { x: 172, y: -16 },\n { x: 173, y: -18 },\n { x: 174, y: -15 },\n { x: 175, y: -4 },\n { x: 176, y: 0 },\n { x: 177, y: -1 },\n { x: 178, y: -1 },\n { x: 179, y: -3 },\n { x: 180, y: -12 },\n { x: 181, y: -15 },\n { x: 182, y: -13 },\n { x: 183, y: -16 },\n { x: 184, y: -29 },\n { x: 185, y: -34 },\n { x: 186, y: -28 },\n { x: 187, y: -29 },\n { x: 188, y: -27 },\n { x: 189, y: -25 },\n { x: 190, y: -25 },\n { x: 191, y: -33 },\n { x: 192, y: -38 },\n { x: 193, y: -36 },\n { x: 194, y: -12 },\n { x: 195, y: -7 },\n { x: 196, y: -20 },\n { x: 197, y: -21 },\n { x: 198, y: -14 },\n { x: 199, y: -7 },\n { x: 200, y: 7 },\n { x: 201, y: 14 },\n { x: 202, y: 18 },\n { x: 203, y: 28 },\n { x: 204, y: 27 },\n { x: 205, y: 38 },\n { x: 206, y: 33 },\n { x: 207, y: 24 },\n { x: 208, y: 20 },\n { x: 209, y: 15 },\n { x: 210, y: 6 },\n { x: 211, y: 0 },\n { x: 212, y: -2 },\n { x: 213, y: 2 },\n { x: 214, y: 0 },\n { x: 215, y: -2 },\n { x: 216, y: -12 },\n { x: 217, y: -10 },\n { x: 218, y: 20 },\n { x: 219, y: 41 },\n { x: 220, y: 35 },\n { x: 221, y: 27 },\n { x: 222, y: 12 },\n { x: 223, y: -1 },\n { x: 224, y: -15 },\n { x: 225, y: -20 },\n { x: 226, y: -23 },\n { x: 227, y: 0 },\n { x: 228, y: 24 },\n { x: 229, y: 36 },\n { x: 230, y: 52 },\n { x: 231, y: 61 },\n { x: 232, y: 67 },\n { x: 233, y: 73 },\n { x: 234, y: 88 },\n { x: 235, y: 85 },\n { x: 236, y: 71 },\n { x: 237, y: 74 },\n { x: 238, y: 67 },\n { x: 239, y: 41 },\n { x: 240, y: 26 },\n { x: 241, y: 13 },\n { x: 242, y: 10 },\n { x: 243, y: 1 },\n { x: 244, y: -10 },\n { x: 245, y: -26 },\n { x: 246, y: -33 },\n { x: 247, y: -23 },\n { x: 248, y: -25 },\n { x: 249, y: -24 },\n { x: 250, y: -24 },\n { x: 251, y: -28 },\n { x: 252, y: -24 },\n { x: 253, y: -25 },\n { x: 254, y: -21 },\n { x: 255, y: -8 },\n { x: 256, y: -5 },\n { x: 257, y: -4 },\n { x: 258, y: -13 },\n { x: 259, y: -29 },\n { x: 260, y: -42 },\n { x: 261, y: -52 },\n { x: 262, y: -52 },\n { x: 263, y: -40 },\n { x: 264, y: -40 },\n { x: 265, y: -34 },\n { x: 266, y: -28 },\n { x: 267, y: -30 },\n { x: 268, y: -37 },\n { x: 269, y: -40 },\n { x: 270, y: -38 },\n { x: 271, y: -41 },\n { x: 272, y: -39 },\n { x: 273, y: -46 },\n { x: 274, y: -48 },\n { x: 275, y: -48 },\n { x: 276, y: -40 },\n { x: 277, y: -40 },\n { x: 278, y: -45 },\n { x: 279, y: -57 },\n { x: 280, y: -61 },\n { x: 281, y: -63 },\n { x: 282, y: -78 },\n { x: 283, y: -81 },\n { x: 284, y: -87 },\n { x: 285, y: -82 },\n { x: 286, y: -88 },\n { x: 287, y: -100 },\n { x: 288, y: -100 },\n { x: 289, y: -97 },\n { x: 290, y: -104 },\n { x: 291, y: -102 },\n { x: 292, y: -79 },\n { x: 293, y: -72 },\n { x: 294, y: -72 },\n { x: 295, y: -63 },\n { x: 296, y: -35 },\n { x: 297, y: -22 },\n { x: 298, y: -10 },\n { x: 299, y: 2 },\n { x: 300, y: 5 },\n { x: 301, y: 9 },\n { x: 302, y: -10 },\n { x: 303, y: -16 },\n { x: 304, y: -16 },\n { x: 305, y: -10 },\n { x: 306, y: -4 },\n { x: 307, y: -1 },\n { x: 308, y: 2 },\n { x: 309, y: 14 },\n { x: 310, y: 21 },\n { x: 311, y: 23 },\n { x: 312, y: 17 },\n { x: 313, y: 13 },\n { x: 314, y: 10 },\n { x: 315, y: 0 },\n { x: 316, y: -6 },\n { x: 317, y: -5 },\n { x: 318, y: 11 },\n { x: 319, y: 22 },\n { x: 320, y: 28 },\n { x: 321, y: 31 },\n { x: 322, y: 33 },\n { x: 323, y: 29 },\n { x: 324, y: 26 },\n { x: 325, y: 27 },\n { x: 326, y: 28 },\n { x: 327, y: 26 },\n { x: 328, y: 35 },\n { x: 329, y: 44 },\n { x: 330, y: 52 },\n { x: 331, y: 80 },\n { x: 332, y: 100 },\n { x: 333, y: 101 },\n { x: 334, y: 111 },\n { x: 335, y: 120 },\n { x: 336, y: 128 },\n { x: 337, y: 150 },\n { x: 338, y: 174 },\n { x: 339, y: 201 },\n { x: 340, y: 232 },\n { x: 341, y: 278 },\n { x: 342, y: 350 },\n { x: 343, y: 422 },\n { x: 344, y: 510 },\n { x: 345, y: 580 },\n { x: 346, y: 662 },\n { x: 347, y: 738 },\n { x: 348, y: 806 },\n { x: 349, y: 869 },\n { x: 350, y: 907 },\n { x: 351, y: 939 },\n { x: 352, y: 954 },\n { x: 353, y: 971 },\n { x: 354, y: 961 },\n { x: 355, y: 912 },\n { x: 356, y: 826 },\n { x: 357, y: 713 },\n { x: 358, y: 553 },\n { x: 359, y: 382 },\n { x: 360, y: 166 },\n { x: 361, y: -56 },\n { x: 362, y: -275 },\n { x: 363, y: -518 },\n { x: 364, y: -824 },\n { x: 365, y: -1122 },\n { x: 366, y: -1325 },\n { x: 367, y: -1453 },\n { x: 368, y: -1507 },\n { x: 369, y: -1547 },\n { x: 370, y: -1568 },\n { x: 371, y: -1559 },\n { x: 372, y: -1553 },\n { x: 373, y: -1537 },\n { x: 374, y: -1499 },\n { x: 375, y: -1447 },\n { x: 376, y: -1424 },\n { x: 377, y: -1398 },\n { x: 378, y: -1352 },\n { x: 379, y: -1291 },\n { x: 380, y: -1189 },\n { x: 381, y: -1085 },\n { x: 382, y: -977 },\n { x: 383, y: -852 },\n { x: 384, y: -736 },\n { x: 385, y: -649 },\n { x: 386, y: -603 },\n { x: 387, y: -576 },\n { x: 388, y: -454 },\n { x: 389, y: -443 },\n { x: 390, y: -332 },\n { x: 391, y: -264 },\n { x: 392, y: -209 },\n { x: 393, y: -153 },\n { x: 394, y: -105 },\n { x: 395, y: -61 },\n { x: 396, y: -16 },\n { x: 397, y: 37 },\n { x: 398, y: 96 },\n { x: 399, y: 150 },\n { x: 400, y: 198 },\n { x: 401, y: 238 },\n { x: 402, y: 265 },\n { x: 403, y: 294 },\n { x: 404, y: 324 },\n { x: 405, y: 351 },\n { x: 406, y: 367 },\n { x: 407, y: 376 },\n { x: 408, y: 378 },\n { x: 409, y: 391 },\n { x: 410, y: 406 },\n { x: 411, y: 427 },\n { x: 412, y: 433 },\n { x: 413, y: 448 },\n { x: 414, y: 440 },\n { x: 415, y: 429 },\n { x: 416, y: 429 },\n { x: 417, y: 420 },\n { x: 418, y: 413 },\n { x: 419, y: 420 },\n { x: 420, y: 411 },\n { x: 421, y: 408 },\n { x: 422, y: 404 },\n { x: 423, y: 398 },\n { x: 424, y: 401 },\n { x: 425, y: 412 },\n { x: 426, y: 389 },\n { x: 427, y: 367 },\n { x: 428, y: 357 },\n { x: 429, y: 359 },\n { x: 430, y: 351 },\n { x: 431, y: 345 },\n { x: 432, y: 341 },\n { x: 433, y: 345 },\n { x: 434, y: 346 },\n { x: 435, y: 340 },\n { x: 436, y: 334 },\n { x: 437, y: 323 },\n { x: 438, y: 319 },\n { x: 439, y: 314 },\n { x: 440, y: 284 },\n { x: 441, y: 263 },\n { x: 442, y: 261 },\n { x: 443, y: 248 },\n { x: 444, y: 234 },\n { x: 445, y: 236 },\n { x: 446, y: 236 },\n { x: 447, y: 248 },\n { x: 448, y: 252 },\n { x: 449, y: 251 },\n { x: 450, y: 237 },\n { x: 451, y: 230 },\n { x: 452, y: 238 },\n { x: 453, y: 227 },\n { x: 454, y: 207 },\n { x: 455, y: 188 },\n { x: 456, y: 163 },\n { x: 457, y: 155 },\n { x: 458, y: 152 },\n { x: 459, y: 153 },\n { x: 460, y: 156 },\n { x: 461, y: 171 },\n { x: 462, y: 162 },\n { x: 463, y: 155 },\n { x: 464, y: 148 },\n { x: 465, y: 139 },\n { x: 466, y: 154 },\n { x: 467, y: 158 },\n { x: 468, y: 155 },\n { x: 469, y: 159 },\n { x: 470, y: 147 },\n { x: 471, y: 143 },\n { x: 472, y: 133 },\n { x: 473, y: 118 },\n { x: 474, y: 118 },\n { x: 475, y: 121 },\n { x: 476, y: 130 },\n { x: 477, y: 133 },\n { x: 478, y: 133 },\n { x: 479, y: 128 },\n { x: 480, y: 120 },\n { x: 481, y: 97 },\n { x: 482, y: 91 },\n { x: 483, y: 88 },\n { x: 484, y: 85 },\n { x: 485, y: 84 },\n { x: 486, y: 74 },\n { x: 487, y: 44 },\n { x: 488, y: 32 },\n { x: 489, y: 10 },\n { x: 490, y: -2 },\n { x: 491, y: -9 },\n { x: 492, y: -4 },\n { x: 493, y: -5 },\n { x: 494, y: 1 },\n { x: 495, y: 5 },\n { x: 496, y: 21 },\n { x: 497, y: 41 },\n { x: 498, y: 44 },\n { x: 499, y: 39 },\n { x: 500, y: 24 },\n { x: 501, y: 22 },\n { x: 502, y: 37 },\n { x: 503, y: 44 },\n { x: 504, y: 35 },\n { x: 505, y: 31 },\n { x: 506, y: 35 },\n { x: 507, y: 20 },\n { x: 508, y: 15 },\n { x: 509, y: 7 },\n { x: 510, y: 4 },\n { x: 511, y: 9 },\n { x: 512, y: 0 },\n { x: 513, y: -15 },\n { x: 514, y: -21 },\n { x: 515, y: -31 },\n { x: 516, y: -32 },\n { x: 517, y: -48 },\n { x: 518, y: -53 },\n { x: 519, y: -29 },\n { x: 520, y: -14 },\n { x: 521, y: -6 },\n { x: 522, y: 1 },\n { x: 523, y: 4 },\n { x: 524, y: -4 },\n { x: 525, y: -3 },\n { x: 526, y: 2 },\n { x: 527, y: 1 },\n { x: 528, y: -12 },\n { x: 529, y: -37 },\n { x: 530, y: -29 },\n { x: 531, y: -25 },\n { x: 532, y: -18 },\n { x: 533, y: -31 },\n { x: 534, y: -42 },\n { x: 535, y: -26 },\n { x: 536, y: -22 },\n { x: 537, y: -18 },\n { x: 538, y: -25 },\n { x: 539, y: -16 },\n { x: 540, y: -13 },\n { x: 541, y: -23 },\n { x: 542, y: -15 },\n { x: 543, y: 0 },\n { x: 544, y: 8 },\n { x: 545, y: 14 },\n { x: 546, y: 34 },\n { x: 547, y: 39 },\n { x: 548, y: 33 },\n { x: 549, y: 22 },\n { x: 550, y: 18 },\n { x: 551, y: 20 },\n { x: 552, y: 23 },\n { x: 553, y: 16 },\n { x: 554, y: 11 },\n { x: 555, y: 1 },\n { x: 556, y: 6 },\n { x: 557, y: 11 },\n { x: 558, y: 7 },\n { x: 559, y: 14 },\n { x: 560, y: 22 },\n { x: 561, y: 14 },\n { x: 562, y: 14 },\n { x: 563, y: 5 },\n { x: 564, y: -6 },\n { x: 565, y: -14 },\n { x: 566, y: -27 },\n { x: 567, y: -28 },\n { x: 568, y: -21 },\n { x: 569, y: -16 },\n { x: 570, y: -8 },\n { x: 571, y: -5 },\n { x: 572, y: -8 },\n { x: 573, y: 3 },\n { x: 574, y: 22 },\n { x: 575, y: 29 },\n { x: 576, y: 27 },\n { x: 577, y: 23 },\n { x: 578, y: 22 },\n { x: 579, y: 25 },\n { x: 580, y: 34 },\n { x: 581, y: 36 },\n { x: 582, y: 39 },\n { x: 583, y: 44 },\n { x: 584, y: 55 },\n { x: 585, y: 54 },\n { x: 586, y: 44 },\n { x: 587, y: 39 },\n { x: 588, y: 41 },\n { x: 589, y: 49 },\n { x: 590, y: 44 },\n { x: 591, y: 33 },\n { x: 592, y: 27 },\n { x: 593, y: 23 },\n { x: 594, y: 20 },\n { x: 595, y: 18 },\n { x: 596, y: 20 },\n { x: 597, y: 19 },\n { x: 598, y: 8 },\n { x: 599, y: 7 },\n { x: 600, y: 2 },\n { x: 601, y: 4 },\n { x: 602, y: -3 },\n { x: 603, y: -16 },\n { x: 604, y: -16 },\n { x: 605, y: -19 },\n { x: 606, y: -28 },\n { x: 607, y: -37 },\n { x: 608, y: -26 },\n { x: 609, y: -14 },\n { x: 610, y: -31 },\n { x: 611, y: -45 },\n { x: 612, y: -45 },\n { x: 613, y: -43 },\n { x: 614, y: -50 },\n { x: 615, y: -59 },\n { x: 616, y: -73 },\n { x: 617, y: -79 },\n { x: 618, y: -88 },\n { x: 619, y: -92 },\n { x: 620, y: -95 },\n { x: 621, y: -101 },\n { x: 622, y: -104 },\n { x: 623, y: -124 },\n { x: 624, y: -150 },\n { x: 625, y: -152 },\n { x: 626, y: -153 },\n { x: 627, y: -174 },\n { x: 628, y: -205 },\n { x: 629, y: -215 },\n { x: 630, y: -211 },\n { x: 631, y: -214 },\n { x: 632, y: -211 },\n { x: 633, y: -222 },\n { x: 634, y: -218 },\n { x: 635, y: -211 },\n { x: 636, y: -200 },\n { x: 637, y: -200 },\n { x: 638, y: -196 },\n { x: 639, y: -184 },\n { x: 640, y: -189 },\n { x: 641, y: -202 },\n { x: 642, y: -203 },\n { x: 643, y: -202 },\n { x: 644, y: -200 },\n { x: 645, y: -205 },\n { x: 646, y: -211 },\n { x: 647, y: -226 },\n { x: 648, y: -241 },\n { x: 649, y: -242 },\n { x: 650, y: -252 },\n { x: 651, y: -273 },\n { x: 652, y: -279 },\n { x: 653, y: -288 },\n { x: 654, y: -291 },\n { x: 655, y: -289 },\n { x: 656, y: -286 },\n { x: 657, y: -269 },\n { x: 658, y: -266 },\n { x: 659, y: -280 },\n { x: 660, y: -287 },\n { x: 661, y: -277 },\n { x: 662, y: -260 },\n { x: 663, y: -271 },\n { x: 664, y: -269 },\n { x: 665, y: -271 },\n { x: 666, y: -287 },\n { x: 667, y: -299 },\n { x: 668, y: -297 },\n { x: 669, y: -288 },\n { x: 670, y: -287 },\n { x: 671, y: -287 },\n { x: 672, y: -289 },\n { x: 673, y: -287 },\n { x: 674, y: -286 },\n { x: 675, y: -276 },\n { x: 676, y: -271 },\n { x: 677, y: -266 },\n { x: 678, y: -260 },\n { x: 679, y: -252 },\n { x: 680, y: -236 },\n { x: 681, y: -223 },\n { x: 682, y: -215 },\n { x: 683, y: -213 },\n { x: 684, y: -224 },\n { x: 685, y: -230 },\n { x: 686, y: -220 },\n { x: 687, y: -209 },\n { x: 688, y: -207 },\n { x: 689, y: -194 },\n { x: 690, y: -182 },\n { x: 691, y: -181 },\n { x: 692, y: -186 },\n { x: 693, y: -189 },\n { x: 694, y: -186 },\n { x: 695, y: -174 },\n { x: 696, y: -167 },\n { x: 697, y: -161 },\n { x: 698, y: -158 },\n { x: 699, y: -155 },\n { x: 700, y: -153 },\n { x: 701, y: -139 },\n { x: 702, y: -135 },\n { x: 703, y: -130 },\n { x: 704, y: -129 },\n { x: 705, y: -116 },\n { x: 706, y: -107 },\n { x: 707, y: -98 },\n { x: 708, y: -84 },\n { x: 709, y: -85 },\n { x: 710, y: -92 },\n { x: 711, y: -100 },\n { x: 712, y: -105 },\n { x: 713, y: -97 },\n { x: 714, y: -81 },\n { x: 715, y: -72 },\n { x: 716, y: -58 },\n { x: 717, y: -49 },\n { x: 718, y: -35 },\n { x: 719, y: -33 },\n { x: 720, y: -28 },\n { x: 721, y: -13 },\n { x: 722, y: -7 },\n { x: 723, y: -9 },\n { x: 724, y: -6 },\n { x: 725, y: 10 },\n { x: 726, y: 22 },\n { x: 727, y: 16 },\n { x: 728, y: 5 },\n { x: 729, y: -12 },\n { x: 730, y: -12 },\n { x: 731, y: 1 },\n { x: 732, y: 6 },\n { x: 733, y: 17 },\n { x: 734, y: 41 },\n { x: 735, y: 52 },\n { x: 736, y: 54 },\n { x: 737, y: 57 },\n { x: 738, y: 63 },\n { x: 739, y: 81 },\n { x: 740, y: 96 },\n { x: 741, y: 107 },\n { x: 742, y: 118 },\n { x: 743, y: 133 },\n { x: 744, y: 123 },\n { x: 745, y: 121 },\n { x: 746, y: 129 },\n { x: 747, y: 128 },\n { x: 748, y: 127 },\n { x: 749, y: 112 },\n { x: 750, y: 89 },\n { x: 751, y: 0 },\n { x: 752, y: 123 },\n { x: 753, y: 42 },\n { x: 754, y: 98 },\n { x: 755, y: 109 },\n { x: 756, y: 109 },\n { x: 757, y: 108 },\n { x: 758, y: 113 },\n { x: 759, y: 121 },\n { x: 760, y: 119 },\n { x: 761, y: 119 },\n { x: 762, y: 114 },\n { x: 763, y: 112 },\n { x: 764, y: 109 },\n { x: 765, y: 107 },\n { x: 766, y: 105 },\n { x: 767, y: 114 },\n { x: 768, y: 122 },\n { x: 769, y: 130 },\n { x: 770, y: 134 },\n { x: 771, y: 121 },\n { x: 772, y: 113 },\n { x: 773, y: 100 },\n { x: 774, y: 94 },\n { x: 775, y: 114 },\n { x: 776, y: 112 },\n { x: 777, y: 108 },\n { x: 778, y: 116 },\n { x: 779, y: 114 },\n { x: 780, y: 112 },\n { x: 781, y: 118 },\n { x: 782, y: 119 },\n { x: 783, y: 116 },\n { x: 784, y: 109 },\n { x: 785, y: 110 },\n { x: 786, y: 108 },\n { x: 787, y: 113 },\n { x: 788, y: 116 },\n { x: 789, y: 118 },\n { x: 790, y: 107 },\n { x: 791, y: 103 },\n { x: 792, y: 109 },\n { x: 793, y: 110 },\n { x: 794, y: 103 },\n { x: 795, y: 106 },\n { x: 796, y: 104 },\n { x: 797, y: 93 },\n { x: 798, y: 86 },\n { x: 799, y: 77 },\n { x: 800, y: 83 },\n { x: 801, y: 87 },\n { x: 802, y: 80 },\n { x: 803, y: 95 },\n { x: 804, y: 100 },\n { x: 805, y: 88 },\n { x: 806, y: 102 },\n { x: 807, y: 87 },\n { x: 808, y: 77 },\n { x: 809, y: 88 },\n { x: 810, y: 81 },\n { x: 811, y: 71 },\n { x: 812, y: 59 },\n { x: 813, y: 61 },\n { x: 814, y: 67 },\n { x: 815, y: 76 },\n { x: 816, y: 91 },\n { x: 817, y: 94 },\n { x: 818, y: 93 },\n { x: 819, y: 89 },\n { x: 820, y: 94 },\n { x: 821, y: 98 },\n { x: 822, y: 103 },\n { x: 823, y: 95 },\n { x: 824, y: 83 },\n { x: 825, y: 89 },\n { x: 826, y: 88 },\n { x: 827, y: 96 },\n { x: 828, y: 97 },\n { x: 829, y: 97 },\n { x: 830, y: 92 },\n { x: 831, y: 88 },\n { x: 832, y: 86 },\n { x: 833, y: 84 },\n { x: 834, y: 84 },\n { x: 835, y: 76 },\n { x: 836, y: 65 },\n { x: 837, y: 52 },\n { x: 838, y: 45 },\n { x: 839, y: 47 },\n { x: 840, y: 36 },\n { x: 841, y: 33 },\n { x: 842, y: 46 },\n { x: 843, y: 46 },\n { x: 844, y: 57 },\n { x: 845, y: 53 },\n { x: 846, y: 52 },\n { x: 847, y: 56 },\n { x: 848, y: 61 },\n { x: 849, y: 64 },\n { x: 850, y: 65 },\n { x: 851, y: 59 },\n { x: 852, y: 55 },\n { x: 853, y: 60 },\n { x: 854, y: 59 },\n { x: 855, y: 61 },\n { x: 856, y: 55 },\n { x: 857, y: 51 },\n { x: 858, y: 48 },\n { x: 859, y: 46 },\n { x: 860, y: 49 },\n { x: 861, y: 47 },\n { x: 862, y: 46 },\n { x: 863, y: 44 },\n { x: 864, y: 43 },\n { x: 865, y: 46 },\n { x: 866, y: 47 },\n { x: 867, y: 45 },\n { x: 868, y: 28 },\n { x: 869, y: 17 },\n { x: 870, y: 20 },\n { x: 871, y: 24 },\n { x: 872, y: 22 },\n { x: 873, y: 38 },\n { x: 874, y: 29 },\n { x: 875, y: 23 },\n { x: 876, y: 23 },\n { x: 877, y: 9 },\n { x: 878, y: 1 },\n { x: 879, y: 15 },\n { x: 880, y: 32 },\n { x: 881, y: 38 },\n { x: 882, y: 37 },\n { x: 883, y: 38 },\n { x: 884, y: 31 },\n { x: 885, y: 18 },\n { x: 886, y: 11 },\n { x: 887, y: 5 },\n { x: 888, y: 5 },\n { x: 889, y: -1 },\n { x: 890, y: -6 },\n { x: 891, y: -8 },\n { x: 892, y: -6 },\n { x: 893, y: 5 },\n { x: 894, y: 14 },\n { x: 895, y: 8 },\n { x: 896, y: 21 },\n { x: 897, y: 35 },\n { x: 898, y: 35 },\n { x: 899, y: 32 },\n { x: 900, y: 26 },\n { x: 901, y: 28 },\n { x: 902, y: 26 },\n { x: 903, y: 24 },\n { x: 904, y: 23 },\n { x: 905, y: 28 },\n { x: 906, y: 26 },\n { x: 907, y: 27 },\n { x: 908, y: 23 },\n { x: 909, y: 32 },\n { x: 910, y: 30 },\n { x: 911, y: 19 },\n { x: 912, y: 16 },\n { x: 913, y: 25 },\n { x: 914, y: 32 },\n { x: 915, y: 20 },\n { x: 916, y: 12 },\n { x: 917, y: 8 },\n { x: 918, y: 7 },\n { x: 919, y: 14 },\n { x: 920, y: 14 },\n { x: 921, y: 11 },\n { x: 922, y: 15 },\n { x: 923, y: 4 },\n { x: 924, y: -5 },\n { x: 925, y: -3 },\n { x: 926, y: -3 },\n { x: 927, y: -11 },\n { x: 928, y: -2 },\n { x: 929, y: 18 },\n { x: 930, y: 11 },\n { x: 931, y: -2 },\n { x: 932, y: 1 },\n { x: 933, y: -9 },\n { x: 934, y: -21 },\n { x: 935, y: -13 },\n { x: 936, y: -16 },\n { x: 937, y: -4 },\n { x: 938, y: 15 },\n { x: 939, y: 31 },\n { x: 940, y: 55 },\n { x: 941, y: 52 },\n { x: 942, y: 35 },\n { x: 943, y: 23 },\n { x: 944, y: 24 },\n { x: 945, y: 20 },\n { x: 946, y: 19 },\n { x: 947, y: 18 },\n { x: 948, y: 13 },\n { x: 949, y: 6 },\n { x: 950, y: 7 },\n { x: 951, y: 12 },\n { x: 952, y: 12 },\n { x: 953, y: 3 },\n { x: 954, y: 2 },\n { x: 955, y: -4 },\n { x: 956, y: -11 },\n { x: 957, y: -12 },\n { x: 958, y: -9 },\n { x: 959, y: -17 },\n { x: 960, y: -6 },\n { x: 961, y: 1 },\n { x: 962, y: -2 },\n { x: 963, y: -6 },\n { x: 964, y: -18 },\n { x: 965, y: -17 },\n { x: 966, y: -14 },\n { x: 967, y: -13 },\n { x: 968, y: -11 },\n { x: 969, y: 9 },\n { x: 970, y: 9 },\n { x: 971, y: 2 },\n { x: 972, y: -2 },\n { x: 973, y: -14 },\n { x: 974, y: -27 },\n { x: 975, y: -24 },\n { x: 976, y: -16 },\n { x: 977, y: -10 },\n { x: 978, y: -3 },\n { x: 979, y: 2 },\n { x: 980, y: 7 },\n { x: 981, y: 16 },\n { x: 982, y: 29 },\n { x: 983, y: 40 },\n { x: 984, y: 47 },\n { x: 985, y: 46 },\n { x: 986, y: 30 },\n { x: 987, y: 19 },\n { x: 988, y: 20 },\n { x: 989, y: 21 },\n { x: 990, y: 22 },\n { x: 991, y: 12 },\n { x: 992, y: 0 },\n { x: 993, y: -6 },\n { x: 994, y: -6 },\n { x: 995, y: -11 },\n { x: 996, y: -9 },\n { x: 997, y: -5 },\n { x: 998, y: -9 },\n { x: 999, y: -15 },\n { x: 1000, y: -18 },\n { x: 1001, y: -21 },\n { x: 1002, y: -19 },\n { x: 1003, y: -27 },\n { x: 1004, y: -31 },\n { x: 1005, y: -32 },\n { x: 1006, y: -35 },\n { x: 1007, y: -31 },\n { x: 1008, y: -26 },\n { x: 1009, y: -26 },\n { x: 1010, y: -19 },\n { x: 1011, y: -6 },\n { x: 1012, y: 0 },\n { x: 1013, y: -3 },\n { x: 1014, y: -16 },\n { x: 1015, y: -16 },\n { x: 1016, y: -3 },\n { x: 1017, y: 5 },\n { x: 1018, y: 13 },\n { x: 1019, y: 6 },\n { x: 1020, y: 9 },\n { x: 1021, y: 18 },\n { x: 1022, y: 40 },\n { x: 1023, y: 54 },\n { x: 1024, y: 64 },\n { x: 1025, y: 68 },\n { x: 1026, y: 57 },\n { x: 1027, y: 47 },\n { x: 1028, y: 41 },\n { x: 1029, y: 41 },\n { x: 1030, y: 50 },\n { x: 1031, y: 54 },\n { x: 1032, y: 35 },\n { x: 1033, y: 33 },\n { x: 1034, y: 33 },\n { x: 1035, y: 27 },\n { x: 1036, y: 26 },\n { x: 1037, y: 19 },\n { x: 1038, y: 16 },\n { x: 1039, y: 28 },\n { x: 1040, y: 44 },\n { x: 1041, y: 38 },\n { x: 1042, y: 42 },\n { x: 1043, y: 57 },\n { x: 1044, y: 61 },\n { x: 1045, y: 65 },\n { x: 1046, y: 55 },\n { x: 1047, y: 45 },\n { x: 1048, y: 33 },\n { x: 1049, y: 21 },\n { x: 1050, y: 11 },\n { x: 1051, y: 5 },\n { x: 1052, y: -14 },\n { x: 1053, y: -30 },\n { x: 1054, y: -35 },\n { x: 1055, y: -31 },\n { x: 1056, y: -32 },\n { x: 1057, y: -33 },\n { x: 1058, y: -25 },\n { x: 1059, y: -19 },\n { x: 1060, y: -18 },\n { x: 1061, y: -30 },\n { x: 1062, y: -42 },\n { x: 1063, y: -38 },\n { x: 1064, y: -44 },\n { x: 1065, y: -49 },\n { x: 1066, y: -43 },\n { x: 1067, y: -41 },\n { x: 1068, y: -30 },\n { x: 1069, y: -26 },\n { x: 1070, y: -29 },\n { x: 1071, y: -33 },\n { x: 1072, y: -53 },\n { x: 1073, y: -58 },\n { x: 1074, y: -58 },\n { x: 1075, y: -45 },\n { x: 1076, y: -37 },\n { x: 1077, y: -39 },\n { x: 1078, y: -51 },\n { x: 1079, y: -50 },\n { x: 1080, y: -52 },\n { x: 1081, y: -53 },\n { x: 1082, y: -36 },\n { x: 1083, y: -27 },\n { x: 1084, y: -29 },\n { x: 1085, y: -24 },\n { x: 1086, y: -27 },\n { x: 1087, y: -34 },\n { x: 1088, y: -46 },\n { x: 1089, y: -49 },\n { x: 1090, y: -42 },\n { x: 1091, y: -50 },\n { x: 1092, y: -49 },\n { x: 1093, y: -50 },\n { x: 1094, y: -42 },\n { x: 1095, y: -35 },\n { x: 1096, y: -24 },\n { x: 1097, y: -33 },\n { x: 1098, y: -40 },\n { x: 1099, y: -36 },\n { x: 1100, y: -37 },\n { x: 1101, y: -38 },\n { x: 1102, y: -51 },\n { x: 1103, y: -61 },\n { x: 1104, y: -67 },\n { x: 1105, y: -75 },\n { x: 1106, y: -81 },\n { x: 1107, y: -70 },\n { x: 1108, y: -66 },\n { x: 1109, y: -71 },\n { x: 1110, y: -72 },\n { x: 1111, y: -57 },\n { x: 1112, y: -48 },\n { x: 1113, y: -40 },\n { x: 1114, y: -31 },\n { x: 1115, y: 0 },\n { x: 1116, y: 31 },\n { x: 1117, y: -63 },\n { x: 1118, y: -16 },\n { x: 1119, y: -22 },\n { x: 1120, y: -30 },\n { x: 1121, y: -36 },\n { x: 1122, y: -37 },\n { x: 1123, y: -42 },\n { x: 1124, y: -40 },\n { x: 1125, y: -47 },\n { x: 1126, y: -38 },\n { x: 1127, y: -5 },\n { x: 1128, y: 2 },\n { x: 1129, y: -9 },\n { x: 1130, y: -2 },\n { x: 1131, y: 7 },\n { x: 1132, y: 11 },\n { x: 1133, y: 12 },\n { x: 1134, y: 22 },\n { x: 1135, y: 26 },\n { x: 1136, y: 29 },\n { x: 1137, y: 21 },\n { x: 1138, y: 25 },\n { x: 1139, y: 32 },\n { x: 1140, y: 35 },\n { x: 1141, y: 36 },\n { x: 1142, y: 48 },\n { x: 1143, y: 74 },\n { x: 1144, y: 79 },\n { x: 1145, y: 78 },\n { x: 1146, y: 92 },\n { x: 1147, y: 108 },\n { x: 1148, y: 120 },\n { x: 1149, y: 143 },\n { x: 1150, y: 172 },\n { x: 1151, y: 201 },\n { x: 1152, y: 232 },\n { x: 1153, y: 285 },\n { x: 1154, y: 363 },\n { x: 1155, y: 447 },\n { x: 1156, y: 514 },\n { x: 1157, y: 573 },\n { x: 1158, y: 663 },\n { x: 1159, y: 754 },\n { x: 1160, y: 815 },\n { x: 1161, y: 859 },\n { x: 1162, y: 895 },\n { x: 1163, y: 940 },\n { x: 1164, y: 977 },\n { x: 1165, y: 972 },\n { x: 1166, y: 945 },\n { x: 1167, y: 898 },\n { x: 1168, y: 808 },\n { x: 1169, y: 686 },\n { x: 1170, y: 532 },\n { x: 1171, y: 360 },\n { x: 1172, y: 167 },\n { x: 1173, y: -33 },\n { x: 1174, y: -232 },\n { x: 1175, y: -472 },\n { x: 1176, y: -766 },\n { x: 1177, y: -1082 },\n { x: 1178, y: -1295 },\n { x: 1179, y: -1438 },\n { x: 1180, y: -1509 },\n { x: 1181, y: -1567 },\n { x: 1182, y: -1594 },\n { x: 1183, y: -1583 },\n { x: 1184, y: -1569 },\n { x: 1185, y: -1547 },\n { x: 1186, y: -1504 },\n { x: 1187, y: -1457 },\n { x: 1188, y: -1432 },\n { x: 1189, y: -1403 },\n { x: 1190, y: -1335 },\n { x: 1191, y: -1249 },\n { x: 1192, y: -1157 },\n { x: 1193, y: -1058 },\n { x: 1194, y: -957 },\n { x: 1195, y: -835 },\n { x: 1196, y: -733 },\n { x: 1197, y: -650 },\n { x: 1198, y: -567 },\n { x: 1199, y: -508 },\n { x: 1200, y: -446 },\n { x: 1201, y: -378 },\n { x: 1202, y: -304 },\n { x: 1203, y: -240 },\n { x: 1204, y: -180 },\n { x: 1205, y: -123 },\n { x: 1206, y: -63 },\n { x: 1207, y: -11 },\n { x: 1208, y: 46 },\n { x: 1209, y: 112 },\n { x: 1210, y: 181 },\n { x: 1211, y: 221 },\n { x: 1212, y: 256 },\n { x: 1213, y: 283 },\n { x: 1214, y: 318 },\n { x: 1215, y: 348 },\n { x: 1216, y: 371 },\n { x: 1217, y: 397 },\n { x: 1218, y: 410 },\n { x: 1219, y: 409 },\n { x: 1220, y: 424 },\n { x: 1221, y: 440 },\n { x: 1222, y: 443 },\n { x: 1223, y: 429 },\n { x: 1224, y: 420 },\n { x: 1225, y: 424 },\n { x: 1226, y: 429 },\n { x: 1227, y: 415 },\n { x: 1228, y: 394 },\n { x: 1229, y: 391 },\n { x: 1230, y: 402 },\n { x: 1231, y: 410 },\n { x: 1232, y: 410 },\n { x: 1233, y: 408 },\n { x: 1234, y: 408 },\n { x: 1235, y: 405 },\n { x: 1236, y: 399 },\n { x: 1237, y: 392 },\n { x: 1238, y: 383 },\n { x: 1239, y: 376 },\n { x: 1240, y: 375 },\n { x: 1241, y: 368 },\n { x: 1242, y: 366 },\n { x: 1243, y: 363 },\n { x: 1244, y: 353 },\n { x: 1245, y: 345 },\n { x: 1246, y: 334 },\n { x: 1247, y: 326 },\n { x: 1248, y: 317 },\n { x: 1249, y: 313 },\n { x: 1250, y: 320 },\n { x: 1251, y: 318 },\n { x: 1252, y: 300 },\n { x: 1253, y: 275 },\n { x: 1254, y: 262 },\n { x: 1255, y: 252 },\n { x: 1256, y: 239 },\n { x: 1257, y: 236 },\n { x: 1258, y: 231 },\n { x: 1259, y: 236 },\n { x: 1260, y: 240 },\n { x: 1261, y: 235 },\n { x: 1262, y: 222 },\n { x: 1263, y: 220 },\n { x: 1264, y: 223 },\n { x: 1265, y: 228 },\n { x: 1266, y: 222 },\n { x: 1267, y: 205 },\n { x: 1268, y: 197 },\n { x: 1269, y: 191 },\n { x: 1270, y: 180 },\n { x: 1271, y: 185 },\n { x: 1272, y: 174 },\n { x: 1273, y: 170 },\n { x: 1274, y: 166 },\n { x: 1275, y: 161 },\n { x: 1276, y: 151 },\n { x: 1277, y: 148 },\n { x: 1278, y: 142 },\n { x: 1279, y: 136 },\n { x: 1280, y: 131 },\n { x: 1281, y: 127 },\n { x: 1282, y: 118 },\n { x: 1283, y: 111 },\n { x: 1284, y: 114 },\n { x: 1285, y: 110 },\n { x: 1286, y: 97 },\n { x: 1287, y: 85 },\n { x: 1288, y: 72 },\n { x: 1289, y: 65 },\n { x: 1290, y: 61 },\n { x: 1291, y: 62 },\n { x: 1292, y: 64 },\n { x: 1293, y: 61 },\n { x: 1294, y: 59 },\n { x: 1295, y: 56 },\n { x: 1296, y: 64 },\n { x: 1297, y: 55 },\n { x: 1298, y: 56 },\n { x: 1299, y: 73 },\n { x: 1300, y: 63 },\n { x: 1301, y: 56 },\n { x: 1302, y: 54 },\n { x: 1303, y: 35 },\n { x: 1304, y: 12 },\n { x: 1305, y: -3 },\n { x: 1306, y: -2 },\n { x: 1307, y: -9 },\n { x: 1308, y: -15 },\n { x: 1309, y: -13 },\n { x: 1310, y: 1 },\n { x: 1311, y: 27 },\n { x: 1312, y: 48 },\n { x: 1313, y: 53 },\n { x: 1314, y: 55 },\n { x: 1315, y: 54 },\n { x: 1316, y: 27 },\n { x: 1317, y: 20 },\n { x: 1318, y: 14 },\n { x: 1319, y: 10 },\n { x: 1320, y: 3 },\n { x: 1321, y: 9 },\n { x: 1322, y: 21 },\n { x: 1323, y: 15 },\n { x: 1324, y: 9 },\n { x: 1325, y: 5 },\n { x: 1326, y: 0 },\n { x: 1327, y: 0 },\n { x: 1328, y: -1 },\n { x: 1329, y: 3 },\n { x: 1330, y: 4 },\n { x: 1331, y: 2 },\n { x: 1332, y: -4 },\n { x: 1333, y: -5 },\n { x: 1334, y: -12 },\n { x: 1335, y: -14 },\n { x: 1336, y: -20 },\n { x: 1337, y: -23 },\n { x: 1338, y: -21 },\n { x: 1339, y: -20 },\n { x: 1340, y: -28 },\n { x: 1341, y: -25 },\n { x: 1342, y: -25 },\n { x: 1343, y: -30 },\n { x: 1344, y: -34 },\n { x: 1345, y: -43 },\n { x: 1346, y: -39 },\n { x: 1347, y: -36 },\n { x: 1348, y: -44 },\n { x: 1349, y: -28 },\n { x: 1350, y: -22 },\n { x: 1351, y: -11 },\n { x: 1352, y: -12 },\n { x: 1353, y: -7 },\n { x: 1354, y: -14 },\n { x: 1355, y: -11 },\n { x: 1356, y: -13 },\n { x: 1357, y: -19 },\n { x: 1358, y: -19 },\n { x: 1359, y: -13 },\n { x: 1360, y: 4 },\n { x: 1361, y: 19 },\n { x: 1362, y: 16 },\n { x: 1363, y: 19 },\n { x: 1364, y: 21 },\n { x: 1365, y: 22 },\n { x: 1366, y: 5 },\n { x: 1367, y: -12 },\n { x: 1368, y: -27 },\n { x: 1369, y: -24 },\n { x: 1370, y: -16 },\n { x: 1371, y: -15 },\n { x: 1372, y: -2 },\n { x: 1373, y: 8 },\n { x: 1374, y: -1 },\n { x: 1375, y: -7 },\n { x: 1376, y: -1 },\n { x: 1377, y: 12 },\n { x: 1378, y: 26 },\n { x: 1379, y: 27 },\n { x: 1380, y: 32 },\n { x: 1381, y: 27 },\n { x: 1382, y: 19 },\n { x: 1383, y: 22 },\n { x: 1384, y: 30 },\n { x: 1385, y: 36 },\n { x: 1386, y: 38 },\n { x: 1387, y: 43 },\n { x: 1388, y: 46 },\n { x: 1389, y: 40 },\n { x: 1390, y: 35 },\n { x: 1391, y: 27 },\n { x: 1392, y: 24 },\n { x: 1393, y: 23 },\n { x: 1394, y: 16 },\n { x: 1395, y: 7 },\n { x: 1396, y: 7 },\n { x: 1397, y: 11 },\n { x: 1398, y: 16 },\n { x: 1399, y: 10 },\n { x: 1400, y: 6 },\n { x: 1401, y: 3 },\n { x: 1402, y: 3 },\n { x: 1403, y: 12 },\n { x: 1404, y: 12 },\n { x: 1405, y: 8 },\n { x: 1406, y: 5 },\n { x: 1407, y: 4 },\n { x: 1408, y: 4 },\n { x: 1409, y: 4 },\n { x: 1410, y: 12 },\n { x: 1411, y: 22 },\n { x: 1412, y: 9 },\n { x: 1413, y: 0 },\n { x: 1414, y: -6 },\n { x: 1415, y: -23 },\n { x: 1416, y: -25 },\n { x: 1417, y: -25 },\n { x: 1418, y: -31 },\n { x: 1419, y: -45 },\n { x: 1420, y: -51 },\n { x: 1421, y: -50 },\n { x: 1422, y: -46 },\n { x: 1423, y: -55 },\n { x: 1424, y: -59 },\n { x: 1425, y: -60 },\n { x: 1426, y: -63 },\n { x: 1427, y: -62 },\n { x: 1428, y: -62 },\n { x: 1429, y: -63 },\n { x: 1430, y: -75 },\n { x: 1431, y: -85 },\n { x: 1432, y: -92 },\n { x: 1433, y: -94 },\n { x: 1434, y: -87 },\n { x: 1435, y: -85 },\n { x: 1436, y: -77 },\n { x: 1437, y: -91 },\n { x: 1438, y: -106 },\n { x: 1439, y: -114 },\n { x: 1440, y: -121 },\n { x: 1441, y: -133 },\n { x: 1442, y: -146 },\n { x: 1443, y: -159 },\n { x: 1444, y: -168 },\n { x: 1445, y: -167 },\n { x: 1446, y: -179 },\n { x: 1447, y: -190 },\n { x: 1448, y: -200 },\n { x: 1449, y: -205 },\n { x: 1450, y: -210 },\n { x: 1451, y: -213 },\n { x: 1452, y: -210 },\n { x: 1453, y: -217 },\n { x: 1454, y: -219 },\n { x: 1455, y: -225 },\n { x: 1456, y: -239 },\n { x: 1457, y: -246 },\n { x: 1458, y: -257 },\n { x: 1459, y: -276 },\n { x: 1460, y: -298 },\n { x: 1461, y: -297 },\n { x: 1462, y: -305 },\n { x: 1463, y: -312 },\n { x: 1464, y: -305 },\n { x: 1465, y: -300 },\n { x: 1466, y: -312 },\n { x: 1467, y: -321 },\n { x: 1468, y: -318 },\n { x: 1469, y: -306 },\n { x: 1470, y: -302 },\n { x: 1471, y: -296 },\n { x: 1472, y: -297 },\n { x: 1473, y: -294 },\n { x: 1474, y: -287 },\n { x: 1475, y: -290 },\n { x: 1476, y: -301 },\n { x: 1477, y: -310 },\n { x: 1478, y: -312 },\n { x: 1479, y: 0 },\n { x: 1480, y: -265 },\n { x: 1481, y: -362 },\n { x: 1482, y: -303 },\n { x: 1483, y: -302 },\n { x: 1484, y: -293 },\n { x: 1485, y: -296 },\n { x: 1486, y: -295 },\n { x: 1487, y: -286 },\n { x: 1488, y: -291 },\n { x: 1489, y: -287 },\n { x: 1490, y: -268 },\n { x: 1491, y: -243 },\n { x: 1492, y: -231 },\n { x: 1493, y: -229 },\n { x: 1494, y: -228 },\n { x: 1495, y: -229 },\n { x: 1496, y: -236 },\n { x: 1497, y: -243 },\n { x: 1498, y: -242 },\n { x: 1499, y: -217 },\n { x: 1500, y: -206 },\n { x: 1501, y: -199 },\n { x: 1502, y: -189 },\n { x: 1503, y: -187 },\n { x: 1504, y: -178 },\n { x: 1505, y: -163 },\n { x: 1506, y: -152 },\n { x: 1507, y: -150 },\n { x: 1508, y: -149 },\n { x: 1509, y: -144 },\n { x: 1510, y: -137 },\n { x: 1511, y: -121 },\n { x: 1512, y: -119 },\n { x: 1513, y: -132 },\n { x: 1514, y: -126 },\n { x: 1515, y: -123 },\n { x: 1516, y: -104 },\n { x: 1517, y: -96 },\n { x: 1518, y: -97 },\n { x: 1519, y: -82 },\n { x: 1520, y: -56 },\n { x: 1521, y: -42 },\n { x: 1522, y: -47 },\n { x: 1523, y: -40 },\n { x: 1524, y: -33 },\n { x: 1525, y: -37 },\n { x: 1526, y: -43 },\n { x: 1527, y: -51 },\n { x: 1528, y: -51 },\n { x: 1529, y: -35 },\n { x: 1530, y: -19 },\n { x: 1531, y: -12 },\n { x: 1532, y: -11 },\n { x: 1533, y: -9 },\n { x: 1534, y: -2 },\n { x: 1535, y: 12 },\n { x: 1536, y: 24 },\n { x: 1537, y: 24 },\n { x: 1538, y: 32 },\n { x: 1539, y: 42 },\n { x: 1540, y: 39 },\n { x: 1541, y: 45 },\n { x: 1542, y: 55 },\n { x: 1543, y: 43 },\n { x: 1544, y: 42 },\n { x: 1545, y: 45 },\n { x: 1546, y: 46 },\n { x: 1547, y: 51 },\n { x: 1548, y: 58 },\n { x: 1549, y: 61 },\n { x: 1550, y: 57 },\n { x: 1551, y: 55 },\n { x: 1552, y: 46 },\n { x: 1553, y: 29 },\n { x: 1554, y: 23 },\n { x: 1555, y: 24 },\n { x: 1556, y: 21 },\n { x: 1557, y: 27 },\n { x: 1558, y: 45 },\n { x: 1559, y: 56 },\n { x: 1560, y: 79 },\n { x: 1561, y: 102 },\n { x: 1562, y: 103 },\n { x: 1563, y: 114 },\n { x: 1564, y: 129 },\n { x: 1565, y: 116 },\n { x: 1566, y: 112 },\n { x: 1567, y: 127 },\n { x: 1568, y: 130 },\n { x: 1569, y: 135 },\n { x: 1570, y: 143 },\n { x: 1571, y: 144 },\n { x: 1572, y: 157 },\n { x: 1573, y: 153 },\n { x: 1574, y: 140 },\n { x: 1575, y: 135 },\n { x: 1576, y: 129 },\n { x: 1577, y: 111 },\n { x: 1578, y: 103 },\n { x: 1579, y: 106 },\n { x: 1580, y: 108 },\n { x: 1581, y: 94 },\n { x: 1582, y: 96 },\n { x: 1583, y: 89 },\n { x: 1584, y: 85 },\n { x: 1585, y: 89 },\n { x: 1586, y: 94 },\n { x: 1587, y: 82 },\n]\n// Create a data generator to supply a continuous stream of data.\ncreateSampledDataGenerator(point, 1, 10)\n .setSamplingFrequency(1)\n .setInputData(point)\n .generate()\n .setStreamBatchSize(48)\n .setStreamInterval(50)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => {\n // Push the created points to the series.\n series.add({ x: point.timestamp, y: point.data.y })\n })\n","url":null,"readme":"This example shows a simulated ECG-signal by using a Line Series in a XY Chart.\n\nThe simulated signal pushes 960 points per second to the chart.\n\nECG stands for electrocardiogram which is a simple test that can be used to check heart's rhythm and electrical activity.\n","image":"ecg"},{"id":"lcjs-example-0300-verticalBars","title":"JavaScript Vertical Bar Chart","tags":["bar"],"description":"Bar Charts show discrete numerical comparisons across categories, where the value represents the height of a bar. Also known as Bar Graph, Column Chart or Column Graph.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/**\n * Basic example of LightningChart JS Bar Charts.\n */\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, BarChartTypes, BarChartSorting, SolidFill, Themes } = lcjs\n\nconst lc = lightningChart()\nconst barChart = lc\n .BarChart({\n type: BarChartTypes.Vertical,\n // theme: Themes.darkGold,\n })\n .setSorting(BarChartSorting.Disabled)\n\nconst theme = barChart.getTheme()\n\nbarChart.valueAxis.setTitle('Electricity consumption change (%)')\n\nconst data = [\n { category: 'Jan', value: 20 },\n { category: 'Feb', value: 20 },\n { category: 'Mar', value: -25 },\n { category: 'Apr', value: 40 },\n { category: 'May', value: 28 },\n { category: 'Jun', value: -23 },\n { category: 'Jul', value: -40 },\n { category: 'Aug', value: 35 },\n { category: 'Sep', value: 17 },\n { category: 'Oct', value: 24 },\n { category: 'Nov', value: -29 },\n { category: 'Dec', value: 15 },\n]\nbarChart.setData(data)\n\nbarChart.getBars().forEach((bar) =>\n bar.setFillStyle(\n new SolidFill({\n color:\n bar.value > 0\n ? theme.examples.badGoodColorPalette[0]\n : theme.examples.badGoodColorPalette[theme.examples.badGoodColorPalette.length - 1],\n }),\n ),\n)\n","url":null,"readme":"_Also known as Bar Graph, Column Chart or Column Graph_\n\nThis example shows the most basic usage of LightningChart JS `BarChart`.\nBar Charts show discrete numerical comparisons across categories, where the value represents the height of a bar.\nLightningChart JS includes a very simple high level feature for creating interactive Bar Charts and supplying them with categorical data:\n\n```ts\nconst barChart = lightningChart().BarChart()\nconst data = [\n { category: 'Jan', value: 20 },\n { category: 'Feb', value: 20 },\n { category: 'Mar', value: -25 },\n { category: 'Apr', value: 40 },\n { category: 'May', value: 28 },\n { category: 'Jun', value: -23 },\n { category: 'Jul', value: -40 },\n { category: 'Aug', value: 35 },\n { category: 'Sep', value: 17 },\n { category: 'Oct', value: 24 },\n { category: 'Nov', value: -29 },\n { category: 'Dec', value: 15 },\n]\nbarChart.setData(data)\n```\n\n[More Bar Chart examples](https://lightningchart.com/lightningchart-js-interactive-examples/search.html?t=bar).\n","image":"verticalBars"},{"id":"lcjs-example-0301-horizontalBars","title":"JavaScript Horizontal Bar Chart","tags":["bar"],"description":"Horizontal variant of a Bar Chart. Also known as Bar Graph, Column Chart or Column Graph.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/**\n * Example of a horizontal BarChart with LightningChart JS.\n */\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, BarChartTypes, BarChartSorting, AxisScrollStrategies, Themes } = lcjs\n\nconst lc = lightningChart()\nconst barChart = lc\n .BarChart({\n type: BarChartTypes.Horizontal,\n // theme: Themes.darkGold\n })\n .setTitle('Global temperatures')\n .setSorting(BarChartSorting.Descending)\n\nbarChart.valueAxis.setTitle('Temperature °C').setInterval({ end: 35 }).setScrollStrategy(AxisScrollStrategies.expansion)\n\nconst data = [\n { category: 'Helsinki', value: 19.1 },\n { category: 'New York', value: 20.6 },\n { category: 'London', value: 16.6 },\n { category: 'Tokyo', value: 26.5 },\n { category: 'Oslo', value: 16.3 },\n { category: 'Barcelona', value: 23.7 },\n { category: 'Berlin', value: 18.0 },\n { category: 'Chicago', value: 21.4 },\n { category: 'Beijing', value: 22.4 },\n { category: 'Kathmandu', value: 29.8 },\n { category: 'Kyiv', value: 23.4 },\n { category: 'Singapore', value: 32.6 },\n { category: 'Stockholm', value: 17.2 },\n { category: 'Budapest', value: 21.8 },\n { category: 'Tallinn', value: 21.0 },\n]\nbarChart.setData(data)\n","url":null,"readme":"_Also known as Bar Graph, Column Chart or Column Graph_\n\nExample showing the Horizontal variant of LightningChart JS Bar Chart.\nRotating the Bar Chart is as simple as adding one parameter:\n\n```ts\nconst barChart = lc.BarChart({\n type: BarChartTypes.Horizontal,\n})\n```\n\nIn this example scenario, the Bar Chart is used to visualize the temperatures of different cities over the world.\nBuilt-in, automatic sorting is utilized to show the bars in order from hottest to coldest.\n","image":"horizontalBars"},{"id":"lcjs-example-0302-groupedBars","title":"JavaScript Grouped Bars Chart","tags":["bar","column","group","xy"],"description":"Grouped bars for better categorizing than normal bar chart. Also known as Multi-set and Clustered Bar Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChartJS example that showcases creation of a grouped bars chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, LegendBoxBuilders, AxisScrollStrategies, BarChartSorting, Themes } = lcjs\n\nconst barChart = lightningChart()\n .BarChart({\n // theme: Themes.darkGold\n })\n .setTitle('Grouped Bars (Employee Count)')\n .setValueLabels(undefined)\n .setCursorResultTableFormatter((builder, category, value, bar) => {\n builder.addRow('Department:', bar.subCategory).addRow('# of employees:', String(value))\n return builder\n })\n\nbarChart\n .setDataGrouped(\n ['Finland', 'Germany', 'UK'],\n [\n { subCategory: 'Engineers', values: [48, 27, 24] },\n { subCategory: 'Sales', values: [19, 40, 14] },\n { subCategory: 'Marketing', values: [33, 33, 62] },\n ],\n )\n .setSorting(BarChartSorting.None).set\n\nbarChart.valueAxis.setTitle('Number of Employees')\n\n// Add LegendBox.\nconst legend = barChart\n .addLegendBox(LegendBoxBuilders.VerticalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.2,\n })\n .setTitle('Department')\n\nlegend.add(barChart)\n","url":null,"readme":"_Also known as Multi-set / Clustered Bar Chart_\n\nThis example shows creation of a Grouped Bar Chart made on user side with BarChart.\nThis is a variation of normal Bar Chart where groups of bars are spaced apart from each other for further categorizing.\n\nHere's the creation of a Grouped Bar Chart using a pre-defined interface.\n\n```javascript\n// Create Chart.\nconst barChart = lightningChart().BarChart()\n\n// Add categories('Finland', 'Germany', 'UK) and subCategory & values.\nbarChart.setDataGrouped(\n ['Finland', 'Germany', 'UK'],\n [\n { subCategory: 'Engineers', values: [48, 27, 24] },\n { subCategory: 'Sales', values: [19, 40, 14] },\n { subCategory: 'Marketing', values: [33, 33, 62] },\n ],\n)\n```\n","image":"groupedBars","showNew":true},{"id":"lcjs-example-0303-spanChart","title":"JavaScript Span Chart","tags":["bar","xy"],"description":"Also known as a Range Bar, Column Graph, Floating Bar Graph, Difference Graph, High-Low Graph.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChartJS example that showcases creation of a Span-chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n SolidFill,\n ColorRGBA,\n emptyLine,\n emptyFill,\n AxisTickStrategies,\n SolidLine,\n UIOrigins,\n UIElementBuilders,\n UILayoutBuilders,\n UIDraggingModes,\n Themes,\n} = lcjs\n\nconst lc = lightningChart()\n\n// Titles for span\nconst titles = [\n 'Certificate exams',\n 'Interview',\n 'Trainee training program',\n 'Department competition training sessions',\n 'Internet security training',\n 'Scrum meeting',\n 'Development meeting',\n 'First Aid training',\n 'Conquering the silence - How to improve your marketing',\n]\n\n// Define an interface for creating span charts.\nlet spanChart\n// User side SpanChart logic.\n{\n spanChart = () => {\n // Create a XY-Chart and add a RectSeries to it for rendering rectangles.\n const chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Conference Room Reservations')\n .setMouseInteractions(false)\n .setAutoCursorMode(0)\n\n const axisX = chart\n .getDefaultAxisX()\n .setMouseInteractions(false)\n // Hide default ticks, instead rely on CustomTicks.\n .setTickStrategy(AxisTickStrategies.Empty)\n\n const axisY = chart\n .getDefaultAxisY()\n .setMouseInteractions(false)\n .setTitle('Conference Room')\n // Hide default ticks, instead rely on CustomTicks.\n .setTickStrategy(AxisTickStrategies.Empty)\n\n let y = 0\n for (let i = 8; i <= 20; i++) {\n const label = i > 12 ? i - 12 + 'PM' : i + 'AM'\n axisX\n .addCustomTick()\n .setValue(i)\n .setTickLength(4)\n .setGridStrokeLength(0)\n .setTextFormatter((_) => label)\n .setMarker((marker) => marker.setTextFillStyle(new SolidFill({ color: ColorRGBA(170, 170, 170) })))\n }\n\n const figureHeight = 10\n const figureThickness = 10\n const figureGap = figureThickness * 0.5\n const fitAxes = () => {\n // Custom fitting for some additional margins\n axisY.setInterval({ start: y, end: figureHeight * 0.5, stopAxisAfter: false })\n }\n\n let customYRange = figureHeight + figureGap * 1.6\n const addCategory = (category) => {\n const categoryY = y\n\n const addSpan = (i, min, max, index) => {\n // Add rect\n const rectDimensions = {\n x: min,\n y: categoryY - figureHeight,\n width: max - min,\n height: figureHeight,\n }\n // Add element for span labels\n const spanText = chart\n .addUIElement(UILayoutBuilders.Row, { x: axisX, y: axisY })\n .setOrigin(UIOrigins.Center)\n .setDraggingMode(UIDraggingModes.notDraggable)\n .setPosition({\n x: (min + max) / 2,\n y: rectDimensions.y + 5,\n })\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n\n spanText.addElement(\n UIElementBuilders.TextBox.addStyler((textBox) =>\n textBox\n .setTextFont((fontSettings) => fontSettings.setSize(13))\n .setText(titles[index])\n .setTextFillStyle(new SolidFill().setColor(ColorRGBA(255, 255, 255))),\n ),\n )\n if (index != i) {\n customYRange = customYRange + figureHeight + 1\n }\n fitAxes()\n // Return figure\n return chart.addRectangleSeries().add(rectDimensions)\n }\n\n // Add custom tick for category\n axisY\n .addCustomTick()\n .setValue(y - figureHeight * 0.5)\n .setGridStrokeLength(0)\n .setTextFormatter((_) => category)\n .setMarker((marker) => marker.setTextFillStyle(new SolidFill({ color: ColorRGBA(170, 170, 170) })))\n y -= figureHeight * 1.5\n\n fitAxes()\n // Return interface for category.\n return {\n addSpan,\n }\n }\n // Return interface for span chart.\n return {\n addCategory,\n }\n }\n}\n\n// Use the interface for example.\nconst chart = spanChart()\nconst categories = [\n '5 chair room',\n '5 chair room',\n '5 chair room',\n '10 chair room',\n '10 chair room',\n '20 chair room',\n 'Conference Hall',\n].map((name) => chart.addCategory(name))\nconst spans = [\n [\n [10, 13],\n [16, 18],\n ],\n [[8, 17]],\n [[12, 20]],\n [[9, 17]],\n [\n [10, 12],\n [15, 19],\n ],\n [[11, 16]],\n [[9, 18]],\n]\n\nlet index = 0\nspans.forEach((values, i) => {\n values.forEach((value, j) => {\n categories[i].addSpan(i, value[0], value[1], index)\n index = index + 1\n })\n})\n","url":null,"readme":"_Also known as a Range Bar, Column Graph, Floating Bar Graph, Difference Graph, High-Low Graph_\n\nThis example shows creation of a Span Chart made on user side by utilizing RectangleSeries. Span Charts display categorized value ranges - focusing only on the extreme values. Each category can have multiple 'spans'.\n\nHere's the creation of a Span Chart using a pre-defined interface.\n\n```javascript\n// Create Chart.\nconst chart = spanChart()\n// Add categories.\nconst tools = chart.addCategory('Tools')\nconst fools = chart.addCategory('Fools')\n// Add spans as min-max.\ntools.addSpan(100, 150)\nfools.addSpan(50, 75)\n\n// Adding a span returns the actual Figure that represents it, which can be styled.\nfools.addSpan(200, 250).setFillStyle(new SolidFill().setColor(prettyColor)).setStrokeStyle(emptyLine)\n```\n\nThe actual Span Chart logic just serves to provide a starting point for users to create their own API based on their needs and preferences. The functionality can be easily extended to construct **_Gantt Chart_**.\n","image":"spanChart"},{"id":"lcjs-example-0304-mosaicChart","title":"JavaScript Mosaic Chart","tags":["bar","xy"],"description":"Mosaic Chart can be used to compare observation counts of groups across different categories. Also known as Marimekko Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChartJS example for rendering a 'Mosaic chart'.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n SolidFill,\n ColorRGBA,\n emptyLine,\n emptyFill,\n UIElementBuilders,\n UIBackgrounds,\n UIOrigins,\n AxisTickStrategies,\n Themes,\n} = lcjs\n\nconst lc = lightningChart()\n\n// Define an interface for creating mosaic charts.\nlet mosaicChart\n// User side MosaicChart logic.\n{\n mosaicChart = () => {\n // Create a XY-Chart and add a RectSeries to it for rendering rectangles.\n const chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Controlled Group Testing')\n .setMouseInteractions(false)\n // Disable default AutoCursor\n .setAutoCursorMode(0)\n const rectangles = chart.addRectangleSeries()\n\n const bottomAxis = chart\n .getDefaultAxisX()\n .setInterval({ start: 0, end: 100, stopAxisAfter: false })\n .setScrollStrategy(undefined)\n .setMouseInteractions(false)\n .setTitle('%')\n const leftAxis = chart\n .getDefaultAxisY()\n .setInterval({ start: 0, end: 100, stopAxisAfter: false })\n .setMouseInteractions(false)\n // Hide default ticks of left Axis.\n .setTickStrategy(AxisTickStrategies.Empty)\n const rightAxis = chart\n .addAxisY({ opposite: true })\n .setInterval({ start: 0, end: 100, stopAxisAfter: false })\n .setScrollStrategy(undefined)\n .setMouseInteractions(false)\n .setTitle('%')\n const topAxis = chart\n .addAxisX({ opposite: true })\n .setInterval({ start: 0, end: 100, stopAxisAfter: false })\n .setMouseInteractions(false)\n // Hide default ticks of top Axis.\n .setTickStrategy(AxisTickStrategies.Empty)\n\n // Create marker for the top of each column.\n const categoryMarkerBuilder = UIElementBuilders.AxisTickMajor\n // Create text on top of each section.\n const subCategoryLabelBuilder = UIElementBuilders.TextBox\n // Style the label.\n .addStyler((label) =>\n label\n // Set the origin point and fillStyle (color) for the label.\n .setOrigin(UIOrigins.Center)\n .setTextFillStyle(new SolidFill().setColor(ColorRGBA(255, 255, 255)))\n .setMouseInteractions(false)\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine)),\n )\n\n const categories = []\n const yCategories = []\n const subCategories = []\n let margin = 0.1\n\n // Recreate rectangle figures from scratch.\n const _updateChart = () => {\n // Remove already existing figures.\n rectangles.clear()\n // Make new figures from each category.\n const sumCategoryValues = categories.reduce((prev, cur) => prev + cur.value, 0)\n if (sumCategoryValues > 0) {\n let xPos = 0\n // For each category on a single column, recreate the marker to the left of the chart.\n for (const yCategory of yCategories) {\n yCategory.tick\n .setTextFormatter((_) => yCategory.name)\n .setValue(yCategory.value)\n .setMarkerVisible(true)\n }\n // For each category (or column)\n for (const category of categories) {\n // Calculate the correct value to display for each category\n const relativeCategoryValue = (100 * category.value) / sumCategoryValues\n const sumSubCategoryValues = category.subCategories.reduce((prev, cur) => prev + cur.value, 0)\n // If there are subCategories for the column\n if (sumSubCategoryValues > 0) {\n // Recreate the tick to display above each category and set the correct value to it\n category.tick\n .setTextFormatter((_) => category.name + ' (' + Math.round(relativeCategoryValue) + '%)')\n .setValue(xPos + relativeCategoryValue / 2)\n .setMarkerVisible(true)\n let yPos = 0\n for (const subCategory of category.subCategories) {\n // Calculate proper value for the subCategory\n const relativeSubCategoryValue = (100 * subCategory.value) / sumSubCategoryValues\n if (relativeSubCategoryValue > 0) {\n const rectangleDimensions = {\n x: xPos + margin,\n y: yPos + margin,\n width: relativeCategoryValue - 2 * margin,\n height: relativeSubCategoryValue - 2 * margin,\n }\n // Create a rectangle to represent the subCategory\n rectangles\n .add(rectangleDimensions)\n .setFillStyle(subCategory.subCategory.fillStyle)\n .setStrokeStyle(emptyLine)\n // Recreate the label for the subCategory and update the value for it\n subCategory.label\n .setText(Math.round(relativeSubCategoryValue) + '%')\n .setPosition({\n x: xPos + relativeCategoryValue / 2,\n y: yPos + relativeSubCategoryValue / 2,\n })\n .setVisible(true)\n }\n // The subCategory is not shown, so we can dispose of its label.\n else subCategory.label.setVisible(false)\n yPos += relativeSubCategoryValue\n }\n } else {\n // There are no subCategories for the column, so the elements related to it can be disposed.\n category.tick.setMarkerVisible(false)\n category.subCategories.forEach((sub) => sub.label.setVisible(false))\n }\n xPos += relativeCategoryValue\n }\n }\n }\n // Method to add a new subCategory to the chart.\n const addSubCategory = () => {\n const subCategory = {\n fillStyle: Themes.darkGold.seriesFillStyle,\n setFillStyle(fillStyle) {\n this.fillStyle = fillStyle\n // Refresh the chart.\n _updateChart()\n return this\n },\n }\n subCategories.push(subCategory)\n return subCategory\n }\n // Method to add a new main category to the chart.\n const addCategory = (name) => {\n const category = {\n name,\n value: 0,\n tick: topAxis.addCustomTick(categoryMarkerBuilder).setGridStrokeStyle(emptyLine),\n subCategories: [],\n setCategoryValue(value) {\n this.value = value\n _updateChart()\n return this\n },\n setSubCategoryValue(subCategory, value) {\n const existing = this.subCategories.find((a) => a.subCategory == subCategory)\n if (existing !== undefined) {\n existing.value = value\n } else {\n this.subCategories.push({\n subCategory,\n value,\n label: chart.addUIElement(subCategoryLabelBuilder, {\n x: bottomAxis,\n y: rightAxis,\n }),\n })\n }\n _updateChart()\n return this\n },\n }\n categories.push(category)\n return category\n }\n // Method to add subCategory markers.\n const addYCategory = (name, value) => {\n const yCategory = {\n name,\n value: value,\n tick: leftAxis.addCustomTick(categoryMarkerBuilder).setGridStrokeStyle(emptyLine),\n setCategoryYValue(value) {\n this.value = value\n _updateChart()\n return this\n },\n }\n yCategories.push(yCategory)\n return yCategory\n }\n // Return interface for mosaic chart\n return {\n addSubCategory,\n addCategory,\n addYCategory,\n }\n }\n}\n\n// Use the interface for example.\nconst chart = mosaicChart()\nchart.addYCategory('Refreshed', 80)\nchart.addYCategory('No Effect', 40)\nchart.addYCategory('Caused Exhaustion', 12)\n\nconst subCategory_exhaust = chart.addSubCategory().setFillStyle(new SolidFill().setColor(ColorRGBA(200, 0, 0)))\nconst subCategory_noEffect = chart.addSubCategory().setFillStyle(new SolidFill().setColor(ColorRGBA(240, 190, 0)))\nconst subCategory_refresh = chart.addSubCategory().setFillStyle(new SolidFill().setColor(ColorRGBA(0, 180, 0)))\n\nchart\n .addCategory('With caffeine')\n .setCategoryValue(48)\n .setSubCategoryValue(subCategory_exhaust, 25)\n .setSubCategoryValue(subCategory_noEffect, 35)\n .setSubCategoryValue(subCategory_refresh, 40)\n\nchart\n .addCategory('Decaffeinated')\n .setCategoryValue(32)\n .setSubCategoryValue(subCategory_exhaust, 10)\n .setSubCategoryValue(subCategory_noEffect, 45)\n .setSubCategoryValue(subCategory_refresh, 45)\n\nchart\n .addCategory('Placebo product')\n .setCategoryValue(20)\n .setSubCategoryValue(subCategory_exhaust, 20)\n .setSubCategoryValue(subCategory_noEffect, 50)\n .setSubCategoryValue(subCategory_refresh, 30)\n","url":null,"readme":"_Also known as Marimekko Chart_\n\nThis example shows creation of a Mosaic Chart made on user side by utilizing RectangleSeries. Mosaic Chart can be used to compare observation counts of groups (sub-categories) across different categories.\n\nHere's the creation of a Mosaic Chart using a pre-defined interface.\n\n```javascript\n// Create Chart.\nconst chart = mosaicChart()\n// Add sub-categories (Each X-category can have a single value for each sub-category).\nconst A = chart.addSubCategory('A')\nconst B = chart.addSubCategory('B')\n// Add categories (These are drawn progressively on X axis).\nconst category1 = chart.addCategory('Category #1')\nconst category2 = chart.addCategory('Category #2')\n// Set values of categories (relative X size).\ncategory1.setCategoryValue(60)\ncategory2.setCategoryValue(40)\n// Set values of sub-categories on categories (relative Y size).\ncategory1.setSubCategoryValue(A, 40).setSubCategoryValue(B, 60)\ncategory2.setSubCategoryValue(A, 80).setSubCategoryValue(B, 20)\n```\n\nThe actual Mosaic Chart logic just serves to provide a starting point for users to create their own API based on their needs and preferences.\n","image":"mosaicChart"},{"id":"lcjs-example-0305-racingBars","title":"JavaScript COVID-19 Tracker Chart","tags":["bar","realtime"],"description":"Bar chart race shows the dynamics of the Covid-19 spread.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * COVID-19 Bar chart race on LightningChartJS.\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, BarChartTypes, AutoCursorModes, AxisTickStrategies, FormattingFunctions, Themes } = lcjs\n\nlet initday = 15\nlet lastDay = new Date('November 15, 2022').toISOString()\nlet connectionError = ''\n\nconst lc = lightningChart()\nconst barChart = lc\n .BarChart({\n type: BarChartTypes.Horizontal,\n // theme: Themes.darkGold\n })\n .setTitle('COVID-19 cases ' + new Date(2020, 2, 15).toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' }))\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setAnimationCategoryPosition(true, 2)\n .setAnimationValues(true, 1)\n\nbarChart.valueAxis\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setFormattingFunction(FormattingFunctions.NumericUnits))\n .setAnimationScroll(true)\n\n// Keep track of country colors so they don't change randomly as top 20 displayed countries change over time.\nconst countryFillStyleCache = new Map()\nconst theme = barChart.getTheme()\nconst fillStylePalette =\n typeof theme.rectangleSeriesFillStyle === 'function' ? theme.rectangleSeriesFillStyle : () => theme.rectangleSeriesFillStyle\n\n// Loop for adding bars\nconst addCountries = (entries) => {\n barChart.setData(entries.map((item) => ({ category: item.country, value: item.value })))\n barChart.getBars().forEach((bar) => {\n const fill = countryFillStyleCache.get(bar.category) || fillStylePalette(countryFillStyleCache.size)\n countryFillStyleCache.set(bar.category, fill)\n bar.setFillStyle(fill)\n })\n}\n\n// Sorting and splicing array of data\nconst sortCountries = (data, raceDay) => {\n let myday = raceDay.getMonth() + 1 + '/' + raceDay.getDate() + '/' + raceDay.getFullYear().toString().substr(-2)\n const countries = { ...data }\n\n // Map list of countries and sort them in the order (First sort by value, then by country)\n const countryList = Object.values(countries)\n .map((c) => ({ country: c.country, value: c.history[myday] }))\n .sort((a, b) => (a.value > b.value ? 1 : a.value === b.value ? (a.country > b.country ? 1 : -1) : -1))\n\n // Keep only top x countries\n const displayCount = 20\n countryList.splice(0, countryList.length - displayCount)\n\n return countryList\n}\n\n// Loop for re-rendering list of data\nconst startRace = (data) => {\n // Inital day of race\n let raceDay = new Date(2020, 2, initday)\n\n // Set title of chart\n barChart.setTitle(\n connectionError + ' COVID-19 cases ' + raceDay.toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' }),\n )\n\n const sortedCountries = sortCountries(data, raceDay)\n addCountries(sortedCountries)\n\n // we've bot reached the last day (i.e. yesterday) execute the function again and increase the day\n if (raceDay.toISOString() !== lastDay) {\n initday++\n setTimeout(() => startRace(data), 100)\n }\n}\n\nconst startRaceHandler = () => {\n // Fetch all countries and history of cases\n fetch('https://lightningchart.com/lightningchart-js-interactive-examples/data/covid/confirmed.json')\n .then((res) => res.json())\n .then((data) => {\n const dat = [...data.locations]\n\n // After fetching and merging data create bars\n startRace(mergeData(dat))\n })\n .catch((err) => {\n lastDay = '2020-05-30T21:00:00.000Z'\n connectionError = 'Example of data'\n startRace(mergeData(fallbackData))\n })\n\n // Some countries are divided by region and it is needed to megre them\n const mergeData = (data) => {\n const result = []\n // Return only specific information\n data.forEach((basket) => {\n let ob = {\n country: basket['country'],\n history: { ...basket['history'] },\n }\n\n // Check if array already contains the country\n let has = false\n result.find((obj) => (obj.country == ob.country ? (has = true) : (has = false)))\n\n // Unite object values\n const sum = (obj, newObj) => {\n Object.keys(obj).map((date) => (obj[date] += newObj[date]))\n }\n\n // Format the data\n if (has) {\n result.find((obj) => obj.country == ob.country && sum(obj.history, ob.history))\n } else {\n result.push(ob)\n }\n })\n\n return result\n }\n}\n\n// Start fetching\nstartRaceHandler(barChart)\n\n//fallback data\nconst fallbackData = [\n {\n country: 'US',\n history: {\n '3/15/20': 3212,\n '3/16/20': 4679,\n '3/17/20': 6512,\n '3/18/20': 9169,\n '3/19/20': 13663,\n '3/20/20': 20030,\n '3/21/20': 26025,\n '3/22/20': 34855,\n '3/23/20': 46086,\n '3/24/20': 56698,\n '3/25/20': 68773,\n '3/26/20': 86613,\n '3/27/20': 105293,\n '3/28/20': 124900,\n '3/29/20': 143779,\n '3/30/20': 165861,\n '3/31/20': 192177,\n '4/1/20': 224418,\n '4/2/20': 256636,\n '4/3/20': 288906,\n '4/4/20': 321318,\n '4/5/20': 351203,\n '4/6/20': 382613,\n '4/7/20': 413382,\n '4/8/20': 444580,\n '4/9/20': 480534,\n '4/10/20': 514942,\n '4/11/20': 544119,\n '4/12/20': 571400,\n '4/13/20': 598310,\n '4/14/20': 627082,\n '4/15/20': 652513,\n '4/16/20': 682548,\n '4/17/20': 715267,\n '4/18/20': 743223,\n '4/19/20': 769416,\n '4/20/20': 799212,\n '4/21/20': 825046,\n '4/22/20': 853818,\n '4/23/20': 887386,\n '4/24/20': 919658,\n '4/25/20': 950100,\n '4/26/20': 976680,\n '4/27/20': 1000298,\n '4/28/20': 1024746,\n '4/29/20': 1051136,\n '4/30/20': 1080303,\n '5/1/20': 1115219,\n '5/2/20': 1142639,\n '5/3/20': 1167095,\n '5/4/20': 1191071,\n '5/5/20': 1215543,\n '5/6/20': 1240053,\n '5/7/20': 1267418,\n '5/8/20': 1294224,\n '5/9/20': 1319414,\n '5/10/20': 1338381,\n '5/11/20': 1357566,\n '5/12/20': 1380423,\n '5/13/20': 1400812,\n '5/14/20': 1427725,\n '5/15/20': 1452425,\n '5/16/20': 1476586,\n '5/17/20': 1495068,\n '5/18/20': 1517302,\n '5/19/20': 1538241,\n '5/20/20': 1560975,\n '5/21/20': 1586662,\n '5/22/20': 1610252,\n '5/23/20': 1631496,\n '5/24/20': 1651676,\n '5/25/20': 1670442,\n '5/26/20': 1689948,\n '5/27/20': 1708342,\n '5/28/20': 1730551,\n '5/29/20': 1755010,\n '5/30/20': 1778689,\n '5/31/20': 1797763,\n },\n },\n {\n country: 'Russia',\n history: {\n '3/15/20': 63,\n '3/16/20': 90,\n '3/17/20': 114,\n '3/18/20': 147,\n '3/19/20': 199,\n '3/20/20': 253,\n '3/21/20': 306,\n '3/22/20': 367,\n '3/23/20': 438,\n '3/24/20': 495,\n '3/25/20': 658,\n '3/26/20': 840,\n '3/27/20': 1036,\n '3/28/20': 1264,\n '3/29/20': 1534,\n '3/30/20': 1836,\n '3/31/20': 2337,\n '4/1/20': 2777,\n '4/2/20': 3548,\n '4/3/20': 4149,\n '4/4/20': 4731,\n '4/5/20': 5389,\n '4/6/20': 6343,\n '4/7/20': 7497,\n '4/8/20': 8672,\n '4/9/20': 10131,\n '4/10/20': 11917,\n '4/11/20': 13584,\n '4/12/20': 15770,\n '4/13/20': 18328,\n '4/14/20': 21102,\n '4/15/20': 24490,\n '4/16/20': 27938,\n '4/17/20': 32008,\n '4/18/20': 36793,\n '4/19/20': 42853,\n '4/20/20': 47121,\n '4/21/20': 52763,\n '4/22/20': 57999,\n '4/23/20': 62773,\n '4/24/20': 68622,\n '4/25/20': 74588,\n '4/26/20': 80949,\n '4/27/20': 87147,\n '4/28/20': 93558,\n '4/29/20': 99399,\n '4/30/20': 106498,\n '5/1/20': 114431,\n '5/2/20': 124054,\n '5/3/20': 134687,\n '5/4/20': 145268,\n '5/5/20': 155370,\n '5/6/20': 165929,\n '5/7/20': 177160,\n '5/8/20': 187859,\n '5/9/20': 198676,\n '5/10/20': 209688,\n '5/11/20': 221344,\n '5/12/20': 232243,\n '5/13/20': 242271,\n '5/14/20': 252245,\n '5/15/20': 262843,\n '5/16/20': 272043,\n '5/17/20': 281752,\n '5/18/20': 290678,\n '5/19/20': 299941,\n '5/20/20': 308705,\n '5/21/20': 317554,\n '5/22/20': 326448,\n '5/23/20': 335882,\n '5/24/20': 344481,\n '5/25/20': 353427,\n '5/26/20': 362342,\n '5/27/20': 370680,\n '5/28/20': 379051,\n '5/29/20': 387623,\n '5/30/20': 396575,\n '5/31/20': 405843,\n },\n },\n {\n country: 'Spain',\n history: {\n '3/15/20': 7798,\n '3/16/20': 9942,\n '3/17/20': 11748,\n '3/18/20': 13910,\n '3/19/20': 17963,\n '3/20/20': 20410,\n '3/21/20': 25374,\n '3/22/20': 28768,\n '3/23/20': 35136,\n '3/24/20': 39885,\n '3/25/20': 49515,\n '3/26/20': 57786,\n '3/27/20': 65719,\n '3/28/20': 73235,\n '3/29/20': 80110,\n '3/30/20': 87956,\n '3/31/20': 95923,\n '4/1/20': 104118,\n '4/2/20': 112065,\n '4/3/20': 119199,\n '4/4/20': 126168,\n '4/5/20': 131646,\n '4/6/20': 136675,\n '4/7/20': 141942,\n '4/8/20': 148220,\n '4/9/20': 153222,\n '4/10/20': 158273,\n '4/11/20': 163027,\n '4/12/20': 166831,\n '4/13/20': 170099,\n '4/14/20': 172541,\n '4/15/20': 177644,\n '4/16/20': 184948,\n '4/17/20': 190839,\n '4/18/20': 191726,\n '4/19/20': 198674,\n '4/20/20': 200210,\n '4/21/20': 204178,\n '4/22/20': 208389,\n '4/23/20': 213024,\n '4/24/20': 202990,\n '4/25/20': 205905,\n '4/26/20': 207634,\n '4/27/20': 209465,\n '4/28/20': 210773,\n '4/29/20': 212917,\n '4/30/20': 213435,\n '5/1/20': 215216,\n '5/2/20': 216582,\n '5/3/20': 217466,\n '5/4/20': 218011,\n '5/5/20': 219329,\n '5/6/20': 220325,\n '5/7/20': 221447,\n '5/8/20': 222857,\n '5/9/20': 223578,\n '5/10/20': 224350,\n '5/11/20': 227436,\n '5/12/20': 228030,\n '5/13/20': 228691,\n '5/14/20': 229540,\n '5/15/20': 230183,\n '5/16/20': 230698,\n '5/17/20': 230698,\n '5/18/20': 231606,\n '5/19/20': 232037,\n '5/20/20': 232555,\n '5/21/20': 233037,\n '5/22/20': 234824,\n '5/23/20': 235290,\n '5/24/20': 235772,\n '5/25/20': 235400,\n '5/26/20': 236259,\n '5/27/20': 236259,\n '5/28/20': 237906,\n '5/29/20': 238564,\n '5/30/20': 239228,\n '5/31/20': 239479,\n },\n },\n {\n country: 'Turkey',\n history: {\n '3/15/20': 6,\n '3/16/20': 18,\n '3/17/20': 47,\n '3/18/20': 98,\n '3/19/20': 192,\n '3/20/20': 359,\n '3/21/20': 670,\n '3/22/20': 1236,\n '3/23/20': 1529,\n '3/24/20': 1872,\n '3/25/20': 2433,\n '3/26/20': 3629,\n '3/27/20': 5698,\n '3/28/20': 7402,\n '3/29/20': 9217,\n '3/30/20': 10827,\n '3/31/20': 13531,\n '4/1/20': 15679,\n '4/2/20': 18135,\n '4/3/20': 20921,\n '4/4/20': 23934,\n '4/5/20': 27069,\n '4/6/20': 30217,\n '4/7/20': 34109,\n '4/8/20': 38226,\n '4/9/20': 42282,\n '4/10/20': 47029,\n '4/11/20': 52167,\n '4/12/20': 56956,\n '4/13/20': 61049,\n '4/14/20': 65111,\n '4/15/20': 69392,\n '4/16/20': 74193,\n '4/17/20': 78546,\n '4/18/20': 82329,\n '4/19/20': 86306,\n '4/20/20': 90980,\n '4/21/20': 95591,\n '4/22/20': 98674,\n '4/23/20': 101790,\n '4/24/20': 104912,\n '4/25/20': 107773,\n '4/26/20': 110130,\n '4/27/20': 112261,\n '4/28/20': 114653,\n '4/29/20': 117589,\n '4/30/20': 120204,\n '5/1/20': 122392,\n '5/2/20': 124375,\n '5/3/20': 126045,\n '5/4/20': 127659,\n '5/5/20': 129491,\n '5/6/20': 131744,\n '5/7/20': 133721,\n '5/8/20': 135569,\n '5/9/20': 137115,\n '5/10/20': 138657,\n '5/11/20': 139771,\n '5/12/20': 141475,\n '5/13/20': 143114,\n '5/14/20': 144749,\n '5/15/20': 146457,\n '5/16/20': 148067,\n '5/17/20': 149435,\n '5/18/20': 150593,\n '5/19/20': 151615,\n '5/20/20': 152587,\n '5/21/20': 153548,\n '5/22/20': 154500,\n '5/23/20': 155686,\n '5/24/20': 156827,\n '5/25/20': 157814,\n '5/26/20': 158762,\n '5/27/20': 159797,\n '5/28/20': 160979,\n '5/29/20': 162120,\n '5/30/20': 163103,\n '5/31/20': 163942,\n },\n },\n {\n country: 'Germany',\n history: {\n '3/15/20': 5795,\n '3/16/20': 7272,\n '3/17/20': 9257,\n '3/18/20': 12327,\n '3/19/20': 15320,\n '3/20/20': 19848,\n '3/21/20': 22213,\n '3/22/20': 24873,\n '3/23/20': 29056,\n '3/24/20': 32986,\n '3/25/20': 37323,\n '3/26/20': 43938,\n '3/27/20': 50871,\n '3/28/20': 57695,\n '3/29/20': 62095,\n '3/30/20': 66885,\n '3/31/20': 71808,\n '4/1/20': 77872,\n '4/2/20': 84794,\n '4/3/20': 91159,\n '4/4/20': 96092,\n '4/5/20': 100123,\n '4/6/20': 103374,\n '4/7/20': 107663,\n '4/8/20': 113296,\n '4/9/20': 118181,\n '4/10/20': 122171,\n '4/11/20': 124908,\n '4/12/20': 127854,\n '4/13/20': 130072,\n '4/14/20': 131359,\n '4/15/20': 134753,\n '4/16/20': 137698,\n '4/17/20': 141397,\n '4/18/20': 143342,\n '4/19/20': 145184,\n '4/20/20': 147065,\n '4/21/20': 148291,\n '4/22/20': 150648,\n '4/23/20': 153129,\n '4/24/20': 154999,\n '4/25/20': 156513,\n '4/26/20': 157770,\n '4/27/20': 158758,\n '4/28/20': 159912,\n '4/29/20': 161539,\n '4/30/20': 163009,\n '5/1/20': 164077,\n '5/2/20': 164967,\n '5/3/20': 165664,\n '5/4/20': 166152,\n '5/5/20': 167007,\n '5/6/20': 168162,\n '5/7/20': 169430,\n '5/8/20': 170588,\n '5/9/20': 171324,\n '5/10/20': 171879,\n '5/11/20': 172576,\n '5/12/20': 173171,\n '5/13/20': 174098,\n '5/14/20': 174478,\n '5/15/20': 175233,\n '5/16/20': 175752,\n '5/17/20': 176369,\n '5/18/20': 176551,\n '5/19/20': 177778,\n '5/20/20': 178473,\n '5/21/20': 179021,\n '5/22/20': 179710,\n '5/23/20': 179986,\n '5/24/20': 180328,\n '5/25/20': 180600,\n '5/26/20': 181200,\n '5/27/20': 181524,\n '5/28/20': 182196,\n '5/29/20': 182922,\n '5/30/20': 183189,\n '5/31/20': 183410,\n },\n },\n {\n country: 'Brazil',\n history: {\n '3/15/20': 162,\n '3/16/20': 200,\n '3/17/20': 321,\n '3/18/20': 372,\n '3/19/20': 621,\n '3/20/20': 793,\n '3/21/20': 1021,\n '3/22/20': 1546,\n '3/23/20': 1924,\n '3/24/20': 2247,\n '3/25/20': 2554,\n '3/26/20': 2985,\n '3/27/20': 3417,\n '3/28/20': 3904,\n '3/29/20': 4256,\n '3/30/20': 4579,\n '3/31/20': 5717,\n '4/1/20': 6836,\n '4/2/20': 8044,\n '4/3/20': 9056,\n '4/4/20': 10360,\n '4/5/20': 11130,\n '4/6/20': 12161,\n '4/7/20': 14034,\n '4/8/20': 16170,\n '4/9/20': 18092,\n '4/10/20': 19638,\n '4/11/20': 20727,\n '4/12/20': 22192,\n '4/13/20': 23430,\n '4/14/20': 25262,\n '4/15/20': 28320,\n '4/16/20': 30425,\n '4/17/20': 33682,\n '4/18/20': 36658,\n '4/19/20': 38654,\n '4/20/20': 40743,\n '4/21/20': 43079,\n '4/22/20': 45757,\n '4/23/20': 50036,\n '4/24/20': 54043,\n '4/25/20': 59324,\n '4/26/20': 63100,\n '4/27/20': 67446,\n '4/28/20': 73235,\n '4/29/20': 79685,\n '4/30/20': 87187,\n '5/1/20': 92202,\n '5/2/20': 97100,\n '5/3/20': 101826,\n '5/4/20': 108620,\n '5/5/20': 115455,\n '5/6/20': 126611,\n '5/7/20': 135773,\n '5/8/20': 146894,\n '5/9/20': 156061,\n '5/10/20': 162699,\n '5/11/20': 169594,\n '5/12/20': 178214,\n '5/13/20': 190137,\n '5/14/20': 203165,\n '5/15/20': 220291,\n '5/16/20': 233511,\n '5/17/20': 241080,\n '5/18/20': 255368,\n '5/19/20': 271885,\n '5/20/20': 291579,\n '5/21/20': 310087,\n '5/22/20': 330890,\n '5/23/20': 347398,\n '5/24/20': 363211,\n '5/25/20': 374898,\n '5/26/20': 391222,\n '5/27/20': 411821,\n '5/28/20': 438238,\n '5/29/20': 465166,\n '5/30/20': 498440,\n '5/31/20': 514849,\n },\n },\n {\n country: 'Italy',\n history: {\n '3/15/20': 24747,\n '3/16/20': 27980,\n '3/17/20': 31506,\n '3/18/20': 35713,\n '3/19/20': 41035,\n '3/20/20': 47021,\n '3/21/20': 53578,\n '3/22/20': 59138,\n '3/23/20': 63927,\n '3/24/20': 69176,\n '3/25/20': 74386,\n '3/26/20': 80589,\n '3/27/20': 86498,\n '3/28/20': 92472,\n '3/29/20': 97689,\n '3/30/20': 101739,\n '3/31/20': 105792,\n '4/1/20': 110574,\n '4/2/20': 115242,\n '4/3/20': 119827,\n '4/4/20': 124632,\n '4/5/20': 128948,\n '4/6/20': 132547,\n '4/7/20': 135586,\n '4/8/20': 139422,\n '4/9/20': 143626,\n '4/10/20': 147577,\n '4/11/20': 152271,\n '4/12/20': 156363,\n '4/13/20': 159516,\n '4/14/20': 162488,\n '4/15/20': 165155,\n '4/16/20': 168941,\n '4/17/20': 172434,\n '4/18/20': 175925,\n '4/19/20': 178972,\n '4/20/20': 181228,\n '4/21/20': 183957,\n '4/22/20': 187327,\n '4/23/20': 189973,\n '4/24/20': 192994,\n '4/25/20': 195351,\n '4/26/20': 197675,\n '4/27/20': 199414,\n '4/28/20': 201505,\n '4/29/20': 203591,\n '4/30/20': 205463,\n '5/1/20': 207428,\n '5/2/20': 209328,\n '5/3/20': 210717,\n '5/4/20': 211938,\n '5/5/20': 213013,\n '5/6/20': 214457,\n '5/7/20': 215858,\n '5/8/20': 217185,\n '5/9/20': 218268,\n '5/10/20': 219070,\n '5/11/20': 219814,\n '5/12/20': 221216,\n '5/13/20': 222104,\n '5/14/20': 223096,\n '5/15/20': 223885,\n '5/16/20': 224760,\n '5/17/20': 225435,\n '5/18/20': 225886,\n '5/19/20': 226699,\n '5/20/20': 227364,\n '5/21/20': 228006,\n '5/22/20': 228658,\n '5/23/20': 229327,\n '5/24/20': 229858,\n '5/25/20': 230158,\n '5/26/20': 230555,\n '5/27/20': 231139,\n '5/28/20': 231732,\n '5/29/20': 232248,\n '5/30/20': 232664,\n '5/31/20': 232997,\n },\n },\n {\n country: 'India',\n history: {\n '3/15/20': 113,\n '3/16/20': 119,\n '3/17/20': 142,\n '3/18/20': 156,\n '3/19/20': 194,\n '3/20/20': 244,\n '3/21/20': 330,\n '3/22/20': 396,\n '3/23/20': 499,\n '3/24/20': 536,\n '3/25/20': 657,\n '3/26/20': 727,\n '3/27/20': 887,\n '3/28/20': 987,\n '3/29/20': 1024,\n '3/30/20': 1251,\n '3/31/20': 1397,\n '4/1/20': 1998,\n '4/2/20': 2543,\n '4/3/20': 2567,\n '4/4/20': 3082,\n '4/5/20': 3588,\n '4/6/20': 4778,\n '4/7/20': 5311,\n '4/8/20': 5916,\n '4/9/20': 6725,\n '4/10/20': 7598,\n '4/11/20': 8446,\n '4/12/20': 9205,\n '4/13/20': 10453,\n '4/14/20': 11487,\n '4/15/20': 12322,\n '4/16/20': 13430,\n '4/17/20': 14352,\n '4/18/20': 15722,\n '4/19/20': 17615,\n '4/20/20': 18539,\n '4/21/20': 20080,\n '4/22/20': 21370,\n '4/23/20': 23077,\n '4/24/20': 24530,\n '4/25/20': 26283,\n '4/26/20': 27890,\n '4/27/20': 29451,\n '4/28/20': 31324,\n '4/29/20': 33062,\n '4/30/20': 34863,\n '5/1/20': 37257,\n '5/2/20': 39699,\n '5/3/20': 42505,\n '5/4/20': 46437,\n '5/5/20': 49400,\n '5/6/20': 52987,\n '5/7/20': 56351,\n '5/8/20': 59695,\n '5/9/20': 62808,\n '5/10/20': 67161,\n '5/11/20': 70768,\n '5/12/20': 74292,\n '5/13/20': 78055,\n '5/14/20': 81997,\n '5/15/20': 85784,\n '5/16/20': 90648,\n '5/17/20': 95698,\n '5/18/20': 100328,\n '5/19/20': 106475,\n '5/20/20': 112028,\n '5/21/20': 118226,\n '5/22/20': 124794,\n '5/23/20': 131423,\n '5/24/20': 138536,\n '5/25/20': 144950,\n '5/26/20': 150793,\n '5/27/20': 158086,\n '5/28/20': 165386,\n '5/29/20': 173491,\n '5/30/20': 181827,\n '5/31/20': 190609,\n },\n },\n]\n","url":null,"readme":"_Also known as Bar Graph, Column Chart or Column Graph_\n\nShowcase of LightningChart JS Bar Charts in a _Racing Bar Chart_ context, to visualize tracking of the Co-Vid 19 virus.\nTha data (country, history of cases) that is taken from API (https://coronavirus-tracker-api.herokuapp.com/confirmed)\nIn setInterval loop data is sorted by total COVID cases per each day and top 20 cases added to\nthe bars series in format `{ category: string, value: number }`.\n\nSorting and animations are built-in to the chart feature, which makes the application code minimal and simple to maintain.\n","image":"racingBars"},{"id":"lcjs-example-0306-stackedBars","title":"JavaScript Stacked Bar Chart","tags":["bar"],"description":"This example shows the creation of a Stacked Bars Chart with LightningChart JS.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChart JS Example that showcases Stacked Bars Chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, BarChartSorting, LegendBoxBuilders, Themes } = lcjs\n\nconst barChart = lightningChart()\n .BarChart({\n // theme: Themes.darkGold,\n })\n .setTitle('% of market share by mobile OS in 1999-2021')\n .setValueLabels(undefined)\n .setCursorResultTableFormatter((builder, category, value, bar) => {\n builder.addRow('OS:', bar.subCategory).addRow('Share:', String(value), '%')\n return builder\n })\n\nbarChart.setDataStacked(\n ['1999', '2004', '2009', '2014', '2019', '2021'],\n [\n { subCategory: 'Symbian OS', values: [1, 51, 43, 0, 0, 0] },\n { subCategory: 'Palm OS', values: [66, 18, 1, 0, 0, 0] },\n { subCategory: 'BlackBerry OS', values: [1, 7, 20, 0.5, 0, 0] },\n { subCategory: 'Windows Mobile', values: [20, 13, 7, 2, 0, 0] },\n { subCategory: 'iOS', values: [0, 0, 15, 19, 14, 27] },\n { subCategory: 'Android', values: [0, 0, 8, 77, 82, 72] },\n { subCategory: 'Other', values: [12, 11, 6, 1.5, 4, 1] },\n ],\n)\n\nbarChart.valueAxis.setTitle('% of market share')\n\n// Add LegendBox.\nconst legend = barChart\n .addLegendBox(LegendBoxBuilders.VerticalLegendBox)\n\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\nlegend.add(barChart)\n","url":null,"readme":"This example shows creation of a Stacked Bars Chart.\n\nThe stacked bar chart (aka stacked bar graph) extends the standard bar chart from looking at numeric values across one categorical variable to two. Each bar in a standard bar chart is divided into a number of sub-bars stacked end to end, each one corresponding to a level of the second categorical variable.\n\nHere's the creation of a Stacked Bar Chart with LightningChart JS.\n\n```javascript\n// Create Chart.\nconst barChart = lightningChart().BarChart()\n\n// Add categories and subCategory & values.\nbarChart.setDataStacked(\n ['category1', 'category2', 'category2'],\n [\n { subCategory: 'subCategory 1', values: [1, 51, 43] },\n { subCategory: 'subCategory 2', values: [66, 18, 1] },\n { subCategory: 'subCategory 3', values: [1, 7, 20] },\n ],\n)\n```\n","image":"stackedBars","showNew":true},{"id":"lcjs-example-0400-spiderStatic","title":"JavaScript Static Spider Chart","tags":["spider","radar","web","legendbox","radial"],"description":"This example shows the basic use of Spider Chart. Also known as Radar Chart, Web Chart, Polar Chart, Star Series.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Many radial charts, spider charts, donut charts, radar charts, pie chart, fast & reliable JavaScript chart types.","src":"/*\n * LightningChartJS example that showcases a simple SpiderChart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, LegendBoxBuilders, Themes } = lcjs\n\n// Create spider chart and Three series.\nconst chart = lightningChart()\n .Spider({\n // theme: Themes.darkGold\n })\n .setTitle('Company branch efficiency')\n .setAxisInterval(100)\n .setScaleLabelStrategy(undefined)\n .setPadding({ top: 100 })\n\nconst series = [chart.addSeries().setName('Sydney'), chart.addSeries().setName('Kuopio'), chart.addSeries().setName('New York')]\nseries.forEach((value, i) => {\n value.setPointSize(10).setCursorResultTableFormatter((builder, series, value, axis) => builder.addRow(`${series.getName()} ${axis}`))\n})\n\n// Add constant points to series.\nconst categories = ['Pre-planning', 'Customer contacts', 'Meetings', 'Development time', 'Releases']\n//This is for Sydney Series.\nseries[0].addPoints(\n { axis: categories[0], value: 6 },\n { axis: categories[1], value: 22 },\n { axis: categories[2], value: 61 },\n { axis: categories[3], value: 76 },\n { axis: categories[4], value: 100 },\n)\n//This is for Kuopio Series.\nseries[1].addPoints(\n { axis: categories[0], value: 44 },\n { axis: categories[1], value: 8 },\n { axis: categories[2], value: 97 },\n { axis: categories[3], value: 68 },\n { axis: categories[4], value: 69 },\n)\n//This is for New York Series.\nseries[2].addPoints(\n { axis: categories[0], value: 94 },\n { axis: categories[1], value: 63 },\n { axis: categories[2], value: 4 },\n { axis: categories[3], value: 67 },\n { axis: categories[4], value: 71 },\n)\n\n// Create LegendBox as part of SpiderChart.\nconst legend = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n// Add SpiderChart to LegendBox\nlegend.add(chart)\n\n// Enable AutoCursor auto-fill.\nchart.setAutoCursor((cursor) => cursor.setResultTableAutoTextStyle(true))\n","url":null,"readme":"_Also known as Radar Chart, Web Chart, Polar Chart, Star Series_\n\nThis example shows the creation and API of Spider Chart, which is generally used to compare multivariate quantitative data set. Each quantitative variable is represented on a categorical axis starting from the same center point.\n\nTypical usage of the Radar (Spider) chart is to compare various products over a range of characteristics.\n\nSpider Charts are created in a very straight-forward manner:\n\n```javascript\n// Add a Spider Chart.\nconst spiderChart = Spider()\n```\n\nSpider Series provides an ability to specify styles for both markers and lines individually.\n\n```javascript\nconst spiderSeries = spiderChart\n .addSeries(PointShape.Circle)\n .setName('Positive feedback distribution')\n .setFillStyle(fillStyle)\n .setPointFillStyle(pointFillStyle)\n// etc ...\n```\n\nActual data is added with the format: `{ axis: string, value: number }`, where 'axis' refers to the name of a category.\n\n```javascript\nspiderSeries.addPoints(\n // Any number of { axis, value } pairs can be passed.\n { axis: 'Team spirit', value: 55 },\n { axis: 'Premises', value: 27 },\n { axis: 'Salary', value: 25 },\n)\n```\n\nAdding points with unique tags will automatically create new categorical axes for the Spider Chart in the order of adding (the first axis will always point directly up and following ones will traverse clock-wise). Adding more points to the same category tag in one series will override any previous values.\n","image":"spiderStatic"},{"id":"lcjs-example-0401-spiderAnimated","title":"Animated JavaScript Radar Chart","tags":["spider","radar","web","radial"],"description":"This example shows creation of a Radar Chart with animated transitions by using a suitably styled SpiderChart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Many radial charts, spider charts, donut charts, radar charts, pie chart, fast & reliable JavaScript chart types.","src":"/*\n * LightningChartJS example that showcases a Spider (Radar) Chart with animated changing of values.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, SpiderWebMode, Themes } = lcjs\n\n// Create a circular spider chart and add a series to it.\nconst chart = lightningChart()\n .Spider({\n // theme: Themes.darkGold\n })\n .setTitle('Animated Radar Chart')\n .setAxisInterval(100)\n // Configure spider to be circular (like a traditional Radar Chart).\n .setWebMode(SpiderWebMode.Circle)\nconst series = chart.addSeries()\n\n// Set initial series values, creating axes.\nconst categories = ['Category A', 'Category B', 'Category C', 'Category D', 'Category E']\nseries.addPoints(\n { axis: categories[0], value: 100 },\n { axis: categories[1], value: 100 },\n { axis: categories[2], value: 100 },\n { axis: categories[3], value: 100 },\n { axis: categories[4], value: 100 },\n)\n\n// Setup randomization of series values at regular intervals.\nconst randomizePoints = () => {\n for (const category of categories) {\n const value = Math.random() * 100\n series.addPoints({ axis: category, value })\n }\n}\n// Randomize points every other second (2000 ms).\nsetInterval(randomizePoints, 2000)\n","url":null,"readme":"This example shows creation of a Radar Chart with animated transitions by using a suitably styled SpiderChart.\n\nSpiderCharts can be styled to look like traditional Radar Charts by usage of SpiderWebModes - more specifically, SpiderWebMode.Circle.\n\n```javascript\n// Set web-mode of SpiderChart, affecting the shape of its background, webs and nibs.\nspiderChart.setWebMode(SpiderWebMode.Circle)\n```\n\nTransitions can be set at regular intervals using setInterval like so:\n\n```javascript\nsetInterval(() => {\n // This code will be called approximately every 100 milliseconds.\n}, 100)\n```\n","image":"spiderAnimated"},{"id":"lcjs-example-0440-solidGaugeChart","title":"JavaScript Solid Gauge Chart","tags":["gauge","legendbox","radial"],"description":"This example shows solid gauge chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Many radial charts, spider charts, donut charts, radar charts, pie chart, fast & reliable JavaScript chart types.","src":"/*\n * LightningChartJS example that showcases creation and styling of radial-gauge.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, GaugeChartTypes, Themes } = lcjs\n\n// Initialize gauge\nconst gauge = lightningChart()\n .Gauge({\n // theme: Themes.darkGold\n type: GaugeChartTypes.Solid,\n })\n .setTitle('Annual sales goal')\n .setThickness(80)\n .setDataLabelFormatter(new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }))\n .setAngleInterval(225, -45)\n\n// Create slice\nconst slice = gauge\n .getDefaultSlice()\n .setInterval(0, 400000)\n .setValue(329000)\n // .setFillStyle(new SolidFill({ color: ColorRGBA(12, 213, 87) }))\n .setName('2019 sales')\n\n// Add LegendBox and define the position in the chart\nconst legend = gauge\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n\n// Add gaugeChart to LegendBox\nlegend.add(gauge)\n","url":null,"readme":"This example shows solid gauge chart.\n\nThe chart can be created with a simple line of code.\n\n```javascript\n// Create a new Gauge chart.\nconst gauge = lightningChart().Gauge({ type: GaugeChartTypes.Solid })\n```\n\nAfter creating the Gauge Chart the value for it can be set simply.\n\n```javascript\ngauge\n // Get default slice, this is the only slice there is and\n // it should be manipulated to set wanted value to the Gauge Chart.\n .getDefaultSlice()\n // Set start and end values.\n .setInterval(0, 400000)\n // Set the displayed value.\n .setValue(329000)\n```\n","image":"solidGauge"},{"id":"lcjs-example-0450-pieChart","title":"JavaScript Pie Chart","tags":["pie","radial","legendbox"],"description":"Pie Chart (or a Circular Chart) is a chart used to show statistical graphic.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Many radial charts, spider charts, donut charts, radar charts, pie chart, fast & reliable JavaScript chart types.","src":"/*\n * LightningChartJS example that shows the creation of a Pie Chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PieChartTypes, LegendBoxBuilders, SliceLabelFormatters, Themes } = lcjs\n\nconst pieType = window.innerWidth > 599 ? PieChartTypes.LabelsOnSides : PieChartTypes.LabelsInsideSlices\n\nconst pie = lightningChart()\n .Pie({\n // theme: Themes.darkGold\n type: pieType,\n })\n .setTitle('Project Time Division')\n .setMultipleSliceExplosion(true)\n\n// ----- User defined data -----\nconst data = [\n {\n name: 'Planning',\n value: 40,\n },\n {\n name: 'Development',\n value: 120,\n },\n {\n name: 'Testing',\n value: 60,\n },\n {\n name: 'Review',\n value: 24,\n },\n {\n name: 'Bug Fixing',\n value: 90,\n },\n]\n\n// ----- Create Slices -----\nconst slices = data.map((item) => pie.addSlice(item.name, item.value))\n\n// Specify function which generates text for Slice Labels(LabelFormatter).\n\npie.setLabelFormatter(SliceLabelFormatters.NamePlusRelativeValue)\n\n// ----- Add LegendBox -----\npie.addLegendBox(LegendBoxBuilders.VerticalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(pie)\n","url":null,"readme":"Pie Chart (or a Circular Chart) is a chart used to show statistical graphic. The Pie Chart is divided into slices, with each slice illustrating a numerical portion of the whole Pie. Each slice's size (usually depicted in the central angle and area of the slice) is proportional to its quantity.\n\nThe chart can be created with a simple line of code.\n\n```javascript\n// Create a new Pie Chart.\nconst chart = lightningChart().Pie()\n```\n\nThe Pie Chart has two types for displaying the labels for each slice; The slices can be placed either on top of each slice by using the LabelsInsideSlices type, or they can be placed on both sides of the Chart by using LabelsOnSides type. The type must be given to the Chart as a parameter when creating it.\nBy default, the LabelsOnSides type is used.\n\n```javascript\n// Create a new Pie Chart and pass the type to use when placing labels.\nconst chart = lightningChart().Pie({ type: PieChartTypes.LabelsOnSides })\n```\n\nAfter creating the Pie Chart, we can populate it by adding slices to it.\nThe slice should always get a name and value in a single object.\n\n```javascript\n// Add a slice to populate the Pie.\nchart.addSlice({ name: 'Planning', value: 100 })\n```\n\nEach slice can be 'exploded' by clicking on them, and 'imploded' by clicking on a exploded slice.\nExploding slices can be set to only one at a time, or allowing all slices to be exploded at the same time.\n\n```javascript\n// Allow multiple slices to be in exploded state at the same time.\nchart.setMultipleSliceExplosion(true)\n```\n\nThe labels for all slices can be formatted in different ways.\n\n```javascript\n// Set the label formatting to show the slice's name and the relative value\n// (size of the slice as percentage).\npie.setLabelFormatter(SliceLabelFormatters.NamePlusRelativeValue)\n```\n\nThe lines connecting each slice to its label can be modified.\n","image":"pieChart"},{"id":"lcjs-example-0451-donutChart","title":"JavaScript Donut Chart","tags":["donut","radial","legendbox"],"description":"Donut Chart is a variation of Pie chart - functionally it's the same, visually it's only missing the center.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Many radial charts, spider charts, donut charts, radar charts, pie chart, fast & reliable JavaScript chart types.","src":"/*\n * LightningChartJS example that shows the creation and styling of a donut chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n PieChartTypes,\n UIElementBuilders,\n LegendBoxBuilders,\n UIDraggingModes,\n SliceLabelFormatters,\n UIOrigins,\n emptyFill,\n emptyLine,\n Themes,\n} = lcjs\n\nconst donut = lightningChart()\n .Pie({\n // theme: Themes.darkGold\n type: PieChartTypes.LabelsInsideSlices,\n })\n .setTitle('Inter Hotels - hotel visitors in June 2016')\n .setPadding({ top: 40 })\n .setMultipleSliceExplosion(false)\n // Style as \"Donut Chart\"\n .setInnerRadius(60)\n\n// ----- Static data -----\nconst data = {\n country: ['US', 'Canada', 'Greece', 'UK', 'Finland', 'Denmark'],\n values: [15000, 20030, 8237, 16790, 9842, 4300],\n}\n// Preparing data for each Slice\nconst processedData = []\nlet totalVisitor = 0\nfor (let i = 0; i < data.values.length; i++) {\n totalVisitor += data.values[i]\n processedData.push({ name: `${data.country[i]}`, value: data.values[i] })\n}\n\n// ----- Create Slices -----\nprocessedData.map((item) => donut.addSlice(item.name, item.value))\ndonut.setLabelFormatter(SliceLabelFormatters.NamePlusValue)\n// ----- Add LegendBox -----\ndonut\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n .add(donut)\n\n// ----- Add TextBox -----\ndonut\n .addUIElement(UIElementBuilders.TextBox)\n .setPosition({ x: 50, y: 50 })\n .setOrigin(UIOrigins.CenterTop)\n .setDraggingMode(UIDraggingModes.notDraggable)\n .setMargin(5)\n .setTextFont((fontSettings) => fontSettings.setSize(25))\n .setText(`Total: ${totalVisitor} visitors`)\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n","url":null,"readme":"Donut Chart is a variation of Pie chart - functionally it's the same, visually it's only missing the center.\n\nThe chart can be created with a few simple lines of code.\n\nThe inner radius is used to set how far inwards from the outer edge of the circle we should cut the circle from, essentially creating a ring.\nFor example, setting the inner radius as 0.50 will draw a ring, where the circle's inner radius is at 50% distance from the circle's full radius.\n\n```javascript\n// Create a new Pie Chart.\nconst chart = lightningChart().Pie()\nchart.setInnerRadius(50)\n```\n\nIt is possible to disable the animations for the Pie / Donut chart: value changes, disabling / enabling slices and the explosion / implosion of a slice.\nAnimations are enabled by default.\n\n```javascript\n// Disable all animations for the chart.\nchart.setAnimationsEnabled(false)\n```\n\nThe slice fill styles can be styled by using a palette. A palette is a collection of fill styles which can be called by index.\n\n```javascript\n// Use a palette of colors to create the Fill Styles. You can also create your own\n// - check the ColorPalettes documentation for more info.\nconst colorPalette = ColorPalettes.fullSpectrum\n// Create a palette of Fill Styles to use with the Pie Chart's Slices.\nconst fillStylePalette = SolidFillPalette(colorPalette, 10)\npie.setSliceFillStyle(fillStylePalette)\n```\n\nYou can also create a custom color palette and use it with the Chart.\nEasiest way to add a custom color palette is to create an array of colors and creating a function that returns colors from the array based on index.\n\n```javascript\n// ----- Create custom Palette for Donut (defines color of Slice filling) ----\nconst colorArray = [\n ColorRGBA(97, 33, 15, 255),\n ColorRGBA(255, 140, 66, 255),\n ColorRGBA(225, 86, 52, 255),\n ColorRGBA(234, 43, 31, 255),\n ColorRGBA(249, 223, 116, 255),\n ColorRGBA(245, 224, 183, 255),\n]\n// Create a simple function which returns a color based on index.\n// Both parameters (length and index) can be used to create more complex functions -\n// length should be the length of the color array.\nconst colorPalette = (length) => (index) => {\n return colorArray[index]\n}\n// Pass the color palette to the SolidFillPalette method,\n// which returns a fillStyle palette that can be used with the Donut Chart\nconst fillStylePalette = SolidFillPalette(colorPalette, data.values.length)\n// Set the custom fillStyle for the Donut Chart\ndonut.setSliceFillStyle(fillStylePalette)\n```\n\nAll slices in the chart can have a border surrounding them, which can be styled for the entire chart.\n\n```javascript\n// Create a StrokeStyle to use with the chart.\nconst customStrokeStyle = new SolidLine({\n fillStyle: new SolidFill({ color: ColorRGBA(30, 144, 255) }),\n thickness: 5,\n})\n// Set the StrokeStyle to use with all slices in the chart.\nchart.setSliceStrokeStyle(customStrokeStyle)\n```\n","image":"donutChart"},{"id":"lcjs-example-0452-pieLUT","title":"JavaScript Pie Chart with Lookup table","tags":["donut","radial","legendbox"],"description":"Example showcasing the use of Lookup Table with a Pie Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Many radial charts, spider charts, donut charts, radar charts, pie chart, fast & reliable JavaScript chart types.","src":"/*\n * LightningChartJS example that showcases usage of color lookup table on Pie.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { PieChartTypes, lightningChart, LegendBoxBuilders, SliceLabelFormatters, SliceSorters, LUT, ColorRGBA, Themes } = lcjs\n\n// Create a new color-value lookup table\nconst lut = new LUT({\n steps: [\n { value: 20, color: ColorRGBA(255, 0, 24) },\n { value: 40, color: ColorRGBA(255, 165, 44) },\n { value: 60, color: ColorRGBA(255, 255, 65) },\n { value: 80, color: ColorRGBA(0, 128, 24) },\n { value: 100, color: ColorRGBA(0, 0, 249) },\n { value: 120, color: ColorRGBA(134, 0, 125) },\n ],\n interpolate: true,\n})\n\n// Create a Pie Chart\nconst pie = lightningChart()\n .Pie({\n // theme: Themes.darkGold\n type: PieChartTypes.LabelsOnSides,\n })\n .setTitle('Pie Chart')\n .setMultipleSliceExplosion(true)\n .setLabelFormatter(SliceLabelFormatters.NamePlusValue)\n .setSliceSorter(SliceSorters.None)\n // Attach lookup table\n .setLUT(lut)\n\nconst data = []\n\nfor (let i = 1; i <= 10; i++) data.push({ name: `Slice #${i}`, value: 1 + Math.random() * 120 })\n\n// Create Slices\nconst slices = data.map((item) => pie.addSlice(item.name, item.value))\n\n// Add LegendBox\npie.addLegendBox(LegendBoxBuilders.VerticalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(pie)\n\n// 2 seconds after the example has loaded, change the values of each slice.\nsetTimeout(() => {\n slices.forEach((slice) => slice.setValue(1 + Math.random() * 120))\n}, 2000)\n\n// Change value of every slice regularly\nsetInterval(() => {\n slices.forEach((slice) => slice.setValue(1 + Math.random() * 120))\n}, 5000)\n","url":null,"readme":"Lookup table stores information about values and its associated colors. It provides efficient lookup of the color based on provided value as well as linear and step interpolation between colors.\n\nThe current example shows usage of lookup table with a Pie Chart.\n\n```javascript\n// create LUT from 0..120 with gradient steps.\nconst lut = new LUT( {\n steps: [\n { value: 20, color: ColorRGBA( 255, 0, 24 ) },\n { value: 40, color: ColorRGBA( 255, 165, 44 ) },\n { value: 60, color: ColorRGBA( 255, 255, 65 ) },\n { value: 80, color: ColorRGBA( 0, 128, 24 ) },\n { value: 100, color: ColorRGBA( 0, 0, 249 ) },\n { value: 120, color: ColorRGBA( 134, 0, 125 ) }\n ],\n interpolate: true\n}\n```\n\nCreate a Pie Chart and attach lookup table to fill the slices with colors based on value.\n\n```javascript\n// Create a new Pie Chart\nconst chart = lightningChart()\n .Pie({ type: PieChartTypes.LabelsOnSides })\n .setAnimationsEnabled(true)\n .setMultipleSliceExplosion(true)\n .setLabelFormatter(SliceLabelFormatters.NamePlusValue)\n .setSliceSorter(SliceSorters.None)\n // Attach lookup table.\n .setLUT(lut)\n .setLabelConnectorGap(10)\n```\n","image":"pieLUT"},{"id":"lcjs-example-0460-simpleFunnelChart","title":"JavaScript Funnel Chart","tags":["funnel","pyramid","sliced","legendbox"],"description":"Funnel Chart is a chart used to show statistical graphic. Funnel Chart is divided into slices, with each slice illustrating the numerical portion of the Funnel. ","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChartJS example that shows the creation and styling of a Funnel chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { FunnelChartTypes, FunnelLabelSide, SliceLabelFormatters, lightningChart, FunnelSliceModes, LegendBoxBuilders, Themes } = lcjs\n\n// Create a Funnel chart\nconst funnel = lightningChart()\n .Funnel({\n // theme: Themes.darkGold\n type: FunnelChartTypes.LabelsOnSides,\n })\n .setTitle('Customer contacts progression')\n .setSliceMode(FunnelSliceModes.VariableHeight)\n .setSliceGap(0)\n .setHeadWidth(95)\n .setNeckWidth(40)\n .setLabelSide(FunnelLabelSide.Right)\n .setPadding({ bottom: 45 })\n\n// Data for slices\nconst data = [\n {\n name: 'Prospects',\n value: 2000,\n },\n {\n name: 'Contacts',\n value: 1540,\n },\n {\n name: 'Leads',\n value: 1095,\n },\n {\n name: 'Customers',\n value: 549,\n },\n]\n// Add data to the slices\nfunnel.addSlices(data)\n\n// Set formatter of Slice Labels\nfunnel.setLabelFormatter(SliceLabelFormatters.NamePlusValue)\n\n// Add LegendBox and define the position in the chart\nconst lb = funnel\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\nlb.add(funnel, { toggleVisibilityOnClick: false })\n","url":null,"readme":"Funnel Chart is a chart used to show statistical graphic. Funnel Chart is divided into slices, with each slice illustrating the numerical portion of the Funnel. Each slice's size is proportional to its quantity.\n\nThe chart can be created with a simple line of code.\n\n```javascript\n// Create a new Funnel Chart.\nconst funnel = lightningChart().Funnel()\n```\n\nThe Funnel has two types for displaying the labels for each slice; The slices can be placed either on top of each slice or the labels can be placed to the side of the Funnel, drawn with a connector line between the slice and its label.\n\nIf no type is given, the Funnel defaults to showing labels on side of Funnel.\n\n```javascript\n// Create a Funnel Chart with labels on the side.\nconst funnel = lightningChart().Funnel({ type: FunnelChartTypes.LabelsOnSide })\n\n// Create a Funnel Chart with labels inside of slices.\nconst funnel = lightningChart().Funnel({\n type: FunnelChartTypes.LabelsInsideSlices,\n})\n```\n\nAfter creating the Funnel Chart, we can populate it by adding slices to it.\nThe slice should always get a name and value as parameters.\n\nYou can alternatively add multiple slices as an array of objects containing a name and a value for each slice.\n\n```javascript\n// Add a single slice to the Funnel.\nfunnel.addSlice('Slice', 50)\n\n// Add multiple slices to populate the Funnel.\nconst data = [\n {\n name: 'Prospects',\n value: 2000,\n },\n {\n name: 'Contacts',\n value: 1540,\n },\n {\n name: 'Leads',\n value: 1095,\n },\n {\n name: 'Customers',\n value: 549,\n },\n]\n// Add data to the slices\nfunnel.addSlices(data)\n```\n\nModifying how the Funnel and its slices are drawn can be done through the Funnel Chart's API.\n\n```javascript\n// Set the gap between each of the slices. This value can be between 0 to 20 pixels.\nfunnel.setSliceGap(5)\n\n// Set the width of the Funnel's top edge. This value can be from 0 to 100 (in percents).\nfunnel.setHeadWidth(95)\n\n// Set the width of the Funnel's bottom edge. This value can be from 0 to 100 (in percents).\nfunnel.setNeckWidth(40)\n\n// If the labels are set to be placed on the side of the Funnel,\n// we can determine the side they will be placed.\nfunnel.setLabelSide(FunnelLabelSide.Right)\n```\n\nThe slices can be styled using the Funnel Chart's API.\n\n```javascript\n// Create a palette of Fill Styles to use with the Funnel's Slices.\nconst palette = SolidFillPalette(ColorPalettes.warm, data.length)\n// Set the palette used for coloring each of the slices.\nfunnel.setSliceFillStyle(palette)\n```\n\nThe Funnel Chart has different ways to draw the slices depending on their value.\n\nPerhaps the most common way is to show the value as the height of the slice in relation to the combined value of all slices.\nThis can be achieved by setting the Funnel's Slice Mode to Variable Height.\n\n```javascript\n// Set Funnel chart slice mode to Variable Height.\nfunnel.setSliceMode(FunnelSliceModes.VariableHeight)\n```\n\nAnother common way is to show all the slices with equal height, but to have their width change depending on their value relative to the combined total value.\n\n```javascript\n// Set Funnel Chart slice mode to Variable Width.\nfunnel.setSliceMode(FunnelSliceModes.VariableWidth)\n```\n\nThe labels for all slices can be formatted in different ways.\n\n```javascript\n// Set the label formatting to show the slice's name and value.\nfunnel.setLabelFormatter(SliceLabelFormatters.NamePlusValue)\n```\n\nThe lines connecting each slice to its label can be modified.\n\n```javascript\n// Set the style that will be used with each connector line.\nfunnel.setLabelConnectorStyle(\n new SolidLine({\n thickness: 2,\n fillStyle: new SolidFill({ color: ColorRGBA(125, 95, 220) }),\n }),\n)\n```\n","image":"simpleFunnel"},{"id":"lcjs-example-0465-simplePyramidChart","title":"JavaScript Pyramid Chart","tags":["pyramid","funnel","sliced","legendbox"],"description":"Pyramid Chart is a chart used to show statistical graphic. The Pyramid chart is divided into slices, with each slice illustrating the numerical portion of the whole Pyramid.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChartJS example that shows the creation and styling of a Pyramid chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { PyramidChartTypes, PyramidLabelSide, SliceLabelFormatters, lightningChart, LegendBoxBuilders, Themes } = lcjs\n\n// Create a Pyramid chart\nconst pyramid = lightningChart()\n .Pyramid({\n // theme: Themes.darkGold\n type: PyramidChartTypes.LabelsOnSides,\n })\n .setTitle('Company staff growth')\n .setNeckWidth(80)\n .setSliceGap(5)\n .setPadding({ bottom: 45 })\n .setLabelSide(PyramidLabelSide.Right)\n\n// Data for slices\nconst data = [\n {\n name: '2015 - 2016',\n value: 3,\n },\n {\n name: '2016 - 2017',\n value: 5,\n },\n {\n name: '2017 - 2018',\n value: 10,\n },\n {\n name: '2018 - 2019',\n value: 17,\n },\n]\n// Add data to the slices\npyramid.addSlices(data)\n\n// Set formatter of Slice Labels\npyramid.setLabelFormatter(SliceLabelFormatters.NamePlusValue)\n\n// Add LegendBox and define the position in the chart\nconst lb = pyramid\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n\n// Add the Pyramid to the LegendBox and disable the button click functionality.\nlb.add(pyramid, { toggleVisibilityOnClick: false })\n","url":null,"readme":"Pyramid Chart is a chart used to show statistical graphic. The Pyramid chart is divided into slices, with each slice illustrating the numerical portion of the whole Pyramid. Each slice's size (usually depicted as the slice's relative height from the Pyramid) is proportional to its quantity.\n\nThe chart can be created with a simple line of code.\n\n```javascript\n// Create a new Pyramid Chart.\nconst pyramid = lightningChart().Pyramid()\n```\n\nThe Pyramid Chart has two types for displaying the labels for each slice; The slices can be placed either on top of each slice by using the LabelsInsideSlices type, or they can be placed on both sides of the Chart by using LabelsOnSides type. The type must be given to the Chart as a parameter when creating it.\nBy default, the LabelsOnSides type is used.\n\n```javascript\n// Create a new Pyramid Chart and pass the type to use when placing labels.\nconst pyramid = lightningChart().Pyramid({\n type: PyramidChartTypes.LabelsOnSides,\n})\n```\n\nAfter creating the Pyramid Chart, we can populate it by adding slices to it.\nThe slice should always get a name and value as parameters.\n\nYou can alternatively add multiple slices as an array of objects containing a name and a value for each slice.\n\n```javascript\n// Add a single slice to populate the Pyramid.\npyramid.addSlice('Planning', 100)\n\n// Add multiple slices to populate the Pyramid.\npyramid.addSlices([\n {\n name: 'Slice1',\n value: 45,\n },\n {\n name: 'Slice2',\n value: 83,\n },\n {\n name: 'Slice3',\n value: 19,\n },\n])\n```\n\nYou can modify how the Pyramid and its slices are drawn through the Pyramid Chart's API.\n\n```javascript\n// Set the width of the Pyramid's bottom edge. This value can be from 0 to 100 (in percents).\npyramid.setNeckWidth(80)\n\n// Set the gap between each of the slices. This value can be between 0 to 20 pixels.\npyramid.setSliceGap(5)\n\n// If the labels are set to be placed on the side of the Pyramid,\n// we can determine the side here as well.\npyramid.setLabelSide(PyramidLabelSide.Right)\n```\n\nThe Slices can be styled using the Pyramid Chart's API.\n\n```javascript\n// Create a palette of Solid FillStyles to use with the Pyramid slices.\nconst palette = SolidFillPalette(ColorPalettes.warm, data.length)\n// Set the palette used for coloring each of the slices.\npyramid.setSliceFillStyle(palette)\n```\n\nThe labels for all slices can be formatted in different ways.\n\n```javascript\n// Set the label formatting to show the slice's name and the relative value\n// (size of the slice as percentage).\npyramid.setLabelFormatter(SliceLabelFormatters.NamePlusRelativeValue)\n```\n\nThe lines connecting each slice to its label can be modified.\n\n```javascript\n// Set the style used with all connector lines.\npyramid.setLabelConnectorStyle(\n new SolidLine({\n thickness: 3,\n fillStyle: new SolidFill({ color: ColorRGBA(100, 150, 195) }),\n }),\n)\n```\n","image":"simplePyramid"},{"id":"lcjs-example-0500-dashboardWithLegendBox","title":"JavaScript Dashboard With LegendBox","tags":["dashboard","legendbox","spline","spider","radar","web","xy"],"description":"Example showing a dashboard with multiple chart types and LegendBox Panel.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases a dashboard with LegendBox.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisScrollStrategies, PointShape, AxisTickStrategies, Themes } = lcjs\n\n// Import data-generators from 'xydata'-library.\nconst { createProgressiveRandomGenerator } = xydata\n\n// Create Dashboard and stand-alone LegendBox.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst db = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: 2,\n numberOfColumns: 2,\n})\n\n// Create a legendBox docked to the Dashboard.\nconst legend = db.createLegendBoxPanel({\n columnIndex: 0,\n rowIndex: 1,\n columnSpan: 1,\n rowSpan: 1,\n})\n\nconst dateOrigin = new Date()\nconst dateOriginTime = dateOrigin.getTime()\n\n// Spline\n{\n const dateOrigin = new Date()\n const dataFrequency = 1000\n const chart = db\n .createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n })\n .setTitle('Live sales')\n .setPadding({ right: 30 })\n\n const series = chart\n .addSplineSeries({ pointShape: PointShape.Circle })\n .setName('Product')\n .setStrokeStyle((strokeStyle) => strokeStyle.setThickness(2))\n .setPointSize(5)\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((tableBuilder, series, x, y) =>\n tableBuilder\n .addRow(series.getName())\n .addRow('Time : ', series.axisX.formatValue(x))\n .addRow('Sold : ', y.toFixed(0) + ' pieces'),\n )\n\n chart\n .getDefaultAxisX()\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 61 * 1000, stopAxisAfter: false }))\n .setTickStrategy(AxisTickStrategies.DateTime, (tickStrategy) => tickStrategy.setDateOrigin(dateOrigin))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\n chart\n .getDefaultAxisY()\n .setTitle('Units sold')\n .setInterval({ start: 0, end: 500, stopAxisAfter: false })\n .setScrollStrategy(AxisScrollStrategies.expansion)\n\n // Stream some random data.\n createProgressiveRandomGenerator()\n .setNumberOfPoints(10000)\n .generate()\n .setStreamBatchSize(1)\n .setStreamInterval(500)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => {\n point.x = Date.now() - dateOriginTime\n point.y = point.y * 500\n series.add(point)\n })\n\n // Add to LegendBox\n legend.add(chart)\n}\n\n// Spider\n{\n const chart = db\n .createSpiderChart({\n columnIndex: 1,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 2,\n })\n .setTitle('Product development costs vs. sales profits')\n .setScaleLabelFont((font) => font.setSize(12))\n .setAxisLabelFont((font) => font.setSize(14).setStyle('italic'))\n\n chart\n .addSeries(PointShape.Circle)\n .setName('Sales Profits')\n .addPoints(\n { axis: 'January', value: 100 },\n { axis: 'February', value: 200 },\n { axis: 'March', value: 300 },\n { axis: 'April', value: 400 },\n { axis: 'May', value: 500 },\n { axis: 'June', value: 650 },\n { axis: 'July', value: 800 },\n { axis: 'August', value: 990 },\n { axis: 'September', value: 1200 },\n { axis: 'October', value: 1100 },\n { axis: 'November', value: 1400 },\n { axis: 'December', value: 1500 },\n )\n .setCursorResultTableFormatter((tableContentBuilder, series, value, axis, formatValue) =>\n tableContentBuilder\n .addRow(series.getName())\n .addRow(axis)\n .addRow('$' + value),\n )\n\n chart\n .addSeries(PointShape.Circle)\n .setName('Development Costs')\n .addPoints(\n { axis: 'January', value: 0 },\n { axis: 'February', value: 100 },\n { axis: 'March', value: 300 },\n { axis: 'April', value: 400 },\n { axis: 'May', value: 500 },\n { axis: 'June', value: 600 },\n { axis: 'July', value: 700 },\n { axis: 'August', value: 900 },\n { axis: 'September', value: 1000 },\n { axis: 'October', value: 1100 },\n { axis: 'November', value: 1300 },\n { axis: 'December', value: 1400 },\n )\n .setCursorResultTableFormatter((tableContentBuilder, series, value, axis, formatValue) =>\n tableContentBuilder\n .addRow(series.getName())\n .addRow(axis)\n .addRow('$' + value),\n )\n\n // Add to LegendBox\n legend.add(chart)\n\n // Set the row height\n db.setRowHeight(0, 3)\n}\n","url":null,"readme":"This example shows a simple dashboard with multiple chart types and LegendBox Panel.\n\nThe dashboard allows rendering of multiple scenes in a single view port highly efficiently with minimal memory resources. During the creation of a dashboard instance, the amount of rows and columns will have to be specified. This can not be changed afterwards.\n\n**(!) Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/**\n\n```javascript\n// Create a dashboard with three rows and two columns.\nconst dashboard = lightningChart().Dashboard({\n numberOfRows: 3,\n numberOfColumns: 2,\n})\n```\n\nCharts and Panels can then be added to the dashboard like follows:\n\n```javascript\n// Create a ChartXY that occupies the top row of the dashboard.\nconst chartXY = dashboard.createChartXY({\n // Row index (starting from bottom).\n columnIndex: 2,\n // Column index (starting from left).\n rowIndex: 0,\n // Row span (height, basically).\n columnSpan: 1,\n // Column span (width, basically).\n rowSpan: 2,\n})\n```\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/dashboardPositioning.png)\n\nDashboards have separate methods for adding a different kind of Charts or Panels. Dashboard represents a grid with rows & columns. During the creation of the element, the row & column indices and the horizontal & vertical spans should be specified to position it in the correct place and fill the desired amount of cells.\n\n```javascript\n// Create a spider chart and attach to dashboard.\n// Row 0, Column 0, Rows to fill 2, Columns to fill 1.\nconst spiderChart = dashboard.createSpider(0, 0, 2, 1)\n\n// Create a Legend Box Panel and attach to dashboard.\n// Row 0, Column 1, Rows to fill 2, Columns to fill 1.\nconst legendBox = dashboard.createLegendBoxPanel({\n columnIndex: 0,\n rowIndex: 1,\n columnSpan: 2,\n rowSpan: 1,\n})\n```\n\nThe dashboard rows and columns can have varying heights and widths respectively - you can resize them by clicking and dragging on the grid line separating the columns and rows from each other, or by using methods to set them programmatically:\n\n```javascript\n// Set height of the first row of a dashboard.\n// By default each row and column has a size of 1.\n// The size is always relative to the combined size of each row / column.\ndashboard.setRowHeight(0, 2)\n// Set width of the first and the second column of a dashboard.\n// First column width will be 2/5 of the entire view's width.\ndashboard.setColumnWidth(0, 2)\n// Second column width will be 3/5 of the entire view's width.\ndashboard.setColumnWidth(1, 3)\n```\n","image":"dashboardWithLegendbox"},{"id":"lcjs-example-0501-dashboard5chs1000pps","title":"JavaScript Dashboard 5 Channels 1000 pps","tags":["dashboard","line","realtime","xy","datapattern","datacleaning"],"description":"Example for a dashboard with multiple progressive channels of data. Using progressive Line Series.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases usage of Dashboard with multiple channels and axis scroll strategies.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisScrollStrategies, emptyFill, Themes } = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveRandomGenerator } = xydata\n\nconst channels = ['Ch 1', 'Ch 2', 'Ch 3', 'Ch 4', 'Ch 5']\nconst channelCount = channels.length\n\n// Create Dashboard.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst grid = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: channelCount,\n numberOfColumns: 1,\n})\n\n// Map XY-charts to Dashboard for each channel.\nconst charts = channels.map((channelName, i) => {\n const chart = grid\n .createChartXY({\n columnIndex: 0,\n rowIndex: i,\n columnSpan: 1,\n rowSpan: 1,\n })\n // Hide titles because we have very little space.\n .setTitleFillStyle(emptyFill)\n\n // Configure X-axis of chart to be progressive and have nice interval.\n chart\n .getDefaultAxisX()\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 10_000, stopAxisAfter: false }))\n\n return chart\n})\n\n// Map progressive line series for each chart.\nconst series = charts.map((chart, i) =>\n chart\n .addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n // regularProgressiveStep: true => The X step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n })\n // Destroy automatically outscrolled data (old data becoming out of X axis range).\n // Actual data cleaning can happen at any convenient time (not necessarily immediately when data goes out of range).\n .setDataCleaning({ minDataPointCount: 10000 })\n .setStrokeStyle((lineStyle) => lineStyle.setThickness(1.0)),\n)\n\n// Configure a common data-generator for all channels.\nconst dataGenerator = createProgressiveRandomGenerator().setNumberOfPoints(3600)\n\n// Setup a continuous data-stream for each series.\nseries.forEach((value, i) =>\n dataGenerator\n .generate()\n .setStreamRepeat(true)\n // Use 1000 points / sec data rate (1 millisecond interval for data points).\n // Requesting generator to give an array of data points after every 15 ms.\n // As using 1 millisecond data point interval, it means 15 datapoints\n // have to be generated every round, 1 for each millisecond.\n .setStreamBatchSize(15) // 15 points per batch\n .setStreamInterval(15) // interval in milliseconds\n .toStream()\n .forEach((data) => value.add(data)),\n)\n","url":null,"readme":"This example shows a dashboard with multiple progressive channels of data points using progressive line series.\n\nThe dashboard allows rendering of multiple scenes in a single view port highly efficiently with minimal memory resources. In our case, the rows of dashboard grid are filled with individual charts, where each represents the data channel.\n\n**(!) Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/**\n\n## Progressive series\n\nProgressive series are highly optimized series for the rendering of high-volume and high-density data while keeping full interactivity.\nThese optimizations are enabled by selecting a **_DataPattern_**, which needs to be specified during the creation of the series instance and cannot be changed further for performance related reasons. _More detailed description was explained in previous examples._\n","image":"dashboard5ch"},{"id":"lcjs-example-0503-dashboardBusiness","title":"JavaScript Business Dashboard","tags":["dashboard","xy","bar","column","ui","line","date-time"],"description":"This example shows the specific business case to visualize the costs of a imaginary company across all the departments combined in a single interactive dashboard.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases a business-like-Dashboard.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n SolidFill,\n SolidLine,\n UILayoutBuilders,\n UIElementBuilders,\n AutoCursorModes,\n AxisTickStrategies,\n emptyLine,\n emptyFill,\n AxisScrollStrategies,\n Themes,\n} = lcjs\n\nconst { createProgressiveTraceGenerator } = xydata\n\n// Decide on an origin for DateTime axes (shared between two charts).\nconst dateOrigin = new Date(2018, 0, 1)\nconst dateOriginTime = dateOrigin.getTime()\n\n// Department names\nconst teams = ['Dev', 'Maintenance', 'Support', 'Sales', 'Marketing']\n// 1 data-point per day\nconst pointResolution = 24 * 60 * 60 * 1000\n// Generate data\nconst budgets = Promise.all(\n teams.map((_, index) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(365)\n .generate()\n .toPromise()\n // Map random generated data to start from a particular date with the frequency of dataFrequency\n .then((data) =>\n data.map((point) => ({\n x: dateOriginTime + point.x * pointResolution,\n y: index > 0 ? Math.abs(point.y) * 100 + 100 : Math.abs(point.y) * 50 + 1800,\n })),\n )\n // Shift the data by dateOriginTime\n .then((data) =>\n data.map((p) => ({\n x: p.x - dateOriginTime,\n y: p.y,\n })),\n ),\n ),\n)\n\n// Create dashboard which will host all chart and UI elements\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst db = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: 3,\n numberOfColumns: 2,\n})\n\nconst theme = db.getTheme()\nconst mainStrokeStyle = new SolidLine({\n thickness: 20 / window.devicePixelRatio,\n fillStyle: new SolidFill({ color: theme.examples.unfocusedDataColor }),\n})\nconst selectedFillStyle = new SolidFill({ color: theme.examples.mainDataColor })\n\n// Total\nconst totalBudgetsPerTeam = budgets.then((teamBudgets) =>\n teamBudgets.map((budgetPerTeam) => budgetPerTeam.reduce((sum, v) => sum + v.y, 0)),\n)\n\n// Create Cartesian Chart for Bars\nconst barChart = db\n .createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 2,\n })\n // Disable auto cursor\n .setAutoCursorMode(AutoCursorModes.disabled)\n // Set correct chart title\n .setTitle('Total expenses for 2018 per department')\n // Disable mouse interactions\n .setMouseInteractions(false)\n\n// Get Y axis\nconst axisX = barChart.getDefaultAxisX()\n// Modify X axis\naxisX\n // Disable default ticks.\n .setTickStrategy(AxisTickStrategies.Empty)\n // Disable mouse interactions\n .setMouseInteractions(false)\n // Set static Axis range.\n .setInterval({ start: 0, end: 100 })\n // Disable auto scaling\n .setScrollStrategy(undefined)\n\n// Modify Y axis\nbarChart\n .getDefaultAxisY()\n .setTitle('Expenses ($)')\n .setStrokeStyle((style) => style.setThickness(0))\n .setNibStyle(emptyLine)\n .setMouseInteractions(false)\n// Create series for individual lines\nconst bars = barChart.addSegmentSeries().setHighlightOnHover(false)\n// Calculate\nconst numberOfGapsBetweenBars = teams.length + 1\n// Create custom ticks to mark positions of different departments bars\nconst customTicks = teams.map((team, i) =>\n axisX\n // Add new custom tick\n .addCustomTick()\n // Set team name as marker text\n .setTextFormatter((_) => team)\n // Position custom tick in according with department index\n .setValue((100 / numberOfGapsBetweenBars) * (i + 1))\n // Disable gridstroke.\n .setGridStrokeStyle(emptyLine),\n)\n\n// Create chart for a single department costs distribution graph\nconst lineChart = db\n .createChartXY({\n columnIndex: 0,\n rowIndex: 2,\n columnSpan: 2,\n rowSpan: 1,\n })\n .setPadding({ right: 40 })\n// Set the row height for the third row to take 50% of view space.\ndb.setRowHeight(2, 2)\n// Create simple line series\nconst lineSeries = lineChart\n .addLineSeries()\n .setName('Total Expenses')\n // Set selected fill color for the series\n .setStrokeStyle((style) => style.setFillStyle(selectedFillStyle))\n\nlineChart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime, (tickStrategy) => tickStrategy.setDateOrigin(dateOrigin))\n\n// Style chart selected department costs distribution\nbudgets.then((costsOfTeams) => {\n // Finds the peak value across all departments\n const max = costsOfTeams.reduce((max, costs) => costs.reduce((lMax, cost) => (lMax > cost.y ? lMax : cost.y), max), 0)\n // Get Y axis\n lineChart\n .getDefaultAxisY()\n .setTitle('Expenses ($)')\n // Disable auto scaling\n .setScrollStrategy(AxisScrollStrategies.fitting)\n // Set Y scale interval so that costs distribution fits\n .setInterval({ start: 0, end: max, stopAxisAfter: false })\n})\n\nlineSeries.setCursorResultTableFormatter((builder, series, Xvalue, Yvalue) => {\n // Find cached entry for the figure.\n return builder\n .addRow('Total expenses')\n .addRow('Date: ' + series.axisX.formatValue(Xvalue))\n .addRow('Expenses: $' + Yvalue.toFixed(2))\n})\n\n// Create interactive Bar chart\nPromise.all([totalBudgetsPerTeam, budgets]).then(([values, costsOfTeams]) => {\n // Create bar for each department\n // Departments are marked by custom ticks\n const barCol = customTicks.map((tick, i) => {\n // Get custom tick position\n const pos = tick.getValue()\n // Add Line which represents bar\n // Line X position is based on custom tick value\n return bars.add({\n startX: pos,\n startY: 0,\n endX: pos,\n endY: values[i],\n })\n })\n // Create function which shows costs distribution per day for selected department\n const selectedDepartment = (i) => {\n // Change the chart title according to the selected department\n lineChart.setTitle(`${teams[i]} expenses per day`)\n // Remove points which belong to costs distribution of previously selected department\n lineSeries.clear()\n // Add points for costs distribution of newly selected department\n lineSeries.add(costsOfTeams[i])\n // Set main color to all bars\n barCol.forEach((bar) => bar.setStrokeStyle(mainStrokeStyle))\n customTicks.forEach((tick) => tick.setMarker((marker) => marker.setTextFont((font) => font.setWeight('normal'))))\n // Set special color for selected bar\n barCol[i].setStrokeStyle((strokeStyle) => strokeStyle.setFillStyle(selectedFillStyle))\n customTicks[i].setMarker((marker) => marker.setTextFont((font) => font.setWeight('bold')))\n }\n // Attach event listener for mouse/touch events of each bar\n barCol.forEach((bar, i) => {\n bar.onMouseEnter(() => selectedDepartment(i))\n bar.onTouchStart(() => selectedDepartment(i))\n })\n // Select the first department at initial value\n selectedDepartment(0)\n})\n\n// Draw text field with total amount of costs and description\nconst column = db\n // Create a dashboard without any content,\n // but with possibility to host any UI element\n .createUIPanel({\n columnIndex: 1,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n })\n // Add a column structure to the UI panel\n .addUIElement(UILayoutBuilders.Column)\n .setPosition({ x: 50, y: 50 })\n .setPadding({ right: 40 })\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n\ntotalBudgetsPerTeam.then((teamCosts) => {\n // Add the first row to the column\n const firstRow = column.addElement(UILayoutBuilders.Row)\n // Add a gap which allocates all empty space in front of text\n firstRow.addGap()\n // Add text element right after gap\n firstRow.addElement(\n UIElementBuilders.TextBox\n // Modify TextBox builder to style the text field\n .addStyler((textBox) =>\n textBox\n // Define font settings for the text box\n .setTextFont((fontSettings) => fontSettings.setSize(75 / window.devicePixelRatio))\n // Define content of the text box\n .setText('$' + teamCosts.reduce((sum, cost) => sum + cost, 0).toFixed()),\n ),\n )\n // Add a gap which allocates all empty space right after text\n firstRow.addGap()\n // Add a text box to the second row of the column\n column.addElement(\n UIElementBuilders.TextBox\n // Modify TextBox builder to style the text field\n .addStyler((textBox) =>\n textBox.setTextFont((fontSettings) => fontSettings.setSize(25 / window.devicePixelRatio)).setText('Total company expenses'),\n ),\n )\n})\n\n// Draw total costs distribution per days\nconst totalCostsChart = db\n // Create a cartesian chart\n .createChartXY({\n columnIndex: 1,\n rowIndex: 1,\n columnSpan: 1,\n rowSpan: 1,\n })\n // Specify ChartXY title\n .setTitle('Total expenses per day')\n .setPadding({ right: 40 })\n\ntotalCostsChart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime, (tickStrategy) => tickStrategy.setDateOrigin(dateOrigin))\n\nconst totalCost = totalCostsChart\n // Add the smooth line\n .addSplineSeries()\n .setName('Total Expenses ($)')\n // Change the thickness of the stroke\n .setStrokeStyle((strokeStyle) => strokeStyle.setThickness(2))\n\nbudgets.then((teamBudgets) => {\n // Calculate total amount of costs per day\n const totalCostsPerDays = new Array(365)\n for (let i = 0; i < 365; i++) {\n totalCostsPerDays[i] = {\n x: i * pointResolution,\n y: teams.reduce((sum, _, teamIndex) => sum + teamBudgets[teamIndex][i].y, 0),\n }\n }\n // Draw a smooth line for total amount of costs per day\n totalCost\n // Hide points\n .setPointFillStyle(emptyFill)\n // Add data\n .add(totalCostsPerDays)\n})\ntotalCost.setCursorResultTableFormatter((builder, series, Xvalue, Yvalue) => {\n // Find cached entry for the figure.\n return builder\n .addRow('Total expenses')\n .addRow('Date: ' + series.axisX.formatValue(Xvalue))\n .addRow('Expenses: $' + Yvalue.toFixed(2))\n})\ntotalCostsChart.getDefaultAxisY().setTitle('Expenses ($)')\n","url":null,"readme":"The data visualization tools are widely used in all fields of industries. This example shows the specific business case to visualize the costs of the _imaginary company_ across all the departments for the whole year combined in a single interactive dashboard.\n\n#### Dashboard layout\n\nThe dashboard grid is created with 4 rows and 2 columns. Some visualization components in this example fill multiple cells by explicitly providing a row- & column- span during the creation.\n\n**(!) Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/**\n\n1. _Top-left cell._ The cell contains a chart that shows the costs per year for each department using **_Bar Chart or Column Chart_** implemented with **_SegmentSeries_** different tool than **_RectangleSeries_**. Segment series provides an ability to create and place freely line segments by specifying the start & end.\n\n ```javascript\n // Create XY chart and attach to the dashboard.\n const barChart = dashboard.createChartXY({\n columnIndex: 2,\n rowIndex: 0,\n columnSpan: 2,\n rowSpan: 1,\n })\n\n // Add segment series to series individual line segments.\n // This series uses default axes.\n const bars = barChart.addSegmentSeries()\n ```\n\n The segment series accepts input in the following format { startX: number, startY: number, endX: number, endY: number }. The series returns the created line segment to give an ability of further modifications. The chart fills 2 rows & 1 column.\n\n ```javascript\n // Add line segment.\n const column = bars.add({\n startX: 10,\n startY: 10,\n endX: 20,\n endY: 20,\n })\n ```\n\n Regarding the customization, each column can be configured to have individual styling and mouse & touch events. Each chart and series has mouse/touch events. Search in our API documentation by starting to type \"onMouse\".\n\n ```javascript\n // Configure the created bar column.\n column\n .setStrokeStyle( style => ... )\n .onMouseEnter( () => pointerEnterHandler )\n .onTouchEvent( () => pointerEnterHandler )\n ```\n\n2. _Top-right cell, upper part._ This cell contains a UI panel that shows the total company costs for the whole year. UI panels are able to visualize only UI components. The chart fills 1 row & 1 column.\n\n ```javascript\n // Create UI panel and attach to the dashboard.\n const panel = dashboard.createUIPanel({\n columnIndex: 3,\n rowIndex: 1,\n columnSpan: 1,\n rowSpan: 1,\n })\n\n // Add UI element specifying the builder.\n // E.g. CheckBox, Button, Legend, etc.\n panel.addUIElement(/* builder from the library */)\n ```\n\n3. _Top-right cell, lower part._ This cell contains a chart which shows the only costs for a single department for each day of the year. The chart renders the line series with data gathered by moving the mouse over the column in the bar chart. The chart fills 1 row & 1 column.\n\n ```javascript\n // Decide on an origin for DateTime axes.\n const dateTimeTickStrategy = AxisTickStrategies.DateTime(new Date(2018, 0, 1))\n\n // Create a chart for visualizing the costs of selected department.\n // Specify DateTime format for x-axis labels.\n const lineChart = dashboard.createChartXY({\n columnIndex: 2,\n rowIndex: 1,\n columnSpan: 1,\n rowSpan: 1,\n chartXYOptions: { defaultAxisXTickStrategy: dateTimeTickStrategy },\n })\n\n // Create line series for elected department.\n const lineSeries = lineChart.addLineSeries()\n ```\n\n4. _Bottom cell._ This cell contains a chart which shows the smooth line ( using **_SplineSeries_** ) of total costs across all the apartments during the whole year. The chart fills 2 rows & 2 columns.\n\n ```javascript\n // Create a chart for visualizing the total costs of the company.\n // Specify DateTime format for x-axis labels similarly as before.\n const totalCostsChart = dashboard.createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 2,\n rowSpan: 2,\n chartXYOptions: { defaultAxisXTickStrategy: dateTimeTickStrategy },\n })\n\n // Create line series for total costs of the company.\n const lineSeries = lineChart.addSplineSeries()\n ```\n","image":"dashboardBusiness"},{"id":"lcjs-example-0504-dashboard2chs1000pps","title":"Dashboard 2 Channels 1000 pps","tags":["dashboard","line","xy","datapattern","datacleaning"],"description":"This example shows different progressive data-patterns, scrolling strategies, custom axes and function generators inside a dashboard.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases different directions of progressivity and using custom axes.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisScrollStrategies, Themes } = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveFunctionGenerator } = xydata\n\nconst viewRange = Math.PI * 2 * 10\n\n// Create Dashboard.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst grid = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: 1,\n numberOfColumns: 2,\n})\n\n// Create two XY-charts.\nconst chart1 = grid.createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n})\nconst chart2 = grid.createChartXY({\n columnIndex: 1,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n})\n\n// Create progressive series with different directions and configure Y-axes suitably.\n// First, a vertically regressive series.\nchart1.setTitle('Vertical regressive')\nchart1.getDefaultAxisY().setInterval({ start: viewRange, end: 0, stopAxisAfter: false }).setScrollStrategy(AxisScrollStrategies.regressive)\nconst series1 = chart1\n .addLineSeries({\n dataPattern: {\n // pattern: 'RegressiveY' => Each consecutive data point has decreased Y coordinate.\n pattern: 'RegressiveY',\n // regularProgressiveStep: true => The Y step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n })\n // Destroy automatically outscrolled data (old data becoming out of scrolling axis range).\n // Actual data cleaning can happen at any convenient time (not necessarily immediately when data goes out of range).\n .setDataCleaning({ minDataPointCount: 10000 })\n // Point to nearest Y data point with auto cursor.\n .setCursorSolveBasis('nearest-y')\n\n// Second, a vertically progressive series with custom axis.\nchart2.setTitle('Vertical progressive')\n// Add new axis to 'right' side of chart.\nconst customAxisY = chart2\n .addAxisY(true)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - viewRange, stopAxisAfter: false }))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\nconst series2 = chart2\n .addLineSeries({\n yAxis: customAxisY,\n dataPattern: {\n // pattern: 'ProgressiveY' => Each consecutive data point has increased Y coordinate.\n pattern: 'ProgressiveY',\n // regularProgressiveStep: true => The Y step between each consecutive data point is regular (for example, always `1.0`).\n regularProgressiveStep: true,\n },\n })\n // Destroy automatically outscrolled data (old data becoming out of scrolling axis range).\n // Actual data cleaning can happen at any convenient time (not necessarily immediately when data goes out of range).\n .setDataCleaning({ minDataPointCount: 10000 })\n // Point to nearest Y data point with auto cursor.\n .setCursorSolveBasis('nearest-y')\n\n// Dispose unused default Y-axis.\nchart2.getDefaultAxisY().dispose()\n\n// Lastly, setup data-generation for both series.\ncreateProgressiveFunctionGenerator()\n .setSamplingFunction(Math.sin)\n .setEnd(Math.PI * 2)\n .setStep(0.015)\n .generate()\n // 1 second / 20 milliseconds * 20 points per batch = 1000 points / sec\n .setStreamBatchSize(20)\n .setStreamInterval(20)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => {\n // Transform point to suit series.\n series1.add({ x: point.y, y: -point.x })\n })\n\ncreateProgressiveFunctionGenerator()\n .setSamplingFunction((x) => Math.sin(x * 0.5) + Math.sin(x) + Math.cos(x * 1.5) + Math.cos(x * 0.25))\n .setEnd(Math.PI * 100)\n .setStep(0.015)\n .generate()\n // 1000 points / sec\n .setStreamBatchSize(20)\n .setStreamInterval(20)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => {\n // Transform point to suit series.\n series2.add({ x: point.y, y: point.x })\n })\n","url":null,"readme":"This example shows different progressive data-patterns, scrolling strategies, custom axes and function generators inside a dashboard.\n","image":"dashboard2ch"},{"id":"lcjs-example-0505-dashboardMultiDirection","title":"Dashboard Multi-Direction","tags":["dashboard","xy","line","point"],"description":"This example shows series/axes progressing to all kinds of directions inside a dashboard.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases series/axes progressing to all kinds of directions inside a dashboard.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisScrollStrategies, Themes } = lcjs\n\n// Import data-generators from 'xydata'-library.\nconst { createProgressiveTraceGenerator, createTraceGenerator } = xydata\n\n// Create a 3x3 dashboard.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst grid = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: 3,\n numberOfColumns: 3,\n})\n\n// Add charts to dashboard.\nconst cells = [\n { row: 1, col: 0 },\n { row: 2, col: 1 },\n { row: 1, col: 2 },\n { row: 0, col: 1 },\n { row: 1, col: 1 },\n]\nconst chooseRandom = (options) => options[Math.round(Math.random() * (options.length - 1))]\nconst createCell = (cell) => {\n const chart = grid.createChartXY({\n columnIndex: cell.col,\n rowIndex: cell.row,\n columnSpan: 1,\n rowSpan: 1,\n })\n // Add a random omni-directional series.\n const type = chooseRandom(['PointSeries', 'LineSeries'])\n // Setup data-generation for series.\n if (cell.row == cell.col) {\n const series = chart['add' + type]()\n if (type === 'LineSeries') {\n series.setCursorSolveBasis('nearest')\n }\n // Random trace\n createTraceGenerator()\n .setNumberOfPoints(100000)\n .generate()\n .setStreamInterval(50)\n .setStreamBatchSize(10)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => series.add(point))\n } else {\n // Random progressive trace with mapped direction.\n const flipPlane = cell.col == 1\n const mul = { x: cell.col == 0 ? -1 : 1, y: cell.row == 0 ? 1 : -1 }\n // Configure axes.\n let axisX = chart.getDefaultAxisX(),\n axisY = chart.getDefaultAxisY()\n if (cell.row == cells.reduce((prev, cell) => Math.max(prev, cell.row), 0)) {\n axisX.dispose()\n axisX = chart.addAxisX(true)\n }\n if (cell.col == 0) {\n axisY.dispose()\n axisY = chart.addAxisY(true)\n }\n if (mul.x < 0) {\n axisX\n .setInterval({ start: -100, end: 0, stopAxisAfter: false })\n .setScrollStrategy(flipPlane ? AxisScrollStrategies.fitting : AxisScrollStrategies.regressive)\n } else\n axisX\n .setInterval({ start: 0, end: 100, stopAxisAfter: false })\n .setScrollStrategy(flipPlane ? AxisScrollStrategies.fitting : AxisScrollStrategies.progressive)\n\n if (mul.y < 0) {\n axisY\n .setInterval({ start: -100, end: 0, stopAxisAfter: false })\n .setScrollStrategy(flipPlane ? AxisScrollStrategies.regressive : AxisScrollStrategies.fitting)\n } else\n axisY\n .setInterval({ start: 0, end: 100, stopAxisAfter: false })\n .setScrollStrategy(flipPlane ? AxisScrollStrategies.progressive : AxisScrollStrategies.fitting)\n\n const series = chart['add' + type](axisX, axisY)\n if (type === 'LineSeries') {\n series.setCursorSolveBasis('nearest')\n }\n createProgressiveTraceGenerator()\n .setNumberOfPoints(100000)\n .generate()\n .setStreamInterval(50)\n .setStreamBatchSize(2)\n .setStreamRepeat(true)\n .toStream()\n .forEach((point) => series.add({ x: (flipPlane ? point.y : point.x) * mul.x, y: (flipPlane ? point.x : point.y) * mul.y }))\n }\n return chart.setTitle(type)\n}\ncells.map(createCell)\n","url":null,"readme":"This example shows series/axes progressing to all kinds of directions inside a dashboard.\n","image":"dashboardMulti"},{"id":"lcjs-example-0506-dashboardPie","title":"JavaScript Dashboard With Pie, XY, Spider and Donut Charts","tags":["dashboard","pie","radar","spider","web","donut","xy","area","legendbox"],"description":"This example shows different kinds of charts inside a dashboard.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases series/axes progressing to all kinds of directions inside a dashboard.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n SliceLabelFormatters,\n AreaSeriesTypes,\n PointShape,\n UIOrigins,\n UIDraggingModes,\n PieChartTypes,\n UIElementBuilders,\n emptyFill,\n emptyLine,\n Themes,\n} = lcjs\n\n// Create a 5x2 dashboard.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst grid = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: 3,\n numberOfColumns: 2,\n})\n\n// Create a legendBox docked to the Dashboard.\nconst legend = grid.createLegendBoxPanel({\n columnIndex: 1,\n rowIndex: 2,\n columnSpan: 1,\n rowSpan: 1,\n})\n\nconst pieType = window.innerWidth > 850 ? PieChartTypes.LabelsOnSides : PieChartTypes.LabelsInsideSlices\n\n//Pie Chart\n{\n //Create a Pie Chart\n const pie = grid\n .createPieChart({\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n pieOptions: { type: pieType },\n })\n .setTitle('CPU Usage')\n .setMultipleSliceExplosion(true)\n\n // ----- CPU Usage data -----\n const data = [\n { name: 'OS', value: 20 },\n { name: 'Browser', value: 5 },\n { name: 'Video editor', value: 10 },\n { name: 'Unused', value: 65 },\n ]\n\n // ----- Create Slices -----\n const slices = data.map((item) => pie.addSlice(item.name, item.value))\n\n // Specify function which generates text for Slice Labels(LabelFormatter).\n pie.setLabelFormatter(SliceLabelFormatters.NamePlusRelativeValue)\n pie.setLabelFont((font) => font.setSize(15))\n\n // Add Pie chart to LegendBox\n legend.add(pie)\n}\n// Area Range\n{\n // Create a XY Chart.\n const xyChart = grid\n .createChartXY({\n columnIndex: 1,\n rowIndex: 1,\n columnSpan: 1,\n rowSpan: 1,\n })\n .setTitle('Power Consumption')\n\n // ---- The Area Series both have the same baseline and direction. ----\n const areaCPU = xyChart.addAreaSeries({ type: AreaSeriesTypes.Positive }).setName('CPU')\n\n const areaGPU = xyChart.addAreaSeries({ type: AreaSeriesTypes.Positive }).setName('GPU')\n\n xyChart.getDefaultAxisX().setTitle('Component Load (%)')\n xyChart.getDefaultAxisY().setTitle('Watts')\n\n const cpuData = [\n { x: 0 },\n { x: 4 },\n { x: 8 },\n { x: 12 },\n { x: 16 },\n { x: 20 },\n { x: 24 },\n { x: 28 },\n { x: 32 },\n { x: 36 },\n { x: 40 },\n { x: 44 },\n { x: 48 },\n { x: 52 },\n { x: 56 },\n { x: 60 },\n { x: 64 },\n { x: 68 },\n { x: 72 },\n { x: 76 },\n { x: 80 },\n { x: 84 },\n { x: 88 },\n { x: 92 },\n { x: 96 },\n { x: 100 },\n ]\n const gpuData = [\n { x: 0 },\n { x: 4 },\n { x: 8 },\n { x: 12 },\n { x: 16 },\n { x: 20 },\n { x: 24 },\n { x: 28 },\n { x: 32 },\n { x: 36 },\n { x: 40 },\n { x: 44 },\n { x: 48 },\n { x: 52 },\n { x: 56 },\n { x: 60 },\n { x: 64 },\n { x: 68 },\n { x: 72 },\n { x: 76 },\n { x: 80 },\n { x: 84 },\n { x: 88 },\n { x: 92 },\n { x: 96 },\n { x: 100 },\n ]\n\n areaCPU.add(cpuData.map((point) => ({ x: point.x, y: point.x * 3.2 + Math.random() * 9.4 })))\n areaGPU.add(gpuData.map((point) => ({ x: point.x, y: point.x * 2.8 + Math.random() * 6.6 })))\n\n // Set the custom result table\n areaCPU.setCursorResultTableFormatter((builder, series, position, highValue, lowValue) => {\n return builder\n .addRow('CPU')\n .addRow('Power Consumption ' + highValue.toFixed(0) + ' watts')\n .addRow('component load ' + position.toFixed(0) + ' %')\n })\n areaGPU.setCursorResultTableFormatter((builder, series, position, highValue, lowValue) => {\n return builder\n .addRow('GPU')\n .addRow('Power Consumption ' + highValue.toFixed(0) + ' watts')\n .addRow('component load ' + position.toFixed(0) + ' %')\n })\n\n // Add XY Chart to LegendBox\n legend.add(xyChart)\n}\n// Spider\n{\n //Create a Spider Chart\n const chart = grid\n .createSpiderChart({\n columnIndex: 1,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n })\n .setTitle('Average Component Load')\n .setScaleLabelFont((font) => font.setSize(12))\n .setAxisLabelFont((font) => font.setSize(14).setStyle('italic'))\n\n chart\n .addSeries(PointShape.Circle)\n .setName('System Load')\n .addPoints(\n { axis: 'CPU', value: 10 },\n { axis: 'Memory', value: 10 },\n { axis: 'Network', value: 20 },\n { axis: 'Hard-Drive', value: 40 },\n { axis: 'GPU', value: 20 },\n )\n .setCursorResultTableFormatter((tableContentBuilder, series, value, axis, formatValue) =>\n tableContentBuilder\n .addRow(series.name)\n .addRow(axis)\n .addRow(value + ' %'),\n )\n // Add Spider Chart to LegendBox\n legend.add(chart)\n}\n\n//Donut Chat\n{\n //Create a Donut Chart\n const donut = grid\n .createPieChart({\n columnIndex: 0,\n rowIndex: 1,\n columnSpan: 1,\n rowSpan: 2,\n pieOptions: { type: pieType },\n })\n .setTitle('Memory Usage')\n .setMultipleSliceExplosion(false)\n .setInnerRadius(50)\n\n // ----- Static data -----\n const data = {\n memory: ['OS', 'Browser', 'Video editor', 'Unused'],\n values: [1000, 692, 2000, 4500],\n }\n // Preparing data for each Slice\n const processedData = []\n let totalMemoryUse = 0\n for (let i = 0; i < data.values.length; i++) {\n totalMemoryUse += data.values[i]\n processedData.push({ name: `${data.memory[i]}`, value: data.values[i] })\n }\n\n // ----- Create Slices -----\n processedData.map((item) => donut.addSlice(item.name, item.value))\n donut.setLabelFormatter(SliceLabelFormatters.NamePlusValue)\n donut.setLabelFont((font) => font.setSize(15))\n\n //add Donut to Legend Box\n legend.add(donut)\n\n // ----- Add TextBox below the Donut Chart-----\n donut\n .addUIElement(UIElementBuilders.TextBox)\n .setPosition({ x: 50, y: 10 })\n .setOrigin(UIOrigins.Center)\n .setDraggingMode(UIDraggingModes.notDraggable)\n .setMargin(5)\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n .setTextFont((fontSettings) => fontSettings.setSize(12))\n .setText(`Total memory : ${totalMemoryUse} MB`)\n}\n\ngrid.setRowHeight(0, 2)\n\n// Reduce Font size of LegendBoxes.\nlegend.setLegendBoxes((legendBox) =>\n legendBox.setTitleFont((font) => font.setSize(12)).setEntries((entry) => entry.setTextFont((font) => font.setSize(12))),\n)\n","url":null,"readme":"This example shows different kinds of charts inside a dashboard.\n","image":"dashboardPie"},{"id":"lcjs-example-0507-dashboardFiberAnalysis","title":"JavaScript Distance Intensity Chart","tags":["dashboard","xy","heatmap","area","palette","legendbox"],"description":"This example showcases a real life application used in Fiber Analysis","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases a real life application used in Fiber Monitoring\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n AxisTickStrategies,\n emptyLine,\n emptyFill,\n AreaSeriesTypes,\n ColorRGBA,\n regularColorSteps,\n PalettedFill,\n LUT,\n emptyTick,\n UIElementBuilders,\n UIOrigins,\n Themes,\n} = lcjs\n\nconst { createProgressiveTraceGenerator } = xydata\n\nconst CONFIG = {\n /**\n * Step between optical fibre measurements (Meters).\n */\n opticalFibreDistanceStep: 10,\n /**\n * Start value for optical fibre axis (Meters).\n */\n opticalFibreDistanceStart: 0,\n /**\n * End value for optical fibre axis (Meters).\n */\n opticalFibreDistanceEnd: 3200,\n /**\n * Step between each heat map row along Time Axis (lower chart Y axis) (Milliseconds).\n */\n timeStep: 1000,\n /**\n * Start time along Time Axis (lower chart Y axis) (Milliseconds).\n */\n timeStart: new Date('2021-06-17T08:54:04').getTime(),\n /**\n * End time along Time Axis (lower chart Y axis) (Milliseconds).\n */\n timeEnd: new Date('2021-06-17T08:54:38').getTime(),\n}\n\n// All Axis coordinates on Date Axis are offset by this value to prevent zooming issues.\nconst dateOrigin = CONFIG.timeStart\n\nconst dataPromise = new Promise(async (resolve) => {\n const timeStepsCount = Math.ceil((CONFIG.timeEnd - CONFIG.timeStart) / CONFIG.timeStep)\n const opticalFibreLengthX = Math.ceil(\n (CONFIG.opticalFibreDistanceEnd - CONFIG.opticalFibreDistanceStart) / CONFIG.opticalFibreDistanceStep,\n )\n const traceDataArray = await Promise.all(\n new Array(timeStepsCount).fill(0).map((_, i) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(opticalFibreLengthX)\n .generate()\n .toPromise()\n .then((xyPoints) => xyPoints.map((xy) => Math.abs(xy.y * 100))),\n ),\n )\n // `traceDataArray` can be supplied into heat map series as is,\n // calculate data for Area Series by summing every trace column value for every X coordinate.\n const areaData = new Array(opticalFibreLengthX).fill(0).map((_, iX) => ({\n x: CONFIG.opticalFibreDistanceStart + iX * CONFIG.opticalFibreDistanceStep,\n y: traceDataArray.reduce((sum, cur) => sum + cur[iX], 0),\n }))\n\n resolve({\n traceDataArray,\n areaData,\n })\n})\n\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Distance Intensity Chart')\n\nchart.yAxis.dispose()\nconst axisTopY = chart.addAxisY({ iStack: 1 }).setTitle('Intensity Sum').setLength({ pixels: 200 }).setMargins(10, 0)\nconst axisX = chart.axisX.setTitle('Optical Fiber Distance (m)')\n\nconst formatterOptionsDateTimeAxis = {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n}\n\nconst axisBottomY = chart\n .addAxisY({ iStack: 0 })\n .setTitle('Time')\n .setTickStrategy(AxisTickStrategies.DateTime, (ticks) =>\n ticks\n .setDateOrigin(new Date(dateOrigin))\n .setGreatTickStyle(emptyTick)\n .setMinorTickStyle(emptyTick)\n .setFormattingDay({}, formatterOptionsDateTimeAxis, {})\n .setFormattingDecade(formatterOptionsDateTimeAxis, {})\n .setFormattingHour({}, formatterOptionsDateTimeAxis, {})\n .setFormattingMilliSecond({}, formatterOptionsDateTimeAxis)\n .setFormattingMinute({}, formatterOptionsDateTimeAxis, {})\n .setFormattingMonth({}, formatterOptionsDateTimeAxis, {})\n .setFormattingSecond({}, formatterOptionsDateTimeAxis)\n .setFormattingWeek({}, formatterOptionsDateTimeAxis, {})\n .setFormattingYear(formatterOptionsDateTimeAxis, {}),\n )\n\nconst theme = chart.getTheme()\nconst lut = new LUT({\n interpolate: false,\n steps: [{ value: 0, color: ColorRGBA(0, 0, 0, 0) }, ...regularColorSteps(200, 600, theme.examples.intensityColorPalette)],\n})\n\n// Visualize data.\ndataPromise.then((data) => {\n const { traceDataArray, areaData } = data\n\n const areaSeries = chart\n .addAreaSeries({ type: AreaSeriesTypes.Positive, yAxis: axisTopY })\n .add(areaData)\n .setCursorResultTableFormatter((builder, series, x, y) =>\n builder.addRow('Intensity sum:', '', y.toFixed(1)).addRow('Optical fiber distance:', '', axisX.formatValue(x) + ' m'),\n )\n\n const heatmapOptions = {\n columns: traceDataArray[0].length,\n rows: traceDataArray.length,\n start: {\n x: CONFIG.opticalFibreDistanceStart,\n y: CONFIG.timeStart - dateOrigin,\n },\n step: {\n x: CONFIG.opticalFibreDistanceStep,\n y: CONFIG.timeStep,\n },\n dataOrder: 'rows',\n yAxis: axisBottomY,\n }\n const heatmapSeries = chart\n .addHeatmapGridSeries(heatmapOptions)\n .setIntensityInterpolation('disabled')\n .invalidateIntensityValues(traceDataArray)\n .setFillStyle(\n new PalettedFill({\n lookUpProperty: 'value',\n lut,\n }),\n )\n .setWireframeStyle(emptyLine)\n .setCursorResultTableFormatter((builder, series, dataPoint) =>\n builder\n .addRow('Intensity:', '', dataPoint.intensity.toFixed(1))\n .addRow('Optical fiber distance:', '', axisX.formatValue(dataPoint.x) + ' m')\n .addRow('Time:', '', axisBottomY.formatValue(dataPoint.y)),\n )\n\n chart.setPadding({\n bottom: 64,\n })\n\n const lutRange = chart\n .addUIElement(UIElementBuilders.LUTRange)\n .setLUT(lut)\n .setLUTLength(500)\n .setLookUpUnit('Intensity')\n .setPosition({ x: 50, y: 0 })\n .setOrigin(UIOrigins.CenterBottom)\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n})\n","url":null,"readme":"This example is based on a real life usage scenario of _LightningChart JS_ in the field of **Fiber Analysis**.\n\n_Fiber Analysis_ refers to the assessment of fiber quality to analyze attenuation and other fiber optic performance metrics during single point of time or across a time period.\n\nThis example showcases an example dashboard for analyzing fiber properties over a short time period (~30 seconds).\n\nThe metrics are gathered at several locations across the fiber to help spot problem locations (total fibre length is more than 3 kilometers).\n\nThe primary metric, _intensity_, is recorded for each location along fibre (meters) and for various time steps. The _intensity_ value is _abstract_, meaning that it could reflect many different values for different analysis purposes. A common property in fiber metrics to analyse is _Attenuation_.\n\nThe color of each sample is colored in a _heat map grid series_ based on a color lookup table, which makes identifying _hot spots_ convenient (for example, orange is bad, blue is ok).\n\nThe data used in the example is randomly generated each time the example is run.\n","image":"dashboardWaterfall"},{"id":"lcjs-example-0508-dashboardMedical","title":"JavaScript Medical Dashboard","tags":["dashboard","xy","line","realtime","ui","datapattern","datacleaning"],"description":"Example of a Medical Dashboard with ECG/EKG, blood pressure, flow volume and oxygen saturation.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/**\n * LightningChart JS example showcasing a medical Dashboard.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst {\n AxisScrollStrategies,\n AxisTickStrategies,\n AutoCursorModes,\n emptyFill,\n SolidFill,\n emptyLine,\n lightningChart,\n UIOrigins,\n UIElementBuilders,\n UILayoutBuilders,\n Themes,\n} = lcjs\n\nconst TIME_DOMAIN = 10 * 1000\nconst SAMPLE_RATE = 1000 // points per s\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0508/medical-data.json')\n .then((r) => r.json())\n .then((data) => {\n const { ecg, bloodPressure, bloodVolume, bloodOxygenation } = data\n\n const channels = [\n {\n shortName: 'ECG/EKG',\n name: 'Electrocardiogram',\n dataSet: ecg,\n },\n {\n shortName: 'NIBP',\n name: 'Blood pressure',\n dataSet: bloodPressure,\n },\n {\n shortName: 'BFV',\n name: 'Blood flow volume',\n dataSet: bloodVolume,\n },\n {\n shortName: 'Sp02',\n name: 'Blood oxygen saturation',\n dataSet: bloodOxygenation,\n },\n ]\n const lc = lightningChart()\n const chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Medical Dashboard')\n .setMouseInteractions(false)\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setPadding({ right: 140 })\n chart.getDefaultAxisY().dispose()\n const axisECG = chart.addAxisY({ iStack: 3 }).setLength({ relative: 0.4 })\n const axisNIBP = chart.addAxisY({ iStack: 2 }).setLength({ relative: 0.3 })\n const axisBFV = chart.addAxisY({ iStack: 1 }).setLength({ relative: 0.2 })\n const axisSp = chart.addAxisY({ iStack: 0 }).setLength({ relative: 0.2 })\n const yAxisList = [axisECG, axisNIBP, axisBFV, axisSp]\n const theme = chart.getTheme()\n const axisX = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time)\n .setDefaultInterval((state) => ({\n end: state.dataMax,\n start: (state.dataMax ?? 0) - TIME_DOMAIN,\n stopAxisAfter: false,\n }))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\n const channelsComponents = channels.map((channel, i) => {\n const axisY = yAxisList[i]\n .setMouseInteractions(false)\n .setTickStrategy(AxisTickStrategies.Empty)\n .setStrokeStyle(emptyLine)\n .setAnimationScroll(false)\n const series = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n automaticColorIndex: Math.max(i - 1, 0),\n yAxis: axisY,\n })\n .setAreaFillStyle(emptyFill)\n .setName(channel.name)\n .setMaxSampleCount(50_000)\n if (channel.name === 'Electrocardiogram') {\n series.setStrokeStyle((stroke) =>\n stroke.setFillStyle(\n new SolidFill({\n color: theme.examples.badGoodColorPalette[theme.examples.badGoodColorPalette.length - 1],\n }),\n ),\n )\n }\n return { axisY, series }\n })\n\n const uiList = channelsComponents.map((components, i) => {\n const axisY = components.axisY\n const channel = channels[i]\n const ui = chart\n .addUIElement(UILayoutBuilders.Column, chart.coordsRelative)\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n .setMouseInteractions(false)\n .setVisible(false)\n\n ui.addElement(UIElementBuilders.TextBox).setText(channel.shortName)\n ui.addElement(UIElementBuilders.TextBox)\n .setText(channel.name)\n .setTextFont((font) => font.setSize(10))\n const labelSampleRate = ui\n .addElement(UIElementBuilders.TextBox)\n .setText('')\n .setTextFont((font) => font.setSize(10))\n\n let labelBpmValue\n if (channel.name === 'Electrocardiogram') {\n const labelBpm = ui.addElement(UIElementBuilders.TextBox).setMargin({ top: 10 }).setText('BPM')\n labelBpmValue = ui\n .addElement(UIElementBuilders.TextBox)\n .setText('')\n .setTextFont((font) => font.setSize(36))\n }\n\n const positionUI = () => {\n ui.setVisible(true)\n .setPosition(\n chart.translateCoordinate(\n { x: axisX.getInterval().end, y: axisY.getInterval().end },\n { x: axisX, y: axisY },\n chart.coordsRelative,\n ),\n )\n .setOrigin(UIOrigins.LeftTop)\n .setMargin({ left: 10 })\n }\n chart.onResize(positionUI)\n requestAnimationFrame(positionUI)\n\n return {\n labelSampleRate,\n labelBpmValue,\n }\n })\n\n let tSamplePos = window.performance.now()\n let iSampleX = 0\n const addData = () => {\n const tNow = window.performance.now()\n const seriesNewPoints = channelsComponents.map((_) => [])\n while (tNow > tSamplePos) {\n const x = tSamplePos\n for (let i = 0; i < channelsComponents.length; i += 1) {\n const channel = channels[i]\n const dataSet = channel.dataSet\n const sample = dataSet[iSampleX % dataSet.length]\n seriesNewPoints[i].push({ x, y: sample })\n\n if (channel.name === 'Electrocardiogram') {\n updateBpm(sample)\n }\n }\n tSamplePos += 1000 / SAMPLE_RATE\n iSampleX += 1\n }\n channelsComponents.forEach((comp, i) => comp.series.add(seriesNewPoints[i]))\n channelIncomingDataPointsCount += seriesNewPoints[0].length\n requestAnimationFrame(addData)\n }\n requestAnimationFrame(addData)\n\n let channelIncomingDataPointsCount = 0\n let channelIncomingDataPointsLastUpdate = window.performance.now()\n setInterval(() => {\n const tNow = window.performance.now()\n const chDataPointsPerSecond = Math.round((channelIncomingDataPointsCount * 1000) / (tNow - channelIncomingDataPointsLastUpdate))\n const bpm = (beatsCount * 60 * 1000) / (tNow - tStart)\n\n uiList.forEach((ui, i) => {\n ui.labelSampleRate.setText(`${chDataPointsPerSecond} samples / second`)\n if (ui.labelBpmValue) {\n ui.labelBpmValue.setText(`${Math.round(bpm)}`)\n }\n })\n channelIncomingDataPointsCount = 0\n channelIncomingDataPointsLastUpdate = tNow\n }, 2000)\n\n const naiveBeatThreshold = 800\n let tStart = window.performance.now()\n let beatsCount = 0\n const updateBpm = (() => {\n let lastY = 0\n return (newSample) => {\n if (lastY < naiveBeatThreshold && newSample > naiveBeatThreshold) {\n // Beat.\n beatsCount += 1\n }\n lastY = newSample\n }\n })()\n })\n","url":null,"readme":"A medical dashboard example with LightningChart JS.\n\nIncludes real-time visualization of four data channels:\n\n- ECG/EKG | electrocardiogram\n- NIBP | Non-invasive blood pressure measurement\n- BFV | Blood flow volume\n- Sp02 | Blood oxygen saturation\n\nThis application has 4 channels each with ~1000 Hz sample rate, adding up to a total of 4 000 data samples per second.\n\nFor LightningChart, this is on the low end of performance capabilities.\nIn 2021, the LightningChart team hosted several comparison studies on web charts performance, one of which was directly targeted at [scrolling multichannel line charts](https://lightningchart.com/javascript-charts-performance-comparison/) - exactly this type of application.\n\nThe results were shocking, with LightningChart being over 700 times faster than your average \"high performance\" competitor and being able to handle up to 10 000 000 data points per second while keeping display refresh rate over 30 (which is a very good refresh rate).\n\nIn the context of Medical Dashboards, this would mean that you could even monitor up to 10 000 data sources simultaneously, and/or greatly increase the data precision!\n\n**(!) Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/**\n","image":"dashboardMedical","showNew":true},{"id":"lcjs-example-0509-dashboardRealtimeTrading","title":"JavaScript Real-Time Trend Dashboard","tags":["dashboard","xy","line","realtime","ui","datapattern","datacleaning"],"description":"Intensive multi-channel real-time application example with LightningChart","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/**\n * 100 charts, each receive 1000 new data points every second that are immediately displayed in real-time.\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\nconst {\n lightningChart,\n emptyLine,\n UIElementBuilders,\n UIBackgrounds,\n emptyFill,\n SolidLine,\n AxisTickStrategies,\n AxisScrollStrategies,\n UIOrigins,\n TimeFormattingFunctions,\n UIDraggingModes,\n MouseStyles,\n Themes,\n} = lcjs\n\nconst { createProgressiveTraceGenerator } = xydata\n\n// Check whether should display 10x10 dashboard (requires large monitor), or smaller 3x3 dashboard (works on all devices nicely).\nconst queryString = window.location.search\nconst urlParams = new URLSearchParams(queryString)\nconst showFullDashboard = urlParams.get('full') === 'true'\n\nconst COLUMNS = showFullDashboard ? 10 : 3\nconst ROWS = showFullDashboard ? 10 : 3\nconst HISTORYMS = 60 * 1000\n\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart()\n .Dashboard({\n numberOfColumns: COLUMNS,\n numberOfRows: ROWS + 1,\n // theme: Themes.darkGold\n })\n .setSplitterStyle(new SolidLine({ thickness: 0 }))\n\nconst uiPanel = dashboard.createUIPanel({ columnIndex: 0, rowIndex: 0, columnSpan: COLUMNS })\nconst uiPanelHeightPx = showFullDashboard ? 24 : 64\nconst dashboardHeightPx = dashboard.engine.container.getBoundingClientRect().height\ndashboard.setRowHeight(0, (ROWS * uiPanelHeightPx) / (dashboardHeightPx - uiPanelHeightPx))\n\nconst chartList = []\nfor (let column = 0; column < COLUMNS; column += 1) {\n for (let row = 0; row < ROWS; row += 1) {\n const chart = dashboard\n .createChartXY({\n columnIndex: column,\n rowIndex: row + 1,\n })\n .setTitleFillStyle(emptyFill)\n .setTitleMargin({ top: 0, bottom: 0 })\n .setPadding(0)\n .setMouseInteractions(false)\n .setAutoCursor((autoCursor) =>\n autoCursor.setTickMarkerXVisible(false).setTickMarkerYVisible(false).setAutoFitStrategy(undefined),\n )\n const axisX = chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Empty)\n .setMouseInteractions(false)\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - HISTORYMS, stopAxisAfter: false }))\n .setStrokeStyle(emptyLine)\n .setAnimationScroll(false)\n const axisY = chart\n .getDefaultAxisY()\n .setTickStrategy(AxisTickStrategies.Empty)\n .setMouseInteractions(false)\n .setStrokeStyle(emptyLine)\n .setAnimationScroll(false)\n chartList.push(chart)\n }\n}\n\n// Add title\nuiPanel\n .addUIElement(UIElementBuilders.TextBox.setBackground(UIBackgrounds.None))\n .setText(`${COLUMNS * ROWS} live channels (1 ms resolution) 1 minute history`)\n .setMouseInteractions(false)\n .setPosition({ x: 50, y: 100 })\n .setOrigin(UIOrigins.CenterTop)\n\nif (!showFullDashboard) {\n // Add button that will display the full 10x10 dashboard (for users with large monitors).\n uiPanel\n .addUIElement(UIElementBuilders.TextBox)\n .setText('Click here to show full 10x10 dashboard')\n .setPosition({ x: 50, y: 100 })\n .setOrigin(UIOrigins.CenterTop)\n .setMargin(30)\n .setDraggingMode(UIDraggingModes.notDraggable)\n .setMouseStyle(MouseStyles.Point)\n .onMouseClick(() => {\n // Add '?full = true' to URL and reload page.\n let url = window.location.href\n url += (url.split('?')[1] ? '&' : '?') + 'full=true'\n window.location.href = url\n })\n}\n\nconst seriesList = chartList.map((chart, i) => {\n const series = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n // Pass custom supplied index for automatic series coloring.\n automaticColorIndex: i,\n })\n .setName(`Channel ${i + 1}`)\n .setStrokeStyle((stroke) => stroke.setThickness(1))\n .setAreaFillStyle(emptyFill)\n .setMaxSampleCount(HISTORYMS)\n .setCursorResultTableFormatter((builder, _, sample) =>\n builder\n .addRow(series.getName())\n // Display \"age\" of data point, as time passed since current time.\n .addRow(TimeFormattingFunctions.hhmmssmmm(sample.x - window.performance.now()))\n .addRow('Value: ', series.axisY.formatValue(sample.y)),\n )\n return series\n})\n\n// Generate a couple of progressive XY data sets.\n// For saving test data generation time and memory, some channels will display same data set.\nPromise.all(\n new Array(10).fill(0).map((_) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(HISTORYMS)\n .generate()\n .toPromise()\n .then((xyTrace) => {\n // Map generated XY trace data set into a more realistic trading data set.\n const baseLine = 10 + Math.random() * 2000\n const variationAmplitude = baseLine * 0.03\n const yMin = xyTrace.reduce((min, cur) => Math.min(min, cur.y), Number.MAX_SAFE_INTEGER)\n const yMax = xyTrace.reduce((max, cur) => Math.max(max, cur.y), -Number.MAX_SAFE_INTEGER)\n const yIntervalHalf = (yMax - yMin) / 2\n const yTraceBaseline = yMin + yIntervalHalf\n return xyTrace.map((xy) => baseLine + ((xy.y - yTraceBaseline) / yIntervalHalf) * variationAmplitude)\n })\n .then((yList) => {\n // Duplicate data set, reverse it and append to original to get infinitely looping effect.\n yList.push(...yList.slice().reverse())\n return yList\n }),\n ),\n).then((dataSets) => {\n const dataSetLength = dataSets[0].length\n // Pair each series with a random data set.\n const seriesDataPair = seriesList.map((series) => ({\n series,\n dataSet: dataSets[Math.round(Math.random() * (dataSets.length - 1))],\n }))\n // Map series and data set pairs to format where each data set has reference to a list of series that use that data set.\n const dataSetsAndSeries = []\n seriesDataPair.forEach((pair) => {\n const existingItem = dataSetsAndSeries.find((existing) => existing.dataSet === pair.dataSet)\n if (existingItem) {\n existingItem.seriesList.push(pair.series)\n return\n }\n dataSetsAndSeries.push({\n dataSet: pair.dataSet,\n seriesList: [pair.series],\n })\n })\n const dataSetsCount = dataSetsAndSeries.length\n\n const initialDataVisibleCount = 30 * 1000\n let lastX = -initialDataVisibleCount\n const pushData = () => {\n const tNow = window.performance.now()\n // For each unique data set, prepare list of new Y values to add.\n const dataSetNewPoints = dataSetsAndSeries.map((_) => [])\n for (let x = lastX + 1; x < tNow; x += 1) {\n let iSample = x % dataSetLength\n while (iSample < 0) iSample += dataSetLength\n for (let iDataSet = 0; iDataSet < dataSetsCount; iDataSet += 1) {\n const y = dataSetsAndSeries[iDataSet].dataSet[iSample]\n dataSetNewPoints[iDataSet].push(y)\n }\n lastX = x\n }\n // Push XY points into series.\n dataSetsAndSeries.forEach((item, i) => {\n const newPoints = dataSetNewPoints[i]\n item.seriesList.forEach((series) => {\n series.appendSamples({ yValues: newPoints })\n })\n })\n requestAnimationFrame(pushData)\n }\n pushData()\n})\n","url":null,"readme":"As proven in our [2021 line charts performance comparison](https://lightningchart.com/javascript-charts-performance-comparison/), LightningChart JS line charts are **over 700 times faster** than other web charts. Especially in real-time applications LightningChart enables the creation of data visualization applications unlike anything seen before in web pages.\n\nBy default, this example will show a small dashboard that displays nine real-time trends.\n\n**However**, the real treat is activated by pressing the \"Click here to show full 10x10 dashboard\" button inside the chart. This is intended for Desktop users, as the complete application requires quite a bit of space.\n\n![](./assets/show-full.png 'Show full 10x10 Dashboard example')\n\nIn its full size, the example shows 100 line charts. Each chart is connected to a real-time data source (random data), the sampling rate is 1 000 data points per second **for every chart**. This sums up to **100 000** processed data points per second.\n\nIn the previously mentioned performance comparison study we tested this kind of applications with the major manufacturers who claim their charts to be **high-performance oriented** or **the fastest**. The results showed that the wide majority of web charts are not applicable to real-time visualization of even as little as 1 000 data points per second.\n\nWhy not? Because the charts spend too much time processing this amount of data. This can be observed by the web page visibly slowing down, preventing users from interacting with their browser.\n\nTo learn more about LightningChart JS, here are some potentially interesting links:\n\n- [Latest news on LC JS performance](https://lightningchart.com/high-performance-javascript-charts/)\n\n**(!) Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/**\n","image":"dashboardRealtimeTrading"},{"id":"lcjs-example-0510-dashboardDynamic","title":"JavaScript Dynamic Chart Dashboard","tags":["dashboard","xy","ui"],"description":"Example on how a dynamic chart dashboard can be created with LightningChart JS","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/**\n * Example on how a dynamic chart dashboard can be created with LightningChart JS.\n *\n * The use case is an application where charts can be added and removed at users whim to perform different kinds of analysis within a dynamic application setting.\n *\n * This can be achieved out of the box with LightningChart by placing each chart in its own HTML DIV,\n * but this performs slightly worse than if the charts would be inside a Dashboard component.\n *\n * By using a Dashboard, the rendering engine for all Charts can be reused leading to much more faster redrawing and most importantly initial loading speed.\n *\n * Generally, LC JS Dashboards are static sized (for example, 2x2 grid) and size can't be changed afterwards.\n * However, with some creative coding this limitation can be worked around by preallocating the Dashboard for some number of \"maximum charts\"\n * and then programmatically resizing the Dashboard cells which actually have charts in them.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\nconst { lightningChart, emptyFill, Themes } = lcjs\nconst { createProgressiveTraceGenerator } = xydata\n\nconst exampleContainer = document.getElementById('chart') || document.body\nif (exampleContainer === document.body) {\n document.body.style.width = '100vw'\n document.body.style.height = '100vh'\n document.body.style.margin = '0px'\n}\nconst layoutCharts = document.createElement('div')\nexampleContainer.append(layoutCharts)\nlayoutCharts.style.position = 'absolute'\nlayoutCharts.style.width = '100%'\nlayoutCharts.style.minHeight = '100%'\nlayoutCharts.style.display = 'flex'\nlayoutCharts.style.flexDirection = 'column'\n\nconst uiDiv = document.createElement('div')\nexampleContainer.append(uiDiv)\nuiDiv.style.position = 'fixed'\nuiDiv.style.width = '100px'\nuiDiv.style.display = 'flex'\nuiDiv.style.flexDirection = 'column'\nuiDiv.style.backgroundColor = 'transparent'\nuiDiv.style.color = exampleContainer.parentElement && window.getComputedStyle(exampleContainer.parentElement).color\nuiDiv.style.zIndex = '100'\n\nconst uiDivTitle = document.createElement('span')\nuiDiv.append(uiDivTitle)\nuiDivTitle.innerHTML = 'Click to add graph'\n\nconst lc = lightningChart()\nconst charts = []\n\nconst addGraph = (name, data) => {\n const container = document.createElement('div')\n layoutCharts.append(container)\n const chart = lc\n .ChartXY({\n container,\n // theme: Themes.darkGold\n })\n .setTitle('')\n .setPadding({ top: 0, left: 100 })\n\n const axisX = chart.getDefaultAxisX()\n const axisY = chart.getDefaultAxisY().setThickness({ min: 80 })\n\n const buttonRemoveChart = document.createElement('button')\n container.append(buttonRemoveChart)\n buttonRemoveChart.innerHTML = 'X'\n buttonRemoveChart.style.position = 'absolute'\n buttonRemoveChart.style.right = '0px'\n buttonRemoveChart.style.top = '0px'\n buttonRemoveChart.style.zIndex = '1'\n\n buttonRemoveChart.onclick = (e) => {\n chart.dispose()\n container.remove()\n\n charts.splice(\n charts.findIndex((item) => item.chart === chart),\n 1,\n )\n buttonRemoveChart.onclick = undefined\n changeCharts()\n }\n\n const series = chart\n .addPointLineAreaSeries({\n dataPattern: 'ProgressiveX',\n })\n .setAreaFillStyle(emptyFill)\n .setName(name)\n .add(data)\n\n charts.push({\n chart,\n container,\n })\n changeCharts()\n container.scrollTo()\n\n function changeCharts() {\n const parentHeight = exampleContainer.getBoundingClientRect().height\n const numberOfCharts = charts.length\n const divHeight = parentHeight / numberOfCharts + 'px'\n container.style.height = divHeight\n charts.forEach(({ chart, container }) => {\n container.style.height = divHeight\n })\n }\n}\n\n;(async () => {\n for (let i = 0; i < 20; i += 1) {\n const label = `${new Date(Date.now() - i * 24 * 60 * 60 * 1000).toLocaleDateString()}`\n const data = await createProgressiveTraceGenerator().setNumberOfPoints(200).generate().toPromise()\n\n const buttonAddChart = document.createElement('button')\n uiDiv.append(buttonAddChart)\n buttonAddChart.innerHTML = label\n buttonAddChart.style.margin = '4px 0'\n buttonAddChart.addEventListener('click', (e) => {\n addGraph(label, data)\n })\n if (i < 3) addGraph(label, data)\n }\n})()\n","url":null,"readme":"Example on how a dynamic chart dashboard can be created with LightningChart JS.\n\nThe use case is an application where charts can be added and removed at users whim to perform different kinds of analysis within a dynamic application setting.\n\nThis can be achieved out of the box with LightningChart by placing each chart in its own HTML DIV in same way as most web charts on the market.\n","image":"dashboardDynamic","showNew":true},{"id":"lcjs-example-0511-dashboardDynamicStacked","title":"JavaScript Re-arrangeable Dashboard","tags":["dashboard","xy","line","realtime","datacleaning"],"description":"Example of a Dashboard with several channels which you can re-arrange with drag & drop and hide/show at will.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"// Example of a Dashboard with several channels which you can re-arrange with drag & drop and hide/show at will\n\nconst lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\nconst { lightningChart, emptyFill, Themes, AxisTickStrategies } = lcjs\nconst { createProgressiveTraceGenerator } = xydata\n\nconst lc = lightningChart()\nconst chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Drag & drop Y axes to rearrange')\n\nconst axisX = chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Time)\n\nchart.getDefaultAxisY().dispose()\nlet channels = new Array(5).fill(0).map((_, i, arr) => {\n const name = `Channel #${i + 1}`\n const iStack = arr.length - (i + 1)\n const axisY = chart.addAxisY({ iStack }).setMargins(10, 10)\n const lineSeries = chart\n .addPointLineAreaSeries({ axisY, dataPattern: 'ProgressiveX', automaticColorIndex: i })\n .setName(name)\n .setAreaFillStyle(emptyFill)\n\n createProgressiveTraceGenerator()\n .setNumberOfPoints(100_000)\n .generate()\n .toPromise()\n .then((data) => {\n lineSeries.add(data)\n })\n\n // Match LineSeries visibility with its Y axis\n lineSeries.onVisibleStateChanged((_, isVisible) => {\n axisY.setVisible(isVisible)\n })\n\n const ch = { name, axisY, lineSeries }\n return ch\n})\n\n//\n//\n// Drag & drop axis rearrange logic:\n// LC Axis/chart currently don't expose HTML `draggable` property and `ondrop` event, so to implement drag & drop we need to create HTML div overlays as drag & drop source and target.\nchart.forEachAxisY((axis) => axis.setMouseInteractions(false))\nconst chOverlays = channels.map((ch) => {\n const overlay = document.createElement('div')\n chart.engine.container.append(overlay)\n overlay.style.position = 'fixed'\n overlay.style.width = '100px'\n overlay.style.zIndex = '1000'\n overlay.style.cursor = 'grab'\n const positionOverlay = () => {\n requestAnimationFrame(() => {\n const interval = ch.axisY.getInterval()\n const startClient = chart.translateCoordinate({ x: 0, y: interval.start }, { x: axisX, y: ch.axisY }, chart.coordsClient)\n const endClient = chart.translateCoordinate({ x: 0, y: interval.end }, { x: axisX, y: ch.axisY }, chart.coordsClient)\n overlay.style.top = `${endClient.clientY}px`\n overlay.style.height = `${startClient.clientY - endClient.clientY}px`\n })\n }\n positionOverlay()\n ch.axisY.onIntervalChange(positionOverlay)\n ch.axisY.onVisibleStateChanged((_, isVisible) => {\n overlay.style.display = isVisible ? 'block' : 'none'\n chOverlays.forEach((overlay) => overlay.positionOverlay())\n })\n chart.onResize(positionOverlay)\n\n overlay.draggable = true\n overlay.ondragstart = (event) => {\n event.dataTransfer.setData('text', ch.name)\n }\n overlay.ondragover = (event) => {\n event.preventDefault()\n }\n overlay.ondrop = (event) => {\n event.preventDefault()\n const nameSrc = event.dataTransfer.getData('text')\n const axisSrc = channels.find((ch) => ch.name === nameSrc).axisY\n chart.swapAxes(ch.axisY, axisSrc)\n chOverlays.forEach((item) => item.positionOverlay())\n }\n return { positionOverlay }\n})\n","url":null,"readme":"_Re-arrangeable Dashboard example._\n\nThis example shows how to create a Dashboard with a number of channels which you can re-arrange using drag & drop or hide/show using the legend.\n","image":"dashboardDynamicStacked","showNew":true},{"id":"lcjs-example-0550-zoomBandChart","title":"JavaScript Zoom Band Chart","tags":["dashboard","line","point","zoomband"],"description":"This example shows the creation of a Zoom Band Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example that showcases the Zoom Band Chart feature\n */\nconst lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\nconst { createProgressiveTraceGenerator, createProgressiveRandomGenerator } = xydata\n\nconst numberOfDays = 1000\n\n// Create a Dashboard, with a single column and two rows.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart()\n .Dashboard({\n numberOfColumns: 1,\n numberOfRows: 2,\n // theme: Themes.darkGold\n })\n // Set the row height for the top Cell in Dashboard.\n // As the bottom row is default (1), the top row height will be 3/4 of the\n // available Dashboard height.\n .setRowHeight(0, 3)\n\n// Add XY Chart to top Cell in Dashboard.\nconst chart = dashboard\n .createChartXY({\n columnIndex: 0,\n columnSpan: 1,\n rowIndex: 0,\n rowSpan: 1,\n })\n .setTitle('')\n\n// Do not animate Y Axis Scale changes on either Charts.\nchart.getDefaultAxisY().setAnimationScroll(undefined)\nchart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setInterval({ start: new Date(2001, 0, numberOfDays - 180).getTime(), end: new Date(2001, 0, numberOfDays).getTime() })\n\n// Add Zoom Band Chart to bottom Cell in Dashboard.\nconst zoomBandChart = dashboard.createZoomBandChart({\n columnIndex: 0,\n columnSpan: 1,\n rowIndex: 1,\n rowSpan: 1,\n})\n\n// Add Line and Point Series to the XY Chart.\nconst lines = new Array(3).fill(0).map((_, i) => {\n return chart\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n })\n .setStrokeStyle((strokeStyle) => strokeStyle.setThickness(1))\n .setName(`Line ${i}`)\n})\n\nconst points = chart.addPointSeries().setPointSize(2)\n\n// Add the same Series to the Zoom Band Chart.\nlines.forEach((line) => zoomBandChart.add(line))\nzoomBandChart.add(points)\n\n// Fill the Point Series with data.\ncreateProgressiveRandomGenerator()\n .setNumberOfPoints(numberOfDays)\n .generate()\n .toPromise()\n .then((data) => {\n // Offset the Y value of each point, then push to the Series.\n points.add(data.map((point) => ({ x: new Date(2001, 0, point.x).getTime(), y: point.y * 15 })))\n })\n\n// Fill the Line Series with data.\nlines.forEach((line, i) => {\n createProgressiveTraceGenerator()\n .setNumberOfPoints(numberOfDays)\n .generate()\n .toPromise()\n .then((data) => {\n line.add(data.map((point) => ({ x: new Date(2001, 0, point.x).getTime(), y: point.y })))\n })\n})\n","url":null,"readme":"_Zoom Band Chart_.\n\nThis example showcases the Zoom Band Chart feature.\nThis is a chart type intended for displaying a duplicate, zoomed out view of 1 or more charts/series.\nThe Zoom Band Chart comes with convenient built-in interactions that allow the user to select the view on the full data set. Interacting with the Zoom Band Chart in that way mirrors the changes on the original, attached charts.\n\nThe Zoom Band Chart can be created with few simple lines of code:\n\n```javascript\nconst zoomBandChart = lc.ZoomBandChart()\nzoomBandChart.add(mySeries1)\nzoomBandChart.add(mySeries2)\n```\n\nPlease find more detailed documentation of Zoom Band Chart features and commonly used methods in the [API documentation](https://lightningchart.com/js-charts/api-documentation) under `ZoomBandChart` class.\n","image":"zoomBandChart"},{"id":"lcjs-example-0600-boxPlot","title":"JavaScript Box and Whiskers Chart","tags":["box","whiskers","xy","point","bar","column"],"description":"Example creates a traditional Box and Whiskers Chart using ChartXY, BoxSeries and PointSeries for outliers.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChartJS example that showcases the creation and styling of box series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n emptyTick,\n ColorHEX,\n SolidFill,\n SolidLine,\n AxisTickStrategies,\n AutoCursorModes,\n PointShape,\n UIElementBuilders,\n Themes,\n} = lcjs\n\n// ----- Define data for application -----\nconst allData = [\n {\n name: 'Software developer',\n data: {\n lowerExtreme: 17.5,\n lowerQuartile: 19.6,\n median: 21.2,\n upperQuartile: 28.5,\n upperExtreme: 48.1,\n outliers: [50.1],\n },\n },\n {\n name: 'Cashier',\n data: {\n lowerExtreme: 14.0,\n lowerQuartile: 19.5,\n median: 20.1,\n upperQuartile: 26.7,\n upperExtreme: 41.6,\n outliers: [52.2, 59.9],\n },\n },\n {\n name: 'Janitor',\n data: {\n lowerExtreme: 15.2,\n lowerQuartile: 18.5,\n median: 22.7,\n upperQuartile: 34.1,\n upperExtreme: 41.0,\n outliers: [],\n },\n },\n]\n\n// ----- Create a XY Chart -----\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Age distribution across professions')\n // Disable interactions.\n .setAutoCursorMode(AutoCursorModes.disabled)\n\n// ----- Setup axes -----\nconst axisX = chart\n .getDefaultAxisX()\n .setTitle('Profession')\n // No default ticks.\n .setTickStrategy(AxisTickStrategies.Empty)\n // Disable interactions.\n .setMouseInteractions(false)\n\n// Style the default Y Axis\nconst axisY = chart\n .getDefaultAxisY()\n .setTitle('Age')\n // Set Y-view manually.\n .setScrollStrategy(undefined)\n .setInterval({ start: 10, end: 63, stopAxisAfter: false })\n // Disable interactions.\n .setMouseInteractions(false)\n\n// ----- Map over per each data item -----\n\nallData.forEach((profession, i) => {\n const data = profession.data\n // ----- Create series for rendering this data item -----\n // Create BoxSeries.\n const boxSeries = chart.addBoxSeries().setDefaultStyle((figure) => figure.setBodyWidth(0.7).setTailWidth(0.7))\n\n // Create PointSeries for outliers.\n const pointSeries = chart\n .addPointSeries({\n pointShape: PointShape.Circle,\n })\n .setPointSize(20)\n\n // ----- Setup shared highlighting between box and point series -----\n boxSeries.onMouseEnter((_, cp) => pointSeries.setHighlight(true))\n boxSeries.onMouseLeave((_, cp) => pointSeries.setHighlight(false))\n pointSeries.onMouseEnter((_, cp) => boxSeries.setHighlight(true))\n pointSeries.onMouseLeave((_, cp) => boxSeries.setHighlight(false))\n\n // ----- Compute X positions for BoxFigure -----\n const start = i * 1\n const end = start + 1\n const middle = (start + end) / 2\n\n // ----- Render BoxFigure -----\n boxSeries.add({\n start,\n end,\n lowerExtreme: data.lowerExtreme,\n lowerQuartile: data.lowerQuartile,\n median: data.median,\n upperQuartile: data.upperQuartile,\n upperExtreme: data.upperExtreme,\n })\n\n // ----- Render outliers -----\n data.outliers.forEach((outlier) => {\n pointSeries.add({\n x: middle,\n y: outlier,\n })\n })\n\n // ----- Create CustomTick on X-Axis for displaying name of profession -----\n axisX\n .addCustomTick()\n .setValue(middle)\n .setTextFormatter(() => profession.name)\n .setGridStrokeLength(0)\n})\n","url":null,"readme":"Example creates a traditional _Box and Whiskers Chart_ using _ChartXY_, _BoxSeries_ and _PointSeries_ for outliers.\n\n_Box and Whiskers Chart_ provides a compact way of visually displaying distribution of data through _quartiles_.\n\n## Anatomy\n\nThe lines extending parallel from the boxes are known as the \"whiskers\", which are used to indicate variability outside the upper and lower quartiles.\n\n_Outliers_ are sometimes drawn as individual dots that are in-line with the whiskers.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/boxFigure.png)\n\nHere are the types of observations one can make from viewing a _Box And Whiskers Chart_:\n\n- What the key values are, such as: average, median, 25th percentile etc.\n- If there are any _outliers_ and what their values are.\n- Is the data symmetrical.\n- How tightly is the data grouped.\n- If the data is skewed and if so, in what direction.\n","image":"boxPlot"},{"id":"lcjs-example-0601-boxPlotAndViolin","title":"JavaScript Box And Violin Chart","tags":["box","violin","area","xy","legendbox"],"description":"This example shows usage of BoxSeries in extravagant manner.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * LightningChartJS example that showcases usage of BoxSeries and RangeSeries to show some made-up statistical graphs.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst {\n emptyLine,\n lightningChart,\n yDimensionStrategy,\n LegendBoxBuilders,\n AxisScrollStrategies,\n AxisTickStrategies,\n AutoCursorModes,\n Themes,\n} = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveFunctionGenerator } = xydata\n\n// Utilities for graphing distribution functions.\n//#region\nconst cumulativeDistribution = (probabilityDistributionFunction, rangeMin, rangeMax, step) => {\n // Simulate values of respective probability density function.\n const probabilityValues = []\n for (let x = rangeMin; x <= rangeMax; x += step) probabilityValues.push(probabilityDistributionFunction(x))\n // Normalize probability values and push them to a cached array.\n const probabilitySum = probabilityValues.reduce((prev, cur) => prev + cur, 0)\n const values = []\n let accumulatedNormProb = 0\n for (const probabilityValue of probabilityValues) {\n const normalizedprobabilityValue = probabilityValue / probabilitySum\n accumulatedNormProb += normalizedprobabilityValue\n values.push(accumulatedNormProb)\n }\n // Return function that returns the closest value (by x) from the cached 'values' array.\n return (x) => {\n const xAsIndex = ((x - rangeMin) / (rangeMax - rangeMin)) * ((rangeMax - rangeMin) / step)\n // Pick closest index (left/right) that exists\n const closestIndex = Math.min(Math.max(Math.round(xAsIndex), 0), values.length - 1)\n return values[closestIndex]\n }\n}\nconst findQuartileX = (yToLookFor, cumulativeDistributionFunction, rangeMin, rangeMax, step) => {\n // Iterate over possible 'X' values and pick the one where resulting 'Y' is closest to 'yToLookFor'\n let bestResult\n for (let x = rangeMin; x <= rangeMax; x += step) {\n const y = cumulativeDistributionFunction(x)\n const delta = Math.abs(y - yToLookFor)\n if (bestResult === undefined || delta < bestResult.delta) bestResult = { x, delta }\n else if (bestResult !== undefined && delta > bestResult.delta) break\n }\n return bestResult.x\n}\nconst probabilityDistribution = (mean, variance) => (x) =>\n (1 / (variance * Math.sqrt(2 * Math.PI))) * Math.pow(Math.E, -Math.pow(x - mean, 2) / (2 * variance * variance))\n//#endregion\n\n// Make chart with series graphing standard probability density and cumulative distribution functions.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Probability distribution + Simulated accumulation and BoxSeries')\n // Set auto-cursor mode to 'onHover'\n .setAutoCursorMode(AutoCursorModes.onHover)\n .setAutoCursor((cursor) =>\n cursor.setResultTableAutoTextStyle(false).setTickMarkerXAutoTextStyle(false).setTickMarkerYAutoTextStyle(false),\n )\n .setPadding({ right: 20 })\n\nconst xBounds = { min: -4, max: 4 }\nconst step = 0.02\n// Setup axes.\nconst axisDistribution = chart.getDefaultAxisY()\nconst axisNormalized = chart.addAxisY()\nconst axisX = chart\n .getDefaultAxisX()\n .setInterval({ start: xBounds.min, end: xBounds.max, stopAxisAfter: false })\n .setScrollStrategy(undefined)\n\n// Set up the Distribution Axis.\naxisDistribution\n .setTitle('Distribution function')\n .setScrollStrategy(AxisScrollStrategies.expansion)\n // Modify the TickStrategy to remove gridLines from this Y Axis.\n .setTickStrategy(\n // Use Numeric TickStrategy as base.\n AxisTickStrategies.Numeric,\n // Use mutator to modify the TickStrategy.\n (tickStrategy) =>\n tickStrategy\n // Modify Major Tick Style by using a mutator.\n .setMajorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine))\n // Modify Minor Tick Style by using a mutator.\n .setMinorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine)),\n )\n\n// Set up the Normalized Axis.\naxisNormalized\n .setTitle('Accumulated distribution (%)')\n .setInterval({ start: 0, end: 1, stopAxisAfter: false })\n .setScrollStrategy(undefined)\n // Modify the TickStrategy to remove gridLines from this Y Axis.\n .setTickStrategy(\n // Use Numeric TickStrategy as base.\n AxisTickStrategies.Numeric,\n // Use mutator to modify the TickStrategy.\n (tickStrategy) =>\n tickStrategy\n // Modify Major Tick Style by using a mutator.\n .setMajorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine))\n // Modify Minor Tick Style by using a mutator.\n .setMinorTickStyle((tickStyle) => tickStyle.setGridStrokeStyle(emptyLine)),\n )\n\n// Cumulative distribution.\nconst cumulativeDistributionSeries = chart.addAreaSeries({ yAxis: axisNormalized }).setName('Simulated Cumulative Distribution')\n\n// Probability distribution.\nconst probabilityDistributionSeries = chart.addAreaSeries({ yAxis: axisDistribution }).setName('Probability Distribution')\n\n// 'Violin' series.\nconst violinSeries = chart.addAreaRangeSeries({ yAxis: axisDistribution }).setName('Violin')\n\n// Box series.\nconst boxSeries = chart.addBoxSeries({ yAxis: axisDistribution, dimensionStrategy: yDimensionStrategy }).setName('Box')\n\n// Drawing logic\n//#region\nconst graphDistribution = (mean, variance) => {\n // Clear points from series.\n cumulativeDistributionSeries.clear()\n probabilityDistributionSeries.clear()\n boxSeries.clear()\n violinSeries.clear()\n\n // Generate and stream points.\n const probabilityDistributionFunction = probabilityDistribution(mean, variance)\n const cumulativeDistributionFunction = cumulativeDistribution(probabilityDistributionFunction, xBounds.min, xBounds.max, step)\n const streamDuration = 1500\n const streamInterval = 30\n\n // Reset interval if user isn't up to something.\n if (!axisDistribution.getStopped()) axisDistribution.setInterval({ start: 0, end: 1.0, stopAxisAfter: false })\n\n createProgressiveFunctionGenerator()\n .setSamplingFunction(cumulativeDistributionFunction)\n .setStart(xBounds.min)\n .setEnd(xBounds.max)\n .setStep(step)\n .generate()\n .setStreamBatchSize((1000 * (xBounds.max - xBounds.min)) / (step * streamInterval * streamDuration))\n .setStreamInterval(streamInterval)\n .toStream()\n .forEach((point) => cumulativeDistributionSeries.add(point))\n createProgressiveFunctionGenerator()\n .setSamplingFunction(probabilityDistributionFunction)\n .setStart(xBounds.min)\n .setEnd(xBounds.max)\n .setStep(step)\n .generate()\n .setStreamBatchSize((1000 * (xBounds.max - xBounds.min)) / (step * streamInterval * streamDuration))\n .setStreamInterval(streamInterval)\n .toStream()\n .forEach((point) => {\n probabilityDistributionSeries.add(point)\n if (point.y >= 0.001)\n // Add mirrored area-point to violin point\n violinSeries.add({\n position: point.x,\n high: 1.0 + point.y / 2,\n low: 1.0 - point.y / 2,\n })\n })\n\n // Add box figure after streaming points.\n setTimeout(() => {\n // Find quartile values using cumulative distribution function.\n const q1 = findQuartileX(0.25, cumulativeDistributionFunction, xBounds.min, xBounds.max, step)\n const q2 = findQuartileX(0.5, cumulativeDistributionFunction, xBounds.min, xBounds.max, step)\n const q3 = findQuartileX(0.75, cumulativeDistributionFunction, xBounds.min, xBounds.max, step)\n const iqr = q3 - q1\n const boxSeriesDimensions = {\n // Purely visual 'Y' -dimensions\n start: 0.9,\n end: 1.1,\n // Actual data -dimensions along 'X' -axis\n lowerExtreme: q1 - 1.5 * iqr,\n lowerQuartile: q1,\n median: q2,\n upperQuartile: q3,\n upperExtreme: q3 + 1.5 * iqr,\n }\n boxSeries.add(boxSeriesDimensions)\n }, streamDuration)\n}\n//#endregion\n\ngraphDistribution(0, 1)\n\n// Add LegendBox as part of chart.\nconst legend = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\nlegend.add(chart)\n\ncumulativeDistributionSeries.setCursorResultTableFormatter((tableBuilder, rangeSeries, position, high, low) => {\n const x = position.toFixed(2) == '-0.00' ? '0.00' : position.toFixed(2)\n return tableBuilder\n .addRow('Simulated Cumulative Distribution')\n .addRow('Position ' + x)\n .addRow('High ' + high.toFixed(2))\n .addRow('Base ' + low.toFixed(2))\n})\nprobabilityDistributionSeries.setCursorResultTableFormatter((tableBuilder, rangeSeries, position, high, low) => {\n const x = position.toFixed(2) == '-0.00' ? '0.00' : position.toFixed(2)\n return tableBuilder\n .addRow('Probability Distribution')\n .addRow('Position ' + x)\n .addRow('Value ' + high.toFixed(2))\n .addRow('Base ' + low.toFixed(2))\n})\nviolinSeries.setCursorResultTableFormatter((tableBuilder, rangeSeries, position, high, low) => {\n const x = position.toFixed(2) == '-0.00' ? '0.00' : position.toFixed(2)\n return tableBuilder\n .addRow('Violin')\n .addRow('Position ' + x)\n .addRow('Value ' + high.toFixed(2))\n .addRow('Low ' + low.toFixed(2))\n})\n","url":null,"readme":"This example shows usage of BoxSeries in extravagant manner.\n","image":"boxPlotAndViolin"},{"id":"lcjs-example-0700-markers","title":"JavaScript Markers","tags":["xy","marker","ui","line"],"description":"This example shows usage of different Markers of the ChartXY environment.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases different XY Markers.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n AutoCursorModes,\n UIVisibilityModes,\n MarkerBuilders,\n UIBackgrounds,\n UIDirections,\n UIOrigins,\n UIElementBuilders,\n UIDraggingModes,\n Themes,\n} = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = xydata\n\nconst chartTitle = 'Markers'\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle(chartTitle)\n // Disable AutoCursor just for focusing on Markers.\n .setAutoCursorMode(AutoCursorModes.disabled)\n // Preventing ResultTable from getting cut at the edge\n .setPadding({\n right: 50,\n })\n\n// Add a line series.\nconst series = chart.addLineSeries()\n\n// Generate random points using 'xydata'-library.\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(100)\n .generate()\n .toPromise()\n .then((data) => {\n const axisYAvg = (data[0].y + data[data.length - 1].y) / 2\n series.add(data)\n // ----- ChartMarker -----\n\n // Add a ChartMarker to the chart.\n const chartMarker = chart.addChartMarkerXY().setPosition({ x: 60, y: axisYAvg })\n\n // Style ChartMarker.\n chartMarker\n .setResultTableVisibility(UIVisibilityModes.always)\n .setResultTable((table) => table.setContent([['ChartMarker']]))\n .setGridStrokeXVisibility(UIVisibilityModes.whenDragged)\n .setGridStrokeYVisibility(UIVisibilityModes.whenDragged)\n .setTickMarkerXVisibility(UIVisibilityModes.whenDragged)\n .setTickMarkerYVisibility(UIVisibilityModes.whenDragged)\n })\n\n// ----- SeriesMarker -----\n\n// Create a builder for SeriesMarker to allow for full modification of its structure.\nconst SeriesMarkerBuilder = MarkerBuilders.SeriesMarkerXY.setResultTableBackground(UIBackgrounds.Pointer).addStyler((marker) =>\n marker\n .setResultTable((table) =>\n table\n .setOrigin(UIOrigins.CenterBottom)\n .setMargin({ bottom: 0 })\n .setBackground((arrow) => arrow.setDirection(UIDirections.Down).setPointerAngle(80).setPointerLength(20)),\n )\n .setGridStrokeXCut(true)\n .setAutoFitStrategy(undefined),\n)\n\n// Add a SeriesMarker to the series.\nconst seriesMarker = series.addMarker(SeriesMarkerBuilder).setPosition({ x: 50, y: 0 })\n\n// Currently the only way to affect the text of Markers ResultTables,\n// is to completely override the series parser for it.\nseries.setCursorResultTableFormatter((tableBuilder, series, x, y) =>\n tableBuilder.addRow('SeriesMarker').addRow('X', x.toFixed(1)).addRow('Y', y.toFixed(1)),\n)\n// ... However, this will also apply to AutoCursor.\n\n// Add download button to save chart frame\nchart\n .addUIElement(UIElementBuilders.ButtonBox)\n .setPosition({ x: 99, y: 99 })\n .setOrigin(UIOrigins.RightTop)\n .setText('Download PNG Image')\n .setPadding({ top: 5, right: 20, bottom: 5, left: 20 })\n .setButtonSize(0)\n .setDraggingMode(UIDraggingModes.notDraggable)\n .onMouseClick((event) => {\n chart.saveToFile(chartTitle + ' - Screenshot')\n })\n","url":null,"readme":"This example shows usage of different Markers of the ChartXY environment.\nMarkers are custom UI-elements that can be used to draw custom cursors from user side. There are two types of Markers:\n\n## ChartMarker\n\nThis type of Marker is placed along two arbitrary axes belonging to a ChartXY. It is positioned with axis values, and will look exactly like an AutoCursor. It also has the same capabilities as one - only difference being that it isn't automatically positioned and hidden when needed, users have full power over this logic.\n\n## SeriesMarker\n\nSeriesMarkers are a part of certain series (line-series, OHLC, ...?), that can be created using series-method: _addMarker_. Once again, the SeriesMarker doesn't look any different from other Markers, the only logic which it adds is that it automatically latches to the nearest data-point of its owning series, from its current location (which can be set using method: _setPosition_)\n","image":"markers"},{"id":"lcjs-example-0701-bandsConstantlines","title":"JavaScript Chart Bands and Constant lines","tags":["xy","band","constantline","line"],"description":"This example shows usage of Bands and ConstantLines in XY Charts.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases basic usage of Bands and Constantlines.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, Themes } = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = xydata\n\nconst chartTitle = 'Bands and Constantlines'\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle(chartTitle)\n\n// Add a line series.\nconst series = chart.addLineSeries()\n\n// Generate random progressive points using 'xydata'-library.\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(100)\n .generate()\n .toPromise()\n .then((data) => {\n series.add(data)\n })\n\n// Get the default X and Y Axis\nconst xAxis = chart.getDefaultAxisX()\nconst yAxis = chart\n .getDefaultAxisY()\n // Set the interval for Y Axis.\n .setInterval({ start: -10, end: 10, animate: true })\n\n// Add a Constantline to the X Axis\nconst xAxisConstantline = xAxis.addConstantLine()\n// Position the Constantline in the Axis Scale\nxAxisConstantline.setValue(80)\n// The name of the Constantline will be shown in the LegendBox\nxAxisConstantline.setName('X Axis Constantline')\n\n// Add a Band to the X Axis\nconst xAxisBand = xAxis.addBand()\n// Set the start and end values of the Band.\nxAxisBand\n .setValueStart(10)\n .setValueEnd(25)\n // Set the name of the Band\n .setName('X Axis Band')\n\n// Add Band and ConstantLine to the Y Axis\n\n// If 'false' is given as argument here, the Constantline will be rendered behind\n// all the Series in the Chart.\nconst yAxisConstantLine = yAxis.addConstantLine(false)\nyAxisConstantLine.setName('Y Axis Constantline')\n// Giving 'false' as argument here makes sure the Band is rendered behind all\n// the Series in the Chart.\nconst yAxisBand = yAxis.addBand(false)\nyAxisBand.setName('Y Axis Band')\n\n// Position the Y Axis ConstantLine along the visible Scale of the Axis.\nyAxisConstantLine.setValue(9)\n\n// Position the Y Axis Band along the visible Scale of the Axis.\nyAxisBand.setValueEnd(2).setValueStart(-3)\n\n// Add a LegendBox, add the Chart in it.\nchart\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart)\n","url":null,"readme":"Also known as Highlighters.\n\nThis example shows the basic usage of Bands and Constantlines in a XY Chart.\n\nBands and Constantlines are attached to the Axes of a XY Chart.\nBands and Constantlines can be interacted with mouse and touch controls.\n\nDepending where you touch on the band, you can move either end of the Band separately by touching the edge of the Band, or you can move the entire Band by touching the center of the Band.\n\nThey can be easily added to an Axis:\n\n```javascript\n// Add a Constantline to an Axis\nconst constantline = axis.addConstantLine()\n\n//Add a Band to an Axis\nconst band = axis.addBand()\n\n// By default, the Band and Constantline are placed above all Series in the Chart.\n// They can also be placed below all Series by passing *true* as argument when creating one.\nconst constantLline = axis.addConstantLine(false)\n\nconst band = axis.addBand(false)\n```\n\n## Positioning\n\nThe position of a Constantline can be set using the _setValue()_ API:\n\n```javascript\n// Set the position of a Constantline\nconstantline.setValue(50)\n```\n\nThe position and size of a Band is set by using the _setValueStart()_ and _setValueEnd()_ API:\n\n```javascript\n// Set the start value of a Band\nband.setValueStart(20)\n// Set the end value of a Band\nband.setValueEnd(40)\n```\n\n## Styling\n\nConstantlines can be styled by using the _setStrokeStyle()_ API:\n\n```javascript\n// Style the Constantline\nconstantline.setStrokeStyle(\n new SolidLine({\n thickness: 5\n fillStyle: new SolidFill({\n color: ColorHEX('#fff')\n })\n })\n)\n```\n\nBands can be styled by using the _setStrokeStyle()_ and _setFillStyle()_ API accordingly:\n\n```javascript\n// Style the Band border\nband.setStrokeStyle(\n new SolidLine({\n thickness: 5\n fillStyle: new SolidFill({\n color: ColorHEX('#fff')\n })\n })\n)\n// Style the Band's fillStyle\nband.setFillStyle(\n new SolidFill({\n color: ColorHEX('#fff')\n })\n)\n```\n","image":"bandsConstantLines"},{"id":"lcjs-example-0702-customCursor","title":"JavaScript Custom Cursor Chart","tags":["xy","cursor","ui","customtick"],"description":"Example showcasing custom cursor implementation with LCJS UI","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases creation of a custom cursor in ChartXY.\n *\n * This variant uses LCJS UI components to display the cursor components. The cursor logic is also implemented using LCJS events and methods.\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import data-generators from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AutoCursorModes, UIElementBuilders, UILayoutBuilders, UIOrigins, Themes } = lcjs\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n // Disable native AutoCursor to create custom\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setTitle('Custom Cursor using LCJS UI')\n\n// set title for Y axis\nchart.getDefaultAxisY().setTitle('Y-axis')\n\n// generate data and creating the series\nconst series = new Array(3).fill(0).map((_, iSeries) => {\n const nSeries = chart.addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n },\n })\n\n return nSeries\n})\n\nPromise.all(\n series.map((nSeries) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(200)\n .generate()\n .toPromise()\n .then((data) => {\n nSeries.add(data)\n }),\n ),\n).then(() => {\n chart.forEachAxis((axis) => axis.fit(false))\n requestAnimationFrame(() => {\n // Show custom cursor at start automatically.\n showCursorAt({ clientX: window.innerWidth * 0.4, clientY: window.innerHeight / 2 })\n })\n})\n\n// Add Legend.\nconst legend = chart.addLegendBox().add(chart)\n\n// Create UI elements for custom cursor.\nconst resultTable = chart\n .addUIElement(UILayoutBuilders.Column, {\n x: chart.getDefaultAxisX(),\n y: chart.getDefaultAxisY(),\n })\n .setMouseInteractions(false)\n .setOrigin(UIOrigins.LeftBottom)\n .setMargin(5)\n .setBackground((background) =>\n background\n // Style same as Theme result table.\n .setFillStyle(chart.getTheme().cursorResultTableFillStyle)\n .setStrokeStyle(chart.getTheme().cursorResultTableStrokeStyle),\n )\n\nconst rowX = resultTable.addElement(UILayoutBuilders.Row).addElement(UIElementBuilders.TextBox)\n\nconst rowsY = series.map((el, i) => {\n return resultTable\n .addElement(UILayoutBuilders.Row)\n .addElement(UIElementBuilders.TextBox)\n .setTextFillStyle(series[i].getStrokeStyle().getFillStyle())\n})\n\nconst tickX = chart.getDefaultAxisX().addCustomTick(UIElementBuilders.PointableTextBox).setAllocatesAxisSpace(false)\n\nconst ticksY = series.map((el, i) => {\n return chart\n .getDefaultAxisY()\n .addCustomTick(UIElementBuilders.PointableTextBox)\n .setAllocatesAxisSpace(false)\n .setMarker((marker) => marker.setTextFillStyle(series[i].getStrokeStyle().getFillStyle()))\n})\n\n// Hide custom cursor components initially.\nresultTable.setVisible(false)\ntickX.setVisible(false)\nticksY.forEach((tick) => tick.setVisible(false))\n\nconst showCursorAt = (clientCoordinate) => {\n // Translate mouse location to Axis.\n const mouseLocationAxis = chart.translateCoordinate(clientCoordinate, chart.coordsAxis)\n\n // Solve nearest data point to the mouse on each series.\n const nearestDataPoints = series.map((el) => el.solveNearestFromScreen(clientCoordinate))\n\n // Find the nearest solved data point to the mouse.\n const nearestPoint = nearestDataPoints.reduce((prev, curr, i) => {\n if (!prev) return curr\n if (!curr) return prev\n return Math.abs(mouseLocationAxis.y - curr.location.y) < Math.abs(mouseLocationAxis.y - prev.location.y) ? curr : prev\n })\n\n if (nearestPoint) {\n // Set custom cursor location.\n resultTable.setPosition({\n x: nearestPoint.location.x,\n y: nearestPoint.location.y,\n })\n\n // Change origin of result table based on cursor location.\n if (nearestPoint.location.x > chart.getDefaultAxisX().getInterval().end / 1.5) {\n if (nearestPoint.location.y > chart.getDefaultAxisY().getInterval().end / 1.5) {\n resultTable.setOrigin(UIOrigins.RightTop)\n } else {\n resultTable.setOrigin(UIOrigins.RightBottom)\n }\n } else if (nearestPoint.location.y > chart.getDefaultAxisY().getInterval().end / 1.5) {\n resultTable.setOrigin(UIOrigins.LeftTop)\n } else {\n resultTable.setOrigin(UIOrigins.LeftBottom)\n }\n\n // Format result table text.\n rowX.setText(`X: ${chart.getDefaultAxisX().formatValue(nearestPoint.location.x)}`)\n rowsY.map((rowY, i) => {\n rowY.setText(`Y${i}: ${chart.getDefaultAxisY().formatValue(nearestDataPoints[i].location.y)}`)\n })\n\n // Position custom ticks.\n tickX.setValue(nearestPoint.location.x)\n ticksY.forEach((tick, i) => {\n tick.setValue(nearestDataPoints[i].location.y || 0)\n })\n\n // Display cursor.\n resultTable.setVisible(true)\n tickX.setVisible(true)\n ticksY.map((el) => el.setVisible(true))\n } else {\n // Hide cursor.\n resultTable.setVisible(false)\n tickX.setVisible(false)\n ticksY.map((el) => el.setVisible(false))\n }\n}\n\n// Implement custom cursor logic with events.\nconst mouseMoveEventHandler = (_, event) => {\n showCursorAt(event)\n}\n\nchart.onSeriesBackgroundMouseMove(mouseMoveEventHandler)\nseries.forEach((series) => {\n series.onMouseMove(mouseMoveEventHandler)\n})\n\nchart.onSeriesBackgroundMouseLeave((_, e) => {\n resultTable.setVisible(false)\n tickX.setVisible(false)\n ticksY.map((el) => el.setVisible(false))\n})\n\nchart.onSeriesBackgroundMouseDragStart((_, e) => {\n resultTable.setVisible(false)\n tickX.setVisible(false)\n ticksY.map((el) => el.setVisible(false))\n})\n","url":null,"readme":"This example serves as an example for creating a custom cursor for XY charts.\n\nCustom cursors can be required for different purposes - like major structural changes or very application specific styling requirements.\n\nIf lesser changes to default cursors are required then please see read about different methods of configuring cursor behavior - `ChartXY` API reference has good links and explanations to follow.\n\nCustom cursors are most importantly based on `LCJS` methods that allow solving nearest data points in series from any supplied location.\nCustom user interactions and data point solving require solid understanding of different coordinate systems in web and `LCJS`, which is the primary reason this example exists;\n\n```javascript\n// Add custom action when user moves mouse over series area.\nchart.onSeriesBackgroundMouseMove((_, event) => {\n // `event` is a native JavaScript event, which packs the active mouse location in `clientX` and `clientY` properties.\n // it can be used for solving nearest data point ...\n const nearestDataPoint = series.solveNearestFromScreen(event)\n\n // ... or translated to a pair of Axes\n const mouseLocationAxis = chart.translateCoordinate(event, chart.coordsAxis)\n})\n```\n\nIn this example, the custom cursor visual is created with internal `LCJS` user interface components, showcasing a _multi-cursor_ which displays one X coordinate and several Y coordinates at once.\n\n![](./assets/cursor.png)\n\nThe result table is created by combining `LCJS` layout elements with `UITextBox` elements - this allows any kind of value grid to be created.\n\nMore custom cursor examples can be found by looking for \"cursor\" tag in the _Interactive Examples_ gallery - for example, using HTML & CSS for an animated result table or connecting to an UI framework.\n","image":"CustomCursor"},{"id":"lcjs-example-0703-customHTMLCursor","title":"JavaScript Custom HTML Cursor Chart","tags":["xy","cursor","ui","html"],"description":"Example showcasing custom cursor implementation with HTML & CSS","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases creation of a custom cursor in ChartXY.\n *\n * This variant uses HTML & CSS to display the cursor components, but the actual cursor logic is implemented using LCJS events and methods.\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import data-generators from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AutoCursorModes, AxisTickStrategies, Themes } = lcjs\n\n// names of the data the series\nconst names = ['Stock Price A', 'Stock Price B', 'Stock Price C']\n// define date that matches value of 0 on date time axis.\nconst dateOrigin = new Date(2020, 0, 1)\nconst dateOriginTime = dateOrigin.getTime()\n\n// X step between data points.\nconst dataFrequency = 30 * 24 * 60 * 60 * 1000\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n // Disable native AutoCursor to create custom\n .setAutoCursorMode(AutoCursorModes.disabled)\n // set title of the chart\n .setTitle('Custom Cursor using HTML')\n\n// Configure X axis as date time.\nchart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime, (tickStrategy) => tickStrategy.setDateOrigin(dateOrigin))\n\nchart.getDefaultAxisY().setTitle('Stock price variation €')\n\n// Generate data and create the series.\nconst series = new Array(3).fill(0).map((_, i) => {\n const nSeries = chart.addPointLineSeries().setMouseInteractions(false)\n return nSeries\n})\n\nPromise.all(\n series.map((nSeries) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(20)\n .generate()\n .toPromise()\n // Map random generated data to start from a particular date with the frequency of dataFrequency\n .then((data) =>\n data.map((point) => ({\n x: dateOriginTime + point.x * dataFrequency,\n y: point.y,\n })),\n )\n // Shift the data by dateOriginTime\n .then((data) =>\n data.map((p) => ({\n x: p.x - dateOriginTime,\n y: p.y,\n })),\n )\n .then((data) => {\n nSeries.add(data)\n }),\n ),\n).then(() => {\n chart.forEachAxis((axis) => axis.fit(false))\n setTimeout(() => {\n // Show custom cursor at start automatically.\n showCursorAt({ clientX: window.innerWidth * 0.4, clientY: window.innerHeight / 2 })\n }, 1500)\n})\n\n// Read back series colors into CSS supported format \"rgba(...)\"\nconst colors = series.map((nSeries) => {\n const fill = nSeries.getStrokeStyle().getFillStyle()\n // NOTE: Assume SolidFill\n const color = fill.getColor()\n return `rgba(${color.getR()},${color.getG()},${color.getB()},${color.getA()})`\n})\n\n// Create custom cursor UI by adding HTML elements to the document.\nconst styleElem = document.head.appendChild(document.createElement('style'))\nconst textBox = document.createElement('div')\ntextBox.id = 'resultTable'\nconst line = document.createElement('div')\nline.id = 'line'\nconst line2 = document.createElement('div')\nline2.id = 'line2'\nconst arrow = document.createElement('div')\narrow.id = 'arrow'\ntextBox.appendChild(line)\ntextBox.appendChild(line2)\ntextBox.appendChild(arrow)\nchart.engine.container.append(textBox)\n\n// Implement custom cursor logic with events.\nconst showCursorAt = (clientCoordinate) => {\n // Translate mouse location to Axis.\n const mouseLocationAxis = chart.translateCoordinate(clientCoordinate, chart.coordsAxis)\n\n // Solve nearest data point to the mouse on each series.\n const nearestDataPoints = series.map((el) => el.solveNearestFromScreen(clientCoordinate))\n\n // Find the nearest solved data point to the mouse.\n const nearestPoint = nearestDataPoints.reduce((prev, curr, i) => {\n if (!prev) return curr\n if (!curr) return prev\n return Math.abs(mouseLocationAxis.y - curr.location.y) < Math.abs(mouseLocationAxis.y - prev.location.y) ? curr : prev\n })\n\n if (nearestPoint) {\n // Translate data point from Axis to client.\n const nearestPointClient = chart.translateCoordinate(nearestPoint.location, chart.coordsAxis, chart.coordsClient)\n\n // Position and format custom HTML cursor.\n if (nearestPoint.location.x > chart.getDefaultAxisX().getInterval().end / 1.5) {\n textBox.style.left = `${Math.round(nearestPointClient.clientX - textBox.clientWidth - 10)}px`\n textBox.style.top = `${Math.round(nearestPointClient.clientY - textBox.clientHeight / 2)}px`\n arrow.style.left = '142px'\n arrow.style.transform = 'translate(-40%, -50%) rotate(-135deg)'\n } else {\n textBox.style.left = `${Math.round(nearestPointClient.clientX + 10)}px`\n textBox.style.top = `${Math.round(nearestPointClient.clientY - textBox.clientHeight / 2)}px`\n arrow.style.left = '-1px'\n arrow.style.transform = 'translate(-50%, -50%) rotate(45deg)'\n }\n\n line.innerHTML = `<b>Date: </b> <span id = 'date'>${new Date(\n 2021,\n 0,\n nearestPoint.location.x / (24 * 60 * 60 * 1000) + 1,\n ).toLocaleDateString()}</span>`\n\n const point = nearestDataPoints.map((el) => (el ? el.location.y : 0))\n let rowElement = ''\n for (let i = 0; i < series.length; i++) {\n const sign = point[i] > 0 ? '+' : ''\n rowElement += `<div class='values' style='color: ${colors[i]}' ><span>${series[i].getName()}:</span> ${\n sign + chart.getDefaultAxisY().formatValue(nearestDataPoints[i].location.y)\n }</div>`\n }\n line2.innerHTML = rowElement\n\n textBox.style.opacity = 1\n } else {\n textBox.style.opacity = 0\n }\n}\n\nconst mouseMoveHandler = (_, event) => {\n showCursorAt(event)\n}\nchart.onSeriesBackgroundMouseMove(mouseMoveHandler)\nseries.forEach((series) => {\n series.onMouseMove(mouseMoveHandler)\n})\n\nchart.onSeriesBackgroundMouseLeave((_, event) => {\n textBox.style.opacity = 0\n})\nchart.onSeriesBackgroundMouseDragStart((_, e) => {\n textBox.style.opacity = 0\n})\n\nchart.getDefaultAxisY().onIntervalChange(() => {\n textBox.style.opacity = 0\n})\nchart.getDefaultAxisX().onIntervalChange(() => {\n textBox.style.opacity = 0\n})\n\n// Add CSS.\nfunction addStyle(styleString) {\n const style = document.createElement('style')\n style.textContent = styleString\n document.head.append(style)\n}\n\naddStyle(`\n #resultTable {\n background-color: rgba(24, 24, 24, 0.9);\n color: white;\n font-size: 12px;\n border: solid white 2px;\n border-radius: 5px;\n width: 142px;\n // height: 110px;\n height: auto;\n top: 0;\n left: 0;\n position: fixed;\n padding: 0;\n pointer-events:none;\n z-index: 1;\n transition: left 0.2s, top 0.2s, opacity 0.2s;\n opacity: 0.0;\n }\n #arrow {\n position: absolute;\n background-color: rgba(24, 24, 24);\n height: 10px;\n width: 10px;\n top: 49%;\n border-left: solid white 2px;\n border-bottom: solid white 2px;\n box-shadow: 0 0 10px rgba(0, 0, 0, .5);\n transform-origin: center center;\n }\n p {\n margin:0;\n }\n #date {\n text-align: center;\n }\n .values {\n display: flex;\n justify-content: space-between;\n align-items center;\n margin: 5px 0;\n }\n .values span {\n margin-right: 10px \n }\n #line {\n background-color: grey;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n margin: 0;\n padding: 7px;\n font-size: 10px;\n height: 20%;\n font-family: Arial, sans-serif;\n width: auto;\n heigth: 100%;\n }\n #line2 {\n font-size: 13px;\n font-weight: 900;\n padding: 5px 14px\n }\n`)\n","url":null,"readme":"This example serves as an example for creating a custom cursor for XY charts.\n\nCustom cursors can be required for different purposes - like major structural changes or very application specific styling requirements.\n\nIf lesser changes to default cursors are required then please see read about different methods of configuring cursor behavior - `ChartXY` API reference has good links and explanations to follow.\n\nCustom cursors are most importantly based on `LCJS` methods that allow solving nearest data points in series from any supplied location.\nCustom user interactions and data point solving require solid understanding of different coordinate systems in web and `LCJS`, which is the primary reason this example exists;\n\n```javascript\n// Add custom action when user moves mouse over series area.\nchart.onSeriesBackgroundMouseMove((_, event) => {\n // `event` is a native JavaScript event, which packs the active mouse location in `clientX` and `clientY` properties.\n // it can be used for solving nearest data point ...\n const nearestDataPoint = series.solveNearestFromScreen(event)\n\n // ... or translated to a pair of Axes\n const mouseLocationAxis = chart.translateCoordinate(event, chart.coordsAxis)\n})\n```\n\nIn this example, the custom cursor visual is created with dynamically injected `HTML` and `CSS`.\n\n**The same approach could be used for interacting with any UI framework**, idea being that `LCJS` is used for solving the data point and translating the location to the document, where any `HTML` element can be absolute positioned with `left` & `top` style.\n\n![](./assets/cursor.gif)\n\nThe location and visibility of result table is animated with a `CSS` transition.\n\nMore custom cursor examples can be found under [\"cursor\" tag](https://arction.com/lightningchart-js-interactive-examples/search.html?t=cursor) in the _Interactive Examples_ gallery.\n","image":"CustomHTMLCursor"},{"id":"lcjs-example-0704-customCursorStackedY","title":"JavaScript Custom Cursor with Stacked Y Dashboard","tags":["xy","dashboard","cursor","ui","customtick"],"description":"Example showcasing custom cursor implementation with stacked Y charts","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-Performance Charts, Plot millions of data points in real-time. ECG Charts, XY Charts for real-time monitoring.","src":"/*\n * LightningChartJS example that showcases custom cursor implementation with stacked Y charts.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n emptyFill,\n AxisTickStrategies,\n AutoCursorModes,\n UILayoutBuilders,\n UIElementBuilders,\n UIOrigins,\n synchronizeAxisIntervals,\n Themes,\n} = lcjs\n\n// Import data-generator from 'xydata'-library.\nconst { createProgressiveTraceGenerator } = require('@lightningchart/xydata')\n\nconst channels = ['Ch 1', 'Ch 2', 'Ch 3']\nconst channelCount = channels.length\n\n// Create Dashboard.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfRows: channelCount,\n numberOfColumns: 1,\n})\n\n// Map XY-charts to Dashboard for each channel.\nconst charts = channels.map((channelName, i) => {\n const chart = dashboard.createChartXY({\n columnIndex: 0,\n rowIndex: i,\n columnSpan: 1,\n rowSpan: 1,\n })\n\n // Disable default auto cursor.\n chart.setAutoCursorMode(AutoCursorModes.disabled)\n\n if (i === 0) {\n chart.setTitle('Stacked Y Dashboard with Custom Cursor')\n } else {\n chart.setTitleFillStyle(emptyFill)\n }\n\n // Only display X ticks for bottom chart.\n if (i !== channelCount - 1) {\n chart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.Empty)\n }\n\n // Align Y axes of stacked charts.\n chart.getDefaultAxisY().setThickness(50)\n\n return chart\n})\n\n// The bottom X Axis, which shows ticks for all stacked charts.\nconst axisX = charts[charts.length - 1].getDefaultAxisX()\n\n// Add progressive line series to each chart.\nconst seriesList = charts.map((chart, i) =>\n chart.addLineSeries({\n dataPattern: {\n // pattern: 'ProgressiveX' => Each consecutive data point has increased X coordinate.\n pattern: 'ProgressiveX',\n },\n }),\n)\n\n// Code for synchronizing all X Axis intervals in stacked XY charts.\nconst syncedAxes = charts.map((chart) => chart.getDefaultAxisX())\nsynchronizeAxisIntervals(...syncedAxes)\n\n// Create UI elements for custom cursor.\nconst resultTable = dashboard\n .addUIElement(UILayoutBuilders.Column, dashboard.coordsRelative)\n .setMouseInteractions(false)\n .setOrigin(UIOrigins.LeftBottom)\n .setMargin(5)\n .setBackground((background) =>\n background\n // Style same as Theme result table.\n .setFillStyle(dashboard.getTheme().cursorResultTableFillStyle)\n .setStrokeStyle(dashboard.getTheme().cursorResultTableStrokeStyle),\n )\n\nconst resultTableTextBuilder = UIElementBuilders.TextBox\n // Style same as Theme result table text.\n .addStyler((textBox) => textBox.setTextFillStyle(dashboard.getTheme().cursorResultTableTextFillStyle))\n\nconst rowX = resultTable.addElement(UILayoutBuilders.Row).addElement(resultTableTextBuilder)\n\nconst rowsY = seriesList.map((el, i) => {\n return resultTable.addElement(UILayoutBuilders.Row).addElement(resultTableTextBuilder)\n})\n\nconst tickX = charts[channelCount - 1]\n .getDefaultAxisX()\n .addCustomTick(UIElementBuilders.PointableTextBox)\n .setAllocatesAxisSpace(false)\n .setGridStrokeStyle(dashboard.getTheme().cursorGridStrokeStyleX)\n\nconst ticksX = []\ncharts.forEach((chart, i) => {\n if (i !== channelCount - 1) {\n ticksX.push(\n chart\n .getDefaultAxisX()\n .addConstantLine()\n .setValue(0)\n .setMouseInteractions(false)\n // Style according to Theme cursor grid stroke.\n .setStrokeStyle(dashboard.getTheme().cursorGridStrokeStyleX),\n )\n }\n})\n\nconst ticksY = seriesList.map((el, i) => {\n return charts[i].getDefaultAxisY().addCustomTick(UIElementBuilders.PointableTextBox).setAllocatesAxisSpace(false)\n})\n\nconst setCustomCursorVisible = (visible) => {\n if (!visible) {\n resultTable.setVisible(false)\n tickX.setVisible(false)\n ticksY.forEach((el) => el.setVisible(false))\n ticksX.forEach((el) => el.setVisible(false))\n } else {\n resultTable.setVisible(true)\n tickX.setVisible(true)\n ticksY.forEach((el) => el.setVisible(true))\n ticksX.forEach((el) => el.setVisible(true))\n }\n}\n// Hide custom cursor components initially.\nsetCustomCursorVisible(false)\n\nconst showCursorAt = (clientCoordinate) => {\n // Find the nearest data point to the mouse.\n const nearestDataPoints = seriesList.map((el) => el.solveNearestFromScreen(clientCoordinate))\n\n // Abort operation if any of solved data points is `undefined`.\n if (nearestDataPoints.includes(undefined)) {\n setCustomCursorVisible(false)\n return\n }\n\n // Set custom cursor location.\n resultTable.setPosition(dashboard.translateCoordinate(clientCoordinate, dashboard.coordsRelative))\n\n // Format result table text.\n rowX.setText(`X: ${charts[0].getDefaultAxisX().formatValue(nearestDataPoints[0].location.x)}`)\n rowsY.forEach((rowY, i) => {\n rowY.setText(`Y${i}: ${charts[i].getDefaultAxisY().formatValue(nearestDataPoints[i].location.y)}`)\n })\n\n // Position custom ticks.\n tickX.setValue(nearestDataPoints[0].location.x)\n ticksX.forEach((tick, i) => {\n tick.setValue(tickX.getValue())\n })\n ticksY.forEach((tick, i) => {\n tick.setValue(nearestDataPoints[i].location.y)\n })\n\n // Display cursor.\n setCustomCursorVisible(true)\n}\n\n// Implement custom cursor logic with events.\nconst mouseMoveHandler = (_, event) => {\n showCursorAt(event)\n}\n\ncharts.forEach((chart, i) => {\n chart.onSeriesBackgroundMouseMove(mouseMoveHandler)\n seriesList[i].onMouseMove(mouseMoveHandler)\n seriesList[i].onMouseLeave(() => {\n setCustomCursorVisible(false)\n })\n\n // hide custom cursor and ticks if mouse leaves chart area\n chart.onSeriesBackgroundMouseLeave((_, e) => {\n setCustomCursorVisible(false)\n })\n\n // hide custom cursor and ticks on Drag\n chart.onSeriesBackgroundMouseDragStart((_, e) => {\n setCustomCursorVisible(false)\n })\n})\n\n// Generate data and add to series\nPromise.all(\n seriesList.map((series) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(100 * 1000)\n .generate()\n .toPromise()\n .then((data) => {\n series.add(data)\n }),\n ),\n).then(() => {\n charts.forEach((chart) => chart.forEachAxis((axis) => axis.fit(false)))\n requestAnimationFrame(() => {\n // Show custom cursor at start automatically.\n showCursorAt({ clientX: 500, clientY: 500 })\n })\n})\n","url":null,"readme":"This example serves as an example for custom data cursor implementation in _stacked Y charts dashboard_, where there are several XY charts stacked vertically on each other.\n\nCustom cursors can be required for different purposes - like major structural changes or very application specific styling requirements.\n\nIf lesser changes to default cursors are required then please see read about different methods of configuring cursor behavior - `ChartXY` API reference has good links and explanations to follow.\n\nIn this case, the X Axis of each chart are _synchronized_, and when user mouse is above the chart the data of all series `Y` coordinates is shown at the respective `X` coordinate.\n\nEach `LineSeries` contains 100 000 unique data points, coming to a total of **300 000** data points. Regardless, the interaction with cursor is instantaneous.\n\nCustom cursors are most importantly based on `LCJS` methods that allow solving nearest data points in series from any supplied location.\nCustom user interactions and data point solving require solid understanding of different coordinate systems in web and `LCJS`, which is the primary reason this example exists;\n\n```javascript\n// Add custom action when user moves mouse over series area.\nchart.onSeriesBackgroundMouseMove((_, event) => {\n // `event` is a native JavaScript event, which packs the active mouse location in `clientX` and `clientY` properties.\n // it can be used for solving nearest data point ...\n const nearestDataPoint = series.solveNearestFromScreen(event)\n\n // ... or translated to a pair of Axes\n const mouseLocationAxis = chart.translateCoordinate(event, chart.coordsAxis)\n})\n```\n\nThe default cursor can only display data from one chart at a time, but using the `LCJS` methods, the cursor can be configured to display data from all independent charts at the same time.\n\nMore custom cursor examples can be found by looking for \"cursor\" tag in the _Interactive Examples_ gallery.\n","image":"customCursorStackedY"},{"id":"lcjs-example-0706-onScreenMenu","title":"JavaScript On Screen Menu","tags":["xy","line","point","zoomband"],"description":"On Screen Menu showcase","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Scientific Chart examples, Create High-Performance Charts, Medical Charts examples, dashboard charts.","src":"/*\n * LightningChartJS example for rendering a 'Mesh Circle'.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, OnScreenMenuButtonType, OnScreenMenuButtonShape, ColorRGBA, SolidFill, PointShape, SolidLine, Themes } = lcjs\n\nconst { createProgressiveTraceGenerator, createProgressiveRandomGenerator } = xydata\n\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart().Dashboard({\n numberOfColumns: 1,\n numberOfRows: 3,\n // theme: Themes.darkGold\n})\n\n// Add XY Chart to top Cell in Dashboard.\nconst chart = dashboard.createChartXY({\n columnIndex: 0,\n columnSpan: 1,\n rowIndex: 0,\n rowSpan: 2,\n})\n\nconst axisX = chart.getDefaultAxisX().setInterval({\n start: 0,\n end: 100,\n})\n\n// Add Zoom Band Chart to bottom Cell in Dashboard.\nconst zoomBandChart = dashboard.createZoomBandChart({\n columnIndex: 0,\n rowIndex: 2,\n})\n\n// Add LineSeries to the XY Chart.\nconst line = chart.addLineSeries()\n\n// Styles for 2nd LineSeries\nconst customStrokeStyle = new SolidLine({\n fillStyle: new SolidFill({ color: ColorRGBA(200, 50, 50) }),\n thickness: 2,\n})\n\n// Add 2nd LineSeries to the XY Chart.\nconst line2 = chart.addLineSeries().setStrokeStyle(customStrokeStyle)\n\n// Add PointSeries to the XY Chart.\nconst point = chart\n .addPointSeries({ pointShape: PointShape.Circle })\n .setPointFillStyle(new SolidFill({ color: ColorRGBA(180, 180, 180) }))\n .setPointSize(10)\n\nzoomBandChart.add(line)\nzoomBandChart.add(line2)\nzoomBandChart.add(point)\n\n// Array that keeps data of 1st line series\nconst arr1 = []\n// Flag that dispose or restore PointSeries\nlet checked = false\n// Data of point coordinates\nlet prevPoint\n\n// Fill the Line Series with arbitrary data.\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(250)\n .generate()\n .toPromise()\n .then((data) => {\n arr1.push(...data)\n line.add(data)\n })\n\n// Stream some random data.\ncreateProgressiveRandomGenerator()\n .setNumberOfPoints(250)\n .generate()\n .setStreamBatchSize(1)\n .setStreamInterval(50)\n .setStreamRepeat(false)\n .toStream()\n .forEach((point) => {\n const y = point.y * (Math.random() * 20) - 10\n line2.add({ x: point.x, y })\n // check intersection of line series\n getIntersection({ x: point.x, y })\n\n if (point.x > 50 && point.x < 200) {\n const oldInterval = axisX.getInterval()\n axisX.setInterval({\n start: oldInterval.start + 1,\n end: oldInterval.end + 1,\n })\n }\n })\n\n// Add On-Screen menu\nchart.addOnScreenMenu(\n [\n [\n // Default buttons\n OnScreenMenuButtonType.ZoomInX,\n OnScreenMenuButtonType.ZoomOutX,\n OnScreenMenuButtonType.ZoomInY,\n OnScreenMenuButtonType.ZoomOutY,\n OnScreenMenuButtonType.ZoomToFit,\n OnScreenMenuButtonType.ToggleAnimations,\n // Custom button\n {\n icon: new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0706/icon.png',\n dimensions: { rows: 1, columns: 1 },\n opacity: '0.8',\n color: 'blue',\n shape: OnScreenMenuButtonShape.RoundedRectangle,\n action: show,\n },\n ],\n ],\n OnScreenMenuButtonShape.RoundedRectangle,\n)\n\n// Function for actions of Custom On Screen Menu Button\nfunction show() {\n if (!checked) {\n point.setVisible(false)\n } else {\n point.setVisible(true)\n }\n checked == false ? (checked = true) : (checked = false)\n}\n\nfunction getIntersection(currPoint) {\n // Index of last generated point\n const index = currPoint.x\n if (currPoint.x > 0) {\n // Check if lines were intersected\n if (\n (currPoint.y > arr1[index].y && prevPoint.y < arr1[index - 1].y) ||\n (currPoint.y < arr1[index].y && prevPoint.y > arr1[index - 1].y)\n ) {\n // Find point of intersection\n const interSectionPoint = calculateIntersection(currPoint, prevPoint, arr1[index], arr1[index - 1])\n point.add(interSectionPoint)\n }\n // Reassign curr point as prev. point\n prevPoint = currPoint\n } else {\n // Assign curr point as prev. point\n prevPoint = currPoint\n }\n}\n\n// The explanation of formula can be found in the description below\nfunction calculateIntersection(currPoint1, prevPoint1, currPoint2, prevPoint2) {\n // Expressions of numerator\n const exp1 = currPoint1.x * prevPoint1.y - currPoint1.y * prevPoint1.x\n const exp2 = currPoint2.x * prevPoint2.y - currPoint2.y * prevPoint2.x\n\n const exp3 = currPoint2.x - prevPoint2.x\n const exp4 = currPoint1.x - prevPoint1.x\n const exp5 = currPoint2.y - prevPoint2.y\n const exp6 = currPoint1.y - prevPoint1.y\n\n // Denominator\n const d1 = (currPoint1.x - prevPoint1.x) * (currPoint2.y - prevPoint2.y)\n const d2 = (currPoint1.y - prevPoint1.y) * (currPoint2.x - prevPoint2.x)\n const d = d1 - d2\n\n if (d === 0) {\n throw new Error('Number of intersection points is zero or infinity.')\n }\n\n const px = (exp1 * exp3 - exp4 * exp2) / d\n const py = (exp1 * exp5 - exp6 * exp2) / d\n\n const p = { x: px, y: py }\n\n // Return point\n return p\n}\n","url":null,"readme":"Example showcasing the use of On Screen Menu.\n\nOn-Screen Menu (OSM) is part of UI that can be used to simplify interaction with charts.\nIn this case the default buttons are used along with a custom button that shows/hides the intersection points of lines.\n\nThe On-Screen menu can be added this way:\n\n```javascript\nconst chart = lightningChart().ChartXY()\n\nchart.addOnScreenMenu(\n [\n [\n // default buttnos\n OnScreenMenuButtonType.ZoomInX,\n OnScreenMenuButtonType.ZoomOutX,\n OnScreenMenuButtonType.ZoomInY,\n OnScreenMenuButtonType.ZoomOutY,\n OnScreenMenuButtonType.ZoomToFit,\n OnScreenMenuButtonType.ToggleAnimations,\n ],\n ],\n OnScreenMenuButtonShape.RoundedRectangle,\n)\n```\n\nTo add a custom button parameters must be defined.\n\n```javascript\nconst chart = lightningChart().ChartXY()\n\nchart.addOnScreenMenu([\n [\n // cusrom button\n {\n icon: new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/9999/icon.png',\n dimensions: { rows: 1, columns: 1 },\n label: '',\n opacity: '0.8',\n color: 'blue',\n shape: OnScreenMenuButtonShape.RoundedRectangle,\n action: show,\n },\n ],\n])\n```\n\n'addOnScreenMenu' takes an array of arrays as a parameter.\nEach sub array adds a new line on the OSM menu.\n\n![](./assets/OSM.png)\n\n```javascript\nconst chart = lightningChart().ChartXY()\n\nchart.addOnScreenMenu([\n [\n OnScreenMenuButtonType.ZoomInX,\n OnScreenMenuButtonType.ZoomOutX,\n OnScreenMenuButtonType.ZoomInY,\n OnScreenMenuButtonType.ZoomOutY,\n OnScreenMenuButtonType.ZoomIn,\n OnScreenMenuButtonType.ZoomOut,\n ],\n [OnScreenMenuButtonType.ZoomToFit, OnScreenMenuButtonType.ToggleAnimations],\n [\n {\n icon: new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/9999/icon.png',\n dimensions: { rows: 1, columns: 1 },\n opacity: '0.8',\n color: 'blue',\n shape: OnScreenMenuButtonShape.RoundedRectangle,\n action: show,\n },\n ],\n])\n```\n\nFormula of lines intersection\n\n![](./assets/formula.png)\n\n```javascript\nfunction calculateIntersection(currPoint1, prevPoint1, currPoint2, prevPoint2) {\n // Expressions of numerator\n const exp1 = currPoint1.x * prevPoint1.y - currPoint1.y * prevPoint1.x // (x1 * y2 - y1 * x2)\n const exp2 = currPoint2.x * prevPoint2.y - currPoint2.y * prevPoint2.x // (x3 * y4 - y3 * x4)\n\n const exp3 = currPoint2.x - prevPoint2.x // (x3 - x4)\n const exp4 = currPoint1.x - prevPoint1.x // (x1 - x2)\n const exp5 = currPoint2.y - prevPoint2.y // (y3 - y4)\n const exp6 = currPoint1.y - prevPoint1.y // (y1 - y2)\n\n // Denominator\n const d1 = (currPoint1.x - prevPoint1.x) * (currPoint2.y - prevPoint2.y) // (x1 - x2) * (y3 - y4)\n const d2 = (currPoint1.y - prevPoint1.y) * (currPoint2.x - prevPoint2.x) // (y1 - y2) * (x3 - x4)\n const d = d1 - d2\n\n if (d === 0) {\n throw new Error('Number of intersection points is zero or infinity.')\n }\n\n const px = (exp1 * exp3 - exp4 * exp2) / d\n const py = (exp1 * exp5 - exp6 * exp2) / d\n\n const p = { x: px, y: py }\n\n // Return point\n return p\n}\n```\n","image":"osm"},{"id":"lcjs-example-0800-heatmapGrid","title":"JavaScript Heatmap Grid Chart","tags":["xy","heatmap","palette"],"description":"Example showcasing simple usage of Heatmap Grid Series.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance heatmaps, scientific data visualization, scrolling heatmap charts, spectrograms as a heatmap.","src":"/*\n * LightningChartJS example that showcases a simple XY line series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PalettedFill, LUT, regularColorSteps, emptyLine, Themes } = lcjs\n\nconst { createWaterDropDataGenerator } = require('@lightningchart/xydata')\n\n// Specify the resolution used for the heatmap.\nconst resolutionX = 1000\nconst resolutionY = 1000\n\n// Create a XY Chart.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle(\n `Heatmap Grid Series ${resolutionX}x${resolutionY} (${((resolutionX * resolutionY) / 1000000).toFixed(1)} million data points)`,\n )\n .setPadding({ right: 40 })\n\n// Create LUT and FillStyle\nconst theme = chart.getTheme()\nconst palette = new LUT({\n units: 'intensity',\n percentageValues: true,\n steps: regularColorSteps(\n // first color at min value\n 0,\n // last color at 70% between min and max value\n 0.7,\n theme.examples.intensityColorPalette,\n ),\n interpolate: false,\n})\n\n// Generate heatmap data.\ncreateWaterDropDataGenerator()\n .setRows(resolutionX)\n .setColumns(resolutionY)\n .generate()\n .then((data) => {\n // Add a Heatmap to the Chart.\n const heatmap = chart\n .addHeatmapGridSeries({\n columns: resolutionX,\n rows: resolutionY,\n start: { x: 0, y: 0 },\n end: { x: resolutionX, y: resolutionY },\n dataOrder: 'columns',\n })\n // Color Heatmap using previously created color look up table.\n .setFillStyle(new PalettedFill({ lut: palette }))\n .setWireframeStyle(emptyLine)\n .invalidateIntensityValues(data)\n\n // Add LegendBox.\n const legend = chart\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart)\n })\n","url":null,"readme":"This example showcases simple usage of `HeatmapGridSeries`, a simple, yet incredibly series type.\n\n`HeatmapGridSeries` visualizes three dimensional data (X, Y, color) of large quantities.\nIt can easily handle data sets in million data points range even on low-end devices.\nWith large amounts of RAM even **billions** of data points can be visualized!\n\nHeatmaps can be created in XY Charts:\n\n```javascript\n// Add heatmap Grid Series to a XY Chart\nchartXY.addHeatmapGridSeries({\n columns: horizontalResolution,\n rows: verticalResolution,\n})\n```\n\nThe data used for the heatmap is created using the WaterdropGenerator function in the example code.\n\n# Heatmap Grid Series options\n\nWhen `HeatmapGridSeries` is created, there are minimum of two properties that have to be specified:\n\n`columns`: amount of data values along X dimension.\n\n`rows`: amount of data values along Y dimension.\n\nConfiguration of these two properties is enough for a fully functioning heatmap grid series.\n\nThe following optional properties can be used for tweaking heatmap behavior for exact application purposes:\n\n`start`: Axis coordinate where heatmap grid begins.\n\n`end`: Axis coordinate where heatmap grid ends.\n\n`step`: Alternate syntax, supplying a `step` value will result in automatic calculation of `end` based on `columns` / `rows` amount.\n\n`dataOrder`: By default incoming intensity data is treated as _list of columns_. This can be flipped by selecting `dataOrder: 'rows'`.\n\n# Heatmap Grid Series data input\n\nThe data set of `HeatmapGridSeries` is defined as a _number matrix_, for example:\n\n```js\n// Example syntax of 3x5 number matrix.\n;[\n [0, 1, 0, 1, 0],\n [1, 0, 1, 0, 0],\n [0, 0, 0, 0, 0],\n]\n```\n\nThe data set is specified with `invalidateIntensityValues` method. There are two overrides for this method.\n\n```js\n// Example syntax, invalidate intensity values override #1, specify data from beginning of heatmap.\nheatmap.invalidateIntensityValues([\n // dataOrder: 'columns', columns: 3, rows: 5\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0],\n])\n```\n\n```js\n// Example syntax, invalidate intensity values override #2, specify data from arbitrary offset.\nheatmap.invalidateIntensityValues({\n iColumn: 10,\n iRow: 0,\n values: [\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0],\n ],\n})\n```\n","image":"heatmapGrid"},{"id":"lcjs-example-0801-heatmapMesh","title":"JavaScript Heatmap Mesh Chart","tags":["xy","heatmap","palette"],"description":"Example showcasing simple use-case for Mesh-type Heatmap","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance heatmaps, scientific data visualization, scrolling heatmap charts, spectrograms as a heatmap.","src":"/*\n * LightningChartJS example that showcases a simple XY line series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, IntensitySeriesTypes, IndividualPointFill, ColorHSV, Themes } = lcjs\n\n// Helper function to help turn degrees to radians\nfunction degToRad(angle) {\n return (angle * Math.PI) / 180\n}\n\n// Resolution of each row/column, specifying how many cells\n// are in the heatmap.\nconst resolution = 20\n\n// Create a new ChartXY.\nconst chart = lightningChart().ChartXY({\n // theme: Themes.darkGold\n})\nchart.setTitle('Heatmap using IntensityMesh')\n\n// Add a heatmap to the chart, as a IntensityMesh\nconst heatmap = chart\n .addHeatmapSeries({\n rows: resolution,\n columns: resolution,\n start: { x: 10, y: 10 },\n end: { x: 1990, y: 1990 },\n pixelate: true,\n type: IntensitySeriesTypes.Mesh,\n })\n // Add colors and invalidate the Series based on the colors assigned.\n .invalidateColorsOnly((row, column) => ColorHSV(Math.random() * 70, 0.8))\n // Use IndividualPointFill to apply individual color per cell.\n .setFillStyle(new IndividualPointFill())\n // Edit the geometry and invalidate the Series based on the new geometry.\n .invalidateGeometryOnly((row, column, prev) => ({\n // Compute the geometry for each cell in the heatmap.\n x: prev.x * Math.sin(degToRad(row + 1)),\n y: prev.x * Math.sin(degToRad(column + 1)),\n }))\n\n// Add LegendBox to chart.\nconst legend = chart\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart)\n","url":null,"readme":"The Heatmap Mesh feature has been removed in v4.0.0.\n\nIf your application requires this feature, please, contact us at [email protected]\n","image":"heatmapMesh"},{"id":"lcjs-example-0802-spectrogram","title":"JavaScript Heatmap Spectrogram Chart","tags":["xy","heatmap","spectrogram","audio","dashboard","palette"],"description":"Example showcasing 2D audio analysis spectrogram with LightningChart JS","metaDescription":"LightningChart JS Interactive Examples. Fastest JavaScript Charts: Create High-Performance Scientific Charts, Precision for Medical Charts, Spectrograms, 2D Charts, 3D charts, Heatmaps as Spectrograms.","src":"/*\n * LightningChartJS 2D audio analysis spectrogram example.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PalettedFill, LUT, emptyLine, AxisScrollStrategies, AxisTickStrategies, regularColorSteps, Themes } = lcjs\n\nconst AudioContext = window.AudioContext || window.webkitAudioContext\n// Create a new audio context,\n// for most part this context is not used for other than creating audiobuffer from audio data\nconst audioCtx = new AudioContext()\n\n// General configuration for common settings\nconst config = {\n /**\n * The resolution of the FFT calculations\n * Higher value means higher resolution decibel domain..\n */\n fftResolution: 4096,\n /**\n * Smoothing value for FFT calculations\n */\n smoothingTimeConstant: 0.1,\n /**\n * The size of processing buffer,\n * determines how often FFT is run\n */\n processorBufferSize: 2048,\n}\n\n// Initialize LightningChart JS\nconst lc = lightningChart()\n\n/**\n * Fetch audio file and create audio buffer from it.\n * @param {string} waveformUrl URL to the WaveForm to load\n * @returns {AudioBuffer} The audio file as an AudioBuffer\n */\nconst loadWaveForm = async (waveformUrl) => {\n // Fetch waveform\n const resp = await fetch(waveformUrl)\n // Convert fetch to array buffer\n const waveDataBuffer = await resp.arrayBuffer()\n // Convert array buffer to audio buffer\n const audioBuffer = await audioCtx.decodeAudioData(waveDataBuffer)\n return audioBuffer\n}\n\n/**\n * @typedef WaveFormData\n * @type {object}\n * @property {Uint8Array[]} channels FFT Data for each channel\n * @property {number} stride Number of data points in a data block\n * @property {number} rowCount Number of rows of data\n * @property {number} maxFreq Maximum frequency of the data\n * @property {number} duration Audio buffer duration in seconds\n */\n\n/**\n * Process a AudioBuffer and create FFT Data for Spectrogram from it.\n * @param {AudioBuffer} audioBuffer AudioBuffer to process into FFT data.\n * @returns {WaveFormData} Processed data\n */\nconst processWaveForm = async (audioBuffer) => {\n // Create a new OfflineAudioContext with information from the pre-created audioBuffer\n // The OfflineAudioContext can be used to process a audio file as fast as possible.\n // Normal AudioContext would process the file at the speed of playback.\n const offlineCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.length, audioBuffer.sampleRate)\n // Create a new source, in this case we have a AudioBuffer to create it for, so we create a buffer source\n const source = offlineCtx.createBufferSource()\n // Set the buffer to the audio buffer we are using\n source.buffer = audioBuffer\n // Set source channel count to the audio buffer channel count, if this wasn't set, the source would default to 2 channels.\n source.channelCount = audioBuffer.numberOfChannels\n\n // We want to create spectrogram for each channel in the buffer, so we need to separate the channels to separate outputs.\n const splitter = offlineCtx.createChannelSplitter(source.channelCount)\n // Create a analyzer node for the full context\n const generalAnalyzer = offlineCtx.createAnalyser()\n generalAnalyzer.fftSize = config.fftResolution\n generalAnalyzer.smoothingTimeConstant = config.smoothingTimeConstant\n\n // Prepare buffers and analyzers for each channel\n const channelFFtDataBuffers = []\n const channelDbRanges = []\n const analyzers = []\n for (let i = 0; i < source.channelCount; i += 1) {\n channelFFtDataBuffers[i] = new Uint8Array((audioBuffer.length / config.processorBufferSize) * (config.fftResolution / 2))\n // Setup analyzer for this channel\n analyzers[i] = offlineCtx.createAnalyser()\n analyzers[i].smoothingTimeConstant = config.smoothingTimeConstant\n analyzers[i].fftSize = config.fftResolution\n // Connect the created analyzer to a single channel from the splitter\n splitter.connect(analyzers[i], i)\n channelDbRanges.push({\n minDecibels: analyzers[i].minDecibels,\n maxDecibels: analyzers[i].maxDecibels,\n })\n }\n // Script processor is used to process all of the audio data in fftSize sized blocks\n // Script processor is a deprecated API but the replacement APIs have really poor browser support\n offlineCtx.createScriptProcessor = offlineCtx.createScriptProcessor || offlineCtx.createJavaScriptNode\n const processor = offlineCtx.createScriptProcessor(config.processorBufferSize, 1, 1)\n let offset = 0\n processor.onaudioprocess = (ev) => {\n // Run FFT for each channel\n for (let i = 0; i < source.channelCount; i += 1) {\n const freqData = new Uint8Array(channelFFtDataBuffers[i].buffer, offset, analyzers[i].frequencyBinCount)\n analyzers[i].getByteFrequencyData(freqData)\n }\n offset += generalAnalyzer.frequencyBinCount\n }\n // Connect source buffer to correct nodes,\n // source feeds to:\n // splitter, to separate the channels\n // processor, to do the actual processing\n // generalAanalyzer, to get collective information\n source.connect(splitter)\n source.connect(processor)\n processor.connect(offlineCtx.destination)\n source.connect(generalAnalyzer)\n // Start the source, other wise start rendering would not process the source\n source.start(0)\n\n // Process the audio buffer\n await offlineCtx.startRendering()\n return {\n channels: channelFFtDataBuffers,\n channelDbRanges,\n stride: config.fftResolution / 2,\n tickCount: Math.ceil(audioBuffer.length / config.processorBufferSize),\n maxFreq: offlineCtx.sampleRate / 2, // max freq is always half the sample rate\n duration: audioBuffer.duration,\n }\n}\n\n/**\n * Create data matrix for heatmap from one dimensional array\n * @param {Uint8Array} data FFT Data\n * @param {number} strideSize Single data block width\n * @param {number} tickCount Data row count\n */\nconst remapDataToTwoDimensionalMatrix = (data, strideSize, tickCount) => {\n /**\n * @type {Array<number>}\n */\n const arr = Array.from(data)\n\n // Map the one dimensional data to two dimensional data where data goes from right to left\n // [1, 2, 3, 4, 5, 6]\n // -> strideSize = 2\n // -> rowCount = 3\n // maps to\n // [1, 4]\n // [2, 5]\n // [3, 6]\n const output = Array.from(Array(strideSize)).map(() => Array.from(Array(tickCount)))\n for (let row = 0; row < strideSize; row += 1) {\n for (let col = 0; col < tickCount; col += 1) {\n output[row][col] = arr[col * strideSize + row]\n }\n }\n\n return output\n}\n\n/**\n * Create a chart for a channel\n * @param {number} channelIndex Current channel index\n * @param {number} rows Data row count\n * @param {number} columns Data column count\n * @param {number} maxFreq Maximum frequency for data\n * @param {number} duration Duration in seconds\n * @param {number} minDecibels dB amount that matches value 0 in data (Uint8).\n * @param {number} maxDecibels dB amount that matches value 255 in data (Uint8).\n */\nconst createChannel = (chart, channelIndex, rows, columns, maxFreq, duration, minDecibels, maxDecibels) => {\n const theme = chart.getTheme()\n\n // Define function that maps Uint8 [0, 255] to Decibels.\n const intensityDataToDb = (intensity) => minDecibels + (intensity / 255) * (maxDecibels - minDecibels)\n\n // Start position of the heatmap\n const start = {\n x: 0,\n y: 0,\n }\n // End position of the heatmap\n const end = {\n x: duration,\n // Use half of the fft data range\n y: Math.ceil(maxFreq / 2),\n }\n const yAxis = chart.addAxisY({ iStack: 1 - channelIndex }).setMargins(channelIndex < 1 ? 15 : 0, channelIndex > 0 ? 15 : 0)\n // Create the series\n const series = chart\n .addHeatmapGridSeries({\n yAxis,\n // Data columns, defines horizontal resolution\n columns: columns,\n // Use half of the fft data range\n rows: Math.ceil(rows / 2),\n // Start position, defines where one of the corners for hetmap is\n start,\n // End position, defines the opposite corner of the start corner\n end,\n dataOrder: 'rows',\n heatmapDataType: 'intensity',\n })\n // Use palletted fill style, intensity values define the color for each data point based on the LUT\n .setFillStyle(\n new PalettedFill({\n lut: new LUT({\n steps: regularColorSteps(0, 255, theme.examples.spectrogramColorPalette, {\n formatLabels: (value) => `${Math.round(intensityDataToDb(value))}`,\n }),\n units: 'dB',\n interpolate: true,\n }),\n }),\n )\n .setWireframeStyle(emptyLine)\n .setCursorResultTableFormatter((builder, series, dataPoint) =>\n builder\n .addRow(series.getName())\n .addRow('X:', '', series.axisX.formatValue(dataPoint.x))\n .addRow('Y:', '', series.axisY.formatValue(dataPoint.y))\n .addRow('', intensityDataToDb(dataPoint.intensity).toFixed(1) + ' dB'),\n )\n\n // Set default X axis settings\n yAxis\n .setInterval({ start: start.y, end: end.y, stopAxisAfter: false })\n .setTitle(`Channel ${channelIndex + 1} (Hz)`)\n .setScrollStrategy(AxisScrollStrategies.fitting)\n\n return {\n series,\n yAxis,\n }\n}\n\n/**\n * Render a spectrogram for given data set\n * @param {WaveFormData} data Data set to render\n */\nconst renderSpectrogram = async (data) => {\n const chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Spectrogram chart 2 channels')\n chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Numeric)\n .setScrollStrategy(AxisScrollStrategies.fitting)\n .setTitle(`Duration (s)`)\n chart.getDefaultAxisY().dispose()\n // Create channels and set data for each channel\n for (let i = 0; i < data.channels.length; i += 1) {\n // Create a chart for the channel\n const ch = createChannel(\n chart,\n i,\n data.stride,\n data.tickCount,\n data.maxFreq,\n data.duration,\n data.channelDbRanges[i].minDecibels,\n data.channelDbRanges[i].maxDecibels,\n )\n // Setup the data for the chart\n const remappedData = remapDataToTwoDimensionalMatrix(data.channels[i], data.stride, data.tickCount)\n // Slice only first half of data (rest are 0s).\n .slice(0, data.stride / 2)\n\n // Set the heatmap data\n ch.series.invalidateIntensityValues({\n iRow: 0,\n iColumn: 0,\n values: remappedData,\n })\n }\n\n // Add LegendBox.\n const legend = chart\n .addLegendBox()\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n}\n\n;(async () => {\n // Remove loading spinner\n document.querySelectorAll('.loading').forEach((item) => {\n item.parentElement.removeChild(item)\n })\n const run = async () => {\n // Load waveform from url\n const waveform = await loadWaveForm(\n new URL(document.head.baseURI).origin +\n new URL(document.head.baseURI).pathname +\n 'examples/assets/0802/Truck_driving_by-Jason_Baker-2112866529_edit.wav',\n )\n // Process the loaded wave form to prepare it for being added to the chart\n const processed = await processWaveForm(waveform)\n // Create a dashboard from the processed waveform data\n renderSpectrogram(processed)\n }\n // Check if audio context was started\n if (audioCtx.state === 'suspended') {\n // Show a large play button\n const resumeElement = document.createElement('div')\n resumeElement.style.position = 'absolute'\n resumeElement.style.top = '0'\n resumeElement.style.left = '0'\n resumeElement.style.right = '0'\n resumeElement.style.bottom = '0'\n\n const resumeImg = document.createElement('img')\n resumeImg.crossOrigin = ''\n resumeImg.src =\n new URL(document.head.baseURI).origin +\n new URL(document.head.baseURI).pathname +\n 'examples/assets/0802/play_circle_outline-24px.svg'\n resumeImg.style.width = '100%'\n resumeImg.style.height = '100%'\n\n resumeElement.onclick = () => {\n audioCtx.resume()\n }\n resumeElement.appendChild(resumeImg)\n\n const innerElement = document.querySelector('.chart')\n let target\n if (!innerElement) {\n target = document.createElement('div')\n target.classList.add('inner')\n document.body.appendChild(target)\n }\n const targetElement = innerElement || target\n targetElement.appendChild(resumeElement)\n\n // Attach a listener to the audio context to remove the play button as soon as the context is running\n audioCtx.onstatechange = () => {\n if (audioCtx.state === 'running') {\n run()\n audioCtx.onstatechange = void 0\n targetElement.removeChild(resumeElement)\n }\n }\n } else {\n // Audio context is running so run the example\n run()\n }\n})()\n","url":null,"readme":"This example shows a simple use case for Heatmaps as a spectrogram.\n\nSpectrogram is a visual representation of the spectrum of frequencies. Spectrograms can be used to visualize any wave form. Most often spectrograms are used to display audio signals.\n\nThis example loads a audio file and shows spectrograms for each channel on the audio file.\n\nThe spectrogram shows frequency on one axis (Y Axis) and time on the other (X Axis). The color of a the heatmap at any point is the amplitude of the frequency at the specified time.\n\n## Getting the data\n\nFirst the audio file that will be shown is loaded with [fetch][fetch] and converted into an ArrayBuffer.\n\n```js\nconst response = await fetch('url')\nconst buffer = await response.arrayBuffer()\n```\n\nThis example uses the [Web Audio APIs][web-audio-api] to retrieve the frequency data to display in the heatmap. These APIs make it easy to work with audio files and manipulate the files. For spectrogram use the [AnalyzerNode][analyzer-node] is the most useful part of the API as it provides [getByteFrequencyData][getbytefrequencydata] method which is a implementation of [Fast Fourier Transform][fft].\nThe AudioContext contains method to convert an ArrayBuffer into an [AudioBuffer][audiobuffer].\n\n```js\nconst audioBuffer = await audioContext.decodeAudioData(buffer)\n```\n\nNow that the audio file is converted into a AudioBuffer it's possible to start extracting data from it.\n\nTo process the full audio buffer as fast as possible, a [OfflineAudioContext][offlineaudiocontext] is used. The OfflineAudioContext doesn't output the data to a audio device, instead it will go through the audio as fast as possible and outputs an AudioBuffer with the processed data. In this example the processed audio buffer is not used, but the processing is used to calculate the FFT data we need to display the intensities for each frequency in the spectrogram. The audio buffer we have created is used as a [buffer source][createbuffersource] for the OfflineAudioContext.\n\nThe buffer source only has a single output but we want to be able to process each channel separately, to do this a [ChannelSplitter][createchannelsplitter] is used with the output count matching the source channel count.\n\n```js\nconst splitter = offlineCtx.createChannelSplitter(source.channelCount)\n```\n\nThis makes it possible to process each channel separately by making it possible to create AnalyzerNodes for each channel and only piping a single channel to each analyzer.\n\nA [ScriptProcessorNode][createscriptprocessor] is used to go through the audio buffer in chuncks. For each chunk, the FFT data is calculated for each channel and stored in large enough buffers to fit the full data.\n\nLast [startRendering()][start-rendering] method is called to render out the audio buffer. This is when all of the FFT calculation is done.\n\n## Showing the data\n\nEach channel of the audio file is shown in it's own chart inside a single dashboard. When the data is calculated, a dashboard is made. This dashboard is then passed to functions that setup the charts inside the dashboard and create the heatmap series based on the script processor buffer size and fft resolution.\n\nThe data from the audio APIs is in wrong format to display in the heatmap without editing it. The heatmap data has to be mapped from the one dimensional array it was generated in to a two dimensional array. This mapping in this example is done with `remapDataToTwoDimensionalMatrix` function, this function maps the data in columns. If the heatmap was displayed vertically, then the mapping would be easier as each stride of data could just be placed as a row.\n\n```js\n// Datamapping for vertical spectrogram\nconst output = Array.from(Array(tickCount)).map(() => Array.from(Array(strideSize)))\nfor (let row = 0; row < strideSize; row += 1) {\n output[row] = arr.slice(row * strideSize, row * strideSize + strideSize)\n}\n```\n\n[web-audio-api]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n[analyzer-node]: https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode\n[getbytefrequencydata]: https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getByteFrequencyData\n[fft]: https://en.wikipedia.org/wiki/Fast_Fourier_transform\n[fetch]: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n[audiobuffer]: https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer\n[offlineaudiocontext]: https://developer.mozilla.org/en-US/docs/Web/API/OfflineAudioContext\n[createbuffersource]: https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/createBufferSource\n[createchannelsplitter]: https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/createChannelSplitter\n[createsciptprocessor]: https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/createScriptProcessor\n[start-rendering]: https://developer.mozilla.org/en-US/docs/Web/API/OfflineAudioContext/startRendering\n","image":"spectrogram","showNew":true},{"id":"lcjs-example-0803-scrollingHeatmap","title":"JavaScript Scrolling Heatmap Chart","tags":["xy","heatmap","realtime","palette"],"description":"Example showcasing simple usage of Scrolling Heatmap Grid Series","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance heatmaps, scientific data visualization, scrolling heatmap charts, spectrograms as a heatmap.","src":"/*\n * LightningChartJS example that showcases simple usage of Scrolling Heatmap Grid Series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n PalettedFill,\n LUT,\n emptyLine,\n AxisScrollStrategies,\n AxisTickStrategies,\n LegendBoxBuilders,\n regularColorSteps,\n Themes,\n} = lcjs\n\nconst { createSpectrumDataGenerator } = require('@lightningchart/xydata')\n\n// Length of single data sample.\nconst dataSampleSize = 512\n// Sampling rate as samples per second (only required for example purposes).\nconst sampleRateHz = 100\n// Minimum time step that can be displayed by the heatmap. In this example, set to half of average interval between samples. In normal applications you can set this to some comfortably small value.\n// Smaller value means more precision but more RAM and GPU memory usage.\nconst heatmapMinTimeStepMs = (0.5 * 1000) / sampleRateHz\n// Time axis view at start\nconst viewMs = 10 * 1000\n\n// Create ChartXY.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Scrolling Heatmap Spectrogram')\nchart\n .getDefaultAxisX()\n .setTitle('Time')\n // Setup progressive scrolling Axis.\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - viewMs, stopAxisAfter: false }))\n .setTickStrategy(AxisTickStrategies.Time)\n\nchart.getDefaultAxisY().setTitle('Frequency (Hz)').setInterval({ start: 0, end: dataSampleSize })\n\nconst theme = chart.getTheme()\n// Setup PalettedFill for dynamically coloring Heatmap by Intensity values.\nconst lut = new LUT({\n steps: regularColorSteps(0, 75, theme.examples.spectrogramColorPalette),\n units: 'dB',\n interpolate: true,\n})\nconst paletteFill = new PalettedFill({ lut, lookUpProperty: 'value' })\n\n// Create Scrolling Heatmap Grid Series.\nconst heatmapSeries = chart\n .addHeatmapScrollingGridSeries({\n scrollDimension: 'columns',\n resolution: dataSampleSize,\n start: { x: 0, y: 0 },\n step: { x: heatmapMinTimeStepMs, y: 1 },\n })\n .setFillStyle(paletteFill)\n .setWireframeStyle(emptyLine)\n // Configure automatic data cleaning.\n .setDataCleaning({\n // Out of view data can be lazily removed as long as total columns count remains over 1000.\n minDataPointCount: 1000,\n })\n\n// Add LegendBox to chart.\nconst legend = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n .add(chart)\n\nconst handleIncomingData = (timestamp, sample) => {\n // Calculate sample index from timestamp to place sample in correct location in heatmap.\n const iSample = Math.round(timestamp / heatmapMinTimeStepMs)\n heatmapSeries.invalidateIntensityValues({\n iSample,\n values: [sample],\n })\n}\n\n// Generate and stream example data. The below code would not be needed in a real application, this is only for example purposes.\nlet dataAmount = 0\ncreateSpectrumDataGenerator()\n .setSampleSize(dataSampleSize)\n .setNumberOfSamples(1000)\n .generate()\n .toPromise()\n .then((data) => {\n // Scale Intensity values from [0.0, 1.0] to [0.0, 80]\n return data.map((sample) => sample.map((intensity) => intensity * 80))\n })\n .then((data) => {\n let iData = 0\n let tPrev = window.performance.now()\n let dModulus = 0\n const streamData = () => {\n const tNow = window.performance.now()\n let addDataPointCount = ((tNow - tPrev) * sampleRateHz) / 1000 + dModulus\n dModulus = addDataPointCount % 1\n addDataPointCount = Math.floor(addDataPointCount)\n for (let i = 0; i < addDataPointCount; i += 1) {\n const timestamp = tPrev + ((i + 1) / addDataPointCount) * (tNow - tPrev)\n const sample = data[iData]\n iData = (iData + 1) % data.length\n handleIncomingData(timestamp, sample)\n }\n dataAmount += addDataPointCount * dataSampleSize\n tPrev = tNow\n requestAnimationFrame(streamData)\n }\n streamData()\n })\n\n// Display incoming points amount in Chart title.\nconst title = chart.getTitle()\nlet tStart = Date.now()\nlet lastReset = Date.now()\nconst updateChartTitle = () => {\n // Calculate amount of incoming points / second.\n if (dataAmount > 0 && Date.now() - tStart > 0) {\n const pps = (1000 * dataAmount) / (Date.now() - tStart)\n chart.setTitle(`${title} (${Math.round(pps)} data points / s)`)\n }\n // Reset pps counter every once in a while in case page is frozen, etc.\n if (Date.now() - lastReset >= 5000) {\n tStart = lastReset = Date.now()\n dataAmount = 0\n }\n}\nsetInterval(updateChartTitle, 1000)\n","url":null,"readme":"This example showcases simple usage of `HeatmapScrollingGridSeries`, a simple, yet incredibly powerful series type.\n\n`HeatmapScrollingGridSeries` visualizes three dimensional data (X, Y, color) of large quantities.\nIt can easily handle data sets in million data points range even on low-end devices.\nWith large amounts of RAM even **billions** of data points can be visualized!\n\nHeatmaps can be created in XY Charts:\n\n```javascript\n// Add heatmap scrolling Grid Series to a XY Chart\nchartXY.addHeatmapScrollingGridSeries({\n resolution: 100,\n})\n```\n\nThe example displays live speed of incoming data as _data points per second_, feel free to try higher data rates by altering `dataSampleSize` in the example code to see how much data `HeatmapScrollingGridSeries` can handle on your machine!\n\nFor reference, on a Lenovo Yoga (average office laptop with no GPU to speak of), there was no visible effort even with `dataSampleSize: 5000` which means **150 000 incoming data points every single second**.\n\nWhat's equally impressive is that thanks to automatic data cleaning, this application can _run indefinitely!_ Read more about automatic data cleaning with `HeatmapScrollingGridSeries` below.\n\n# Heatmap Scrolling Grid Series options\n\nWhen `HeatmapScrollingGridSeries` is created, there is only one property that has to be specified always:\n\n`resolution`: amount of data values along non-scrolling dimension.\n\nWith just this configuration, a fully functional scrolling heatmap grid series capable of handling tens of millions data points is created.\n\nThe following optional properties can be used for tweaking heatmap behavior for exact application purposes:\n\n`start`: Axis coordinate where heatmap grid begins.\n\n`step`: The Axis offset between two heatmap cells.\n\n`scrollDimension`: By default the series is configured to have fixed `rows` (Y) resolution and scroll indefinitely along `columns` (X). This can be flipped by specifying `scrollDimension: rows`.\n\n# Heatmap Scrolling Grid Series data input\n\n`HeatmapScrollingGridSeries` receives data as _append_ operation to push on top of previously pushed data.\n\nData is added using `addIntensityValues` method:\n\n```js\n// Example syntax, append 2 samples to scrolling heatmap grid with resolution: 10\nheatmap.addIntensityValues([\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n])\n```\n\n# Heatmap Scrolling Grid Series data cleaning\n\nAutomatic data cleaning is essential in streaming applications that run for long times or _even indefinitely_;\n\nIn LightningChart JS, this is configured with the `setDataCleaning` method;\n\n```js\n// Example, configure automatic data cleaning.\nheatmapGridSeries.setDataCleaning({\n // Out of view data can be lazily removed as long as total scrolling columns count remains over 1000.\n minDataPointCount: 1000,\n})\n```\n\nSimple? _- Yes._\n\nPowerful? _- Naturally._\n","image":"scrollingHeatmap"},{"id":"lcjs-example-0804-meshCircle","title":"JavaScript Mesh Circle Chart","tags":["xy","heatmap","palette"],"description":"Example shows visualization of intensity in circle-based mesh chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance heatmaps, scientific data visualization, scrolling heatmap charts, spectrograms as a heatmap.","src":"/*\n * LightningChartJS example for rendering a 'Mesh Circle'.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, IntensitySeriesTypes, PalettedFill, LUT, ColorRGBA, Themes } = lcjs\n\nconst lc = lightningChart()\n\nconst chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Mesh Circle')\n\nconst axisX = chart.getDefaultAxisX().setInterval({ start: -90, end: 100 }) // interval of X axis\nconst axisY = chart.getDefaultAxisY().setInterval({ start: -50, end: 50 }) // interval of Y axis\n\n// Create LUT and FillStyle\nconst lut = new LUT({\n steps: [\n { value: 0, color: ColorRGBA(0, 0, 0, 0) }, // transparent at value 0\n { value: 50, color: ColorRGBA(255, 255, 0) }, // yellow at value 50\n { value: 100, color: ColorRGBA(255, 0, 0) }, // red at value 100\n ],\n interpolate: true,\n})\nconst paletteFill = new PalettedFill({ lut, lookUpProperty: 'value' })\n\n// Specify the resolution used for the mesh.\nconst rows = 51\nconst columns = rows\n\nconst intensityOptions = {\n rows,\n columns,\n start: { x: 0, y: 0 },\n end: { x: 50, y: 50 },\n pixelate: false,\n type: IntensitySeriesTypes.Mesh,\n}\n\nconst meshCircle = chart\n .addHeatmapSeries(intensityOptions)\n .setFillStyle(paletteFill) // Use created Paletted FillStyle for the Mesh circle.\n .setCursorEnabled(false) //disable cursor interaction\n .invalidateGeometryOnly((row, column, prev) => {\n const angle = (row * 2 * Math.PI) / (rows - 1.3)\n const radius = column\n return {\n x: Math.sin(angle) * radius,\n y: Math.cos(angle) * radius,\n }\n })\n\n// Add LegendBox to chart.\nchart\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart)\n\nconst data = (rows, columns) => {\n let result = Array.from(Array(columns)).map(() => Array(rows))\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < columns; col++) {\n result[col][row] = 100 * Math.cos(col / (0.5 * Math.PI)) + Math.floor(Math.random() * 10) // set value for each cell\n }\n }\n return result\n}\n\n// update loop\nsetInterval(() => {\n meshCircle.invalidateValuesOnly(data(rows, columns))\n}, 20)\n","url":null,"readme":"The Heatmap Mesh feature has been removed in v4.0.0.\n\nIf your application requires this feature, please, contact us at [email protected]\n","image":"meshCircle"},{"id":"lcjs-example-0805-spectrogramProjection","title":"JavaScript Spectrogram XY-Projection Chart","tags":["xy","line","heatmap","palette","dashboard"],"description":"Example for Chart with 2D spectrogram + dynamic projections on mouse interaction.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance heatmaps, scientific data visualization, scrolling heatmap charts, spectrograms as a heatmap.","src":"/*\n * LightningChartJS example for Chart with 2D spectrogram + dynamic projections on mouse interaction.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n PalettedFill,\n LUT,\n emptyFill,\n emptyLine,\n AxisScrollStrategies,\n LegendBoxBuilders,\n synchronizeAxisIntervals,\n regularColorSteps,\n Themes,\n} = lcjs\n\nconst { createSpectrumDataGenerator } = require('@lightningchart/xydata')\n\nconst spectrogramColumns = 1024\nconst spectrogramRows = 1024\n\n// Create charts and series.\n\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart()\n .Dashboard({\n // theme: Themes.darkGold,\n numberOfColumns: 2,\n numberOfRows: 2,\n })\n .setColumnWidth(0, 1)\n .setColumnWidth(1, 0.2)\n .setRowHeight(0, 1)\n .setRowHeight(1, 0.3)\n\nconst chartSpectrogram = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n })\n .setTitle('2D Spectrogram with X & Y projection on mouse hover')\n\nconst theme = dashboard.getTheme()\nconst seriesSpectrogram = chartSpectrogram\n .addHeatmapGridSeries({\n columns: spectrogramColumns,\n rows: spectrogramRows,\n })\n .setMouseInteractions(false)\n .setWireframeStyle(emptyLine)\n .setFillStyle(\n new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n interpolate: true,\n steps: regularColorSteps(0, 1, theme.examples.spectrogramColorPalette),\n }),\n }),\n )\n\nconst legend = chartSpectrogram\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n .add(chartSpectrogram)\n\nconst chartProjectionY = dashboard\n .createChartXY({\n columnIndex: 1,\n rowIndex: 0,\n })\n .setTitleFillStyle(emptyFill)\n // NOTE: Hardcoded alignment with Spectrogram chart.\n .setPadding({ top: 44 })\n .setMouseInteractions(false)\n\nchartProjectionY.getDefaultAxisY().setScrollStrategy(undefined).setMouseInteractions(false)\n\n// Sync projection Axis with spectogram chart projected axis.\nsynchronizeAxisIntervals(chartSpectrogram.getDefaultAxisY(), chartProjectionY.getDefaultAxisY())\n\nchartProjectionY\n .getDefaultAxisX()\n .setScrollStrategy(AxisScrollStrategies.expansion)\n .setInterval({ start: 0, end: 1, stopAxisAfter: false })\n .setMouseInteractions(false)\n\nconst seriesProjectionY = chartProjectionY\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveY',\n regularProgressiveStep: true,\n },\n })\n .setName('Projection (Y)')\n .setCursorSolveBasis('nearest-y')\n\nconst chartProjectionX = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: 1,\n })\n .setTitleFillStyle(emptyFill)\n .setMouseInteractions(false)\nchartProjectionX.getDefaultAxisX().setScrollStrategy(undefined).setMouseInteractions(false)\n\n// Sync projection Axis with spectogram chart projected axis.\nsynchronizeAxisIntervals(chartSpectrogram.getDefaultAxisX(), chartProjectionX.getDefaultAxisX())\n\nchartProjectionX\n .getDefaultAxisY()\n .setScrollStrategy(AxisScrollStrategies.expansion)\n .setInterval({ start: 0, end: 1, stopAxisAfter: false })\n .setMouseInteractions(false)\nconst seriesProjectionX = chartProjectionX\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n regularProgressiveStep: true,\n },\n })\n .setName('Projection (X)')\n\n// Align charts nicely.\nchartSpectrogram.getDefaultAxisY().setThickness(50)\nchartProjectionX.getDefaultAxisY().setThickness(50)\nchartSpectrogram.getDefaultAxisX().setThickness(25)\nchartProjectionY.getDefaultAxisX().setThickness(25)\n\n// Generate data.\ncreateSpectrumDataGenerator()\n .setNumberOfSamples(spectrogramColumns)\n .setSampleSize(spectrogramRows)\n .generate()\n .toPromise()\n .then((data) => {\n seriesSpectrogram.invalidateIntensityValues(data)\n\n const showProjection = (axisX, axisY) => {\n // Calculate spectrogram 1D projections at axis location for both X and Y planes.\n let projectionY\n try {\n projectionY = data[Math.round(axisX)].map((value, i) => ({\n x: value,\n y: i,\n }))\n } catch (e) {}\n\n let projectionX\n try {\n projectionX = []\n const row = Math.round(axisY)\n for (let x = 0; x < spectrogramColumns; x += 1) {\n projectionX[x] = {\n x,\n y: data[x][row],\n }\n }\n } catch (e) {}\n\n // Update projection series data.\n seriesProjectionY.clear()\n if (projectionY) {\n seriesProjectionY.add(projectionY)\n }\n\n seriesProjectionX.clear()\n if (projectionX) {\n seriesProjectionX.add(projectionX)\n }\n }\n\n // Add custom interaction when mouse is hovered over spectrogram chart.\n chartSpectrogram.onSeriesBackgroundMouseMove((_, event) => {\n // Solve mouse location on Axis.\n const locationAxis = chartSpectrogram.translateCoordinate(event, chartSpectrogram.coordsAxis)\n showProjection(locationAxis.x, locationAxis.y)\n })\n\n showProjection(spectrogramColumns / 2, spectrogramRows / 2)\n })\n","url":null,"readme":"This example shows how to create a 2D spectrogram chart with X and Y line projections over last mouse coordinate (custom interaction).\n\nEvery time the user moves mouse over the spectrogram 1024 + 1024 data points are picked from the data set and pushed to X and Y projections line series - this is an expensive operation, but handled really fast with calls to `LineSeries.clear().add(data)`.\n\nThe spectrogram chart contains 1024 x 1024 = ~1 million data points.\n","image":"spectrogramProjection"},{"id":"lcjs-example-0806-sweepingHeatmapGrid","title":"JavaScript Sweeping Heatmap Chart","tags":["xy","heatmap","realtime","palette"],"description":"Example for Sweeping Heatmap Chart using HeatmapGridSeries","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance heatmaps, scientific data visualization, scrolling heatmap charts, spectrograms as a heatmap.","src":"/*\n * LightningChartJS example that showcases simple usage of Scrolling Heatmap Grid Series.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n PalettedFill,\n LUT,\n ColorHSV,\n emptyLine,\n LegendBoxBuilders,\n LinearGradientFill,\n ColorRGBA,\n regularColorSteps,\n Themes,\n} = lcjs\n\nconst { createSpectrumDataGenerator } = require('@lightningchart/xydata')\n\n// Length of single data sample.\nconst dataSampleSize = 1000\n// Length of visible sweeping history as columns count.\nconst sweepingHistory = 250\n\n// Create ChartXY.\nconst chart = lightningChart()\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Sweeping Heatmap Spectrogram')\n\nchart.getDefaultAxisY().setTitle('Frequency (Hz)').setInterval({ start: 0, end: dataSampleSize })\n\n// Setup PalettedFill for dynamically coloring Heatmap by Intensity values.\nconst theme = chart.getTheme()\nconst lut = new LUT({\n steps: regularColorSteps(0, 75, theme.examples.spectrogramColorPalette),\n units: 'dB',\n interpolate: true,\n})\nconst paletteFill = new PalettedFill({ lut, lookUpProperty: 'value' })\n\n// Create heatmap series.\nconst heatmapGridSeries = chart\n .addHeatmapGridSeries({\n columns: sweepingHistory,\n rows: dataSampleSize,\n })\n .setFillStyle(paletteFill)\n .setWireframeStyle(emptyLine)\n\n// Create Band for visualizing sweeping update.\nconst band = chart\n .getDefaultAxisX()\n .addBand(true)\n .setStrokeStyle(emptyLine)\n .setFillStyle(\n new LinearGradientFill({\n angle: 90,\n stops: [\n { offset: 0, color: ColorRGBA(0, 0, 0, 255) },\n { offset: 1, color: ColorRGBA(0, 0, 0, 0) },\n ],\n }),\n )\n\n// Add LegendBox to chart.\nconst legend = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n .add(heatmapGridSeries)\n\n// Stream in sweeping data.\nlet iSample = 0\nlet dataAmount = 0\ncreateSpectrumDataGenerator()\n .setSampleSize(dataSampleSize)\n // NOTE: Number of unique samples in example data.\n .setNumberOfSamples(12340)\n .setVariation(15)\n .setFrequencyStability(0.7)\n .generate()\n .setStreamRepeat(true)\n .setStreamInterval(25)\n .setStreamBatchSize(1)\n .toStream()\n // Scale Intensity values from [0.0, 1.0] to [0.0, 80]\n .map((sample) => sample.map((intensity) => intensity * 80))\n .forEach((sample) => {\n // Produce sweeping update effect by pushing new samples in by invalidating previous intensity values with sweeping motion.\n heatmapGridSeries.invalidateIntensityValues({\n iColumn: iSample % sweepingHistory,\n iRow: 0,\n values: [sample],\n })\n\n band.setValueStart(iSample % sweepingHistory).setValueEnd(band.getValueStart() + 10)\n\n dataAmount += sample.length\n iSample += 1\n })\n\n// Display incoming points amount in Chart title.\nconst title = chart.getTitle()\nlet tStart = Date.now()\nlet lastReset = Date.now()\nconst updateChartTitle = () => {\n // Calculate amount of incoming points / second.\n if (dataAmount > 0 && Date.now() - tStart > 0) {\n const pps = (1000 * dataAmount) / (Date.now() - tStart)\n chart.setTitle(`${title} (${Math.round(pps)} data points / s)`)\n }\n // Reset pps counter every once in a while in case page is frozen, etc.\n if (Date.now() - lastReset >= 5000) {\n tStart = lastReset = Date.now()\n dataAmount = 0\n }\n}\nsetInterval(updateChartTitle, 1000)\n","url":null,"readme":"This example shows how to create a _sweeping update effect_ in 2D Heatmap Chart with LightningChart JS.\n\nThis is done by using `HeatmapGridSeries` (static size 2D heatmap) and writing on top of previous heatmap values in sweeping motion.\n\nThis behavior is preferred by some users, mostly since the chart gives real-time visualization but at the same time is _immobile_.\n\nFor alternate approach with _scrolling data appending_, see our [scrolling heatmap example](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0803-scrollingHeatmap.html).\n\nScrolling approach is generally encouraged since it interacts much nicer with _scrolling Axis ticks_, which as can be seen from the scrolling heatmap example - looks really nice with _live data_!\n\nPerformance-wise there is not much difference between the two - both operations are optimized to the maximum!\n","image":"sweepingHeatmapGrid"},{"id":"lcjs-example-0807-heatmapGridPixelInterpolation","title":"JavaScript Heatmap Bilinear Interpolation Chart","tags":["xy","heatmap","realtime","palette"],"description":"Example that showcases the pixel interpolation mode feature of 2D Heatmaps.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance heatmaps, scientific data visualization, scrolling heatmap charts, spectrograms as a heatmap.","src":"/*\n * LightningChartJS example that showcases the pixel interpolation mode feature of 2D Heatmaps.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PalettedFill, LUT, LegendBoxBuilders, emptyFill, UIOrigins, regularColorSteps, Themes } = lcjs\n\nconst { createWaterDropDataGenerator } = require('@lightningchart/xydata')\n\n// Define heatmap intensity data.\nconst heatmapColumns = 20\nconst heatmapRows = 40\n\n// Create Dashboard with two charts and two Heatmap Grid Series.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart().Dashboard({\n numberOfColumns: 2,\n numberOfRows: 1,\n})\n\n// Define color look up table.\nconst theme = dashboard.getTheme()\nconst palette = new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n interpolate: true,\n steps: regularColorSteps(0, 100, theme.examples.intensityColorPalette),\n }),\n})\n\nconst chart0 = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n })\n .setTitleFillStyle(emptyFill)\n .setPadding({ top: 80 })\n\nconst heatmap0 = chart0\n .addHeatmapGridSeries({\n columns: heatmapColumns,\n rows: heatmapRows,\n dataOrder: 'rows',\n })\n .setFillStyle(palette)\n .setIntensityInterpolation('bilinear')\n .setCursorInterpolationEnabled(true)\n\nconst legend0 = chart0\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.5,\n })\n .add(chart0)\n .setPosition({ x: 100, y: 100 })\n .setOrigin(UIOrigins.RightTop)\n\nconst chart1 = dashboard\n .createChartXY({\n columnIndex: 1,\n rowIndex: 0,\n })\n .setTitleFillStyle(emptyFill)\n .setPadding({ top: 80 })\n\nconst heatmap1 = chart1\n .addHeatmapGridSeries({\n columns: heatmapColumns,\n rows: heatmapRows,\n dataOrder: 'rows',\n })\n .setFillStyle(palette)\n .setIntensityInterpolation('disabled')\n .setCursorInterpolationEnabled(false)\n\nconst legend1 = chart1\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.5,\n })\n .add(chart1)\n .setPosition({ x: 100, y: 100 })\n .setOrigin(UIOrigins.RightTop)\n\n// Generate test data.\ncreateWaterDropDataGenerator()\n .setColumns(heatmapColumns)\n .setRows(heatmapRows)\n .generate()\n .then((data) => {\n heatmap0.invalidateIntensityValues(data)\n heatmap1.invalidateIntensityValues(data)\n })\n","url":null,"readme":"This example showcases the _pixel interpolation mode_ feature of `HeatmapGridSeries`.\n\n`HeatmapGridSeries` comes with powerful _per-pixel bilinear interpolation_ which smooths the data visualization by automatically interpolating intensity values and adjusting dynamic coloring accordingly.\n_Bilinear interpolation_ is a standard, well-known method in _data analysis_ - and it also looks cool!\n\nThis example shows _two_ `HeatmapGridSeries` side by side with the same data, the series on left has bilinear interpolation enabled (default) and on right it is disabled.\n\nAs can be seen, the _heatmap_ with bilinear interpolation looks much more detailed and convincing.\nHowever, it can be useful to disable this if you need to always be sure that what you're seeing is the exact data you supplied - not some interpolated value.\n\n```js\n// Example syntax for specifying heatmap pixel interpolation mode.\n\nheatmapSeries.setIntensityInterpolation('disabled')\n\nheatmapSeries.setIntensityInterpolation('bilinear')\n```\n\n_Pixel interpolation mode has no significant effect on performance._\n\nThe Heatmap on the left also showcases _auto cursor interpolation_, which can be enabled per-heatmap series with `setCursorInterpolationEnabled(true)`.\n","image":"heatmapGridPixelInterpolation"},{"id":"lcjs-example-0900-3dScatter","title":"JavaScript 3D Scatter Chart","tags":["scatter","point","3d"],"description":"Example showcasing the use of 3D point series. Also known as scatter plot.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChartJS example that showcases PointSeries in a 3D Chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, SolidFill, ColorRGBA, PointStyle3D, Themes } = lcjs\n\n// Extract required parts from xyData.\nconst { createWaterDropDataGenerator } = xydata\n\n// Initiate chart\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle('3D Scatter Chart')\n\n// Set Axis titles\nchart3D.getDefaultAxisX().setTitle('Axis X')\nchart3D.getDefaultAxisY().setTitle('Axis Y')\nchart3D.getDefaultAxisZ().setTitle('Axis Z')\n\n// Create Point Series for rendering max Y coords.\nconst pointSeriesMaxCoords = chart3D.addPointSeries().setName('Max coords')\npointSeriesMaxCoords.setPointStyle(\n new PointStyle3D.Triangulated({\n fillStyle: pointSeriesMaxCoords.getPointStyle().getFillStyle(),\n size: 10,\n shape: 'sphere',\n }),\n)\n\n// Create another Point Series for rendering other Y coords than Max.\nconst pointSeriesOtherCoords = chart3D.addPointSeries({ automaticColorIndex: 2 }).setName('Below Max')\npointSeriesOtherCoords.setPointStyle(\n new PointStyle3D.Triangulated({\n fillStyle: pointSeriesOtherCoords.getPointStyle().getFillStyle(),\n size: 5,\n shape: 'cube',\n }),\n)\n\n// Add LegendBox to chart.\nchart3D\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart3D)\n\n// Generate heatmap data for depicting amount of scattered points along the XZ plane.\nlet totalPointsAmount = 0\nconst rows = 40\nconst columns = 60\ncreateWaterDropDataGenerator()\n .setRows(rows)\n .setColumns(columns)\n .generate()\n .then((data) => {\n // 'data' is a number Matrix number[][], that can be read as data[row][column].\n for (let row = 0; row < rows; row++) {\n for (let column = 0; column < columns; column++) {\n const value = data[row][column]\n // Generate 'value' amount of points along this XZ coordinate,\n // with the Y coordinate range based on 'value'.\n const pointsAmount = Math.ceil(value / 100)\n const yMin = 0\n const yMax = value\n for (let iPoint = 0; iPoint < pointsAmount; iPoint++) {\n const y = yMin + Math.random() * (yMax - yMin)\n pointSeriesOtherCoords.add({ x: row, z: column, y })\n totalPointsAmount++\n }\n pointSeriesMaxCoords.add({ x: row, z: column, y: yMax })\n totalPointsAmount++\n }\n }\n\n chart3D.setTitle(chart3D.getTitle() + ` (${totalPointsAmount} data points)`)\n // Set explicit Y Axis interval.\n chart3D.getDefaultAxisY().setInterval({ start: 0, end: 150, animate: 2000 })\n })\n","url":null,"readme":"_Also known as a Scatter Graph, Scatter Series, Point Graph, Scatter diagram or Scattergram_\n\nThis example shows a simple 3D Point Graph with points drawn using 3D PointSeries for a visual representation of the data points 'markers'. The point graph is a type of chart or mathematical diagram drawn on a Cartesian coordinate system and represents the relationship between two variables.\n\nThis type of series does not contain the visual representation of lines for the connection of data points but only data 'markers'.\n\nThe chart can be created with few simple lines of code:\n\n```javascript\n// Create a new ChartXY.\nconst chart3D = lightningChart().Chart3D()\n\n// Add a line series using default X, Y and Z axes.\nconst series = chart3D.addPointSeries()\n```\n\nThe series accepts points in format `{ x: number, y: number, z:number }`. Any number of points can be added with a single call.\n\n```javascript\n// Single point.\nseries.add({ x: 50, y: 60, z: 40 })\n\n// Multiple points at once.\nseries.add([\n { x: 55, y: 60, z: 40 },\n { x: 60, y: 62, z: 40 },\n { x: 65, y: 65, z: 50 },\n])\n```\n","image":"3dScatter"},{"id":"lcjs-example-0901-3dLineSeries","title":"JavaScript 3D Line Series","tags":["line","3d"],"description":"Example showcasing the use of 3D Line Series.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChartJS example that showcases LineSeries in a 3D Chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, Themes } = lcjs\n\n// Extract required parts from xyData.\nconst { createProgressiveTraceGenerator } = xydata\n\n// Initiate chart\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n // Set 3D bounding box dimensions to highlight X Axis.\n .setBoundingBox({ x: 1.0, y: 0.5, z: 0.4 })\n\n// Set Axis titles\nchart3D.getDefaultAxisX().setTitle('Axis X')\nchart3D.getDefaultAxisY().setTitle('Axis Y')\nchart3D.getDefaultAxisZ().setTitle('')\n\n// Disable Z Axis ticks as it doesn't represent any actual data dimension (only visual perspective).\nchart3D.getDefaultAxisZ().setTickStrategy(AxisTickStrategies.Empty)\n\n// Define Series configuration for simplified example modification.\nconst seriesConf = [\n {\n name: 'Series A',\n dataAmount: 50,\n },\n {\n name: 'Series B',\n dataAmount: 50,\n },\n {\n name: 'Series C',\n dataAmount: 50,\n },\n]\n\n// Set X Axis interval immediately (before all data is streamed).\n\nchart3D.getDefaultAxisX().setInterval({ start: 0, end: seriesConf.reduce((prev, cur) => Math.max(prev, cur.dataAmount), 0) })\n\n// Set Z Axis interval immediately.\nchart3D.getDefaultAxisZ().setInterval({ start: -1, end: 1 + seriesConf.reduce((prev, cur, i) => Math.max(prev, i), 0) })\n\n// Create Series and generate test data.\nlet totalDataAmount = 0\nseriesConf.forEach((conf, iSeries) => {\n const seriesName = conf.name || ''\n const seriesDataAmount = conf.dataAmount || 100\n const seriesZ = conf.z || iSeries\n\n const series = chart3D.addPointLineSeries().setName(seriesName)\n\n createProgressiveTraceGenerator()\n .setNumberOfPoints(seriesDataAmount)\n .generate()\n .toPromise()\n .then((data) => {\n // Map XY data to XYZ data.\n return data.map((xy) => ({\n x: xy.x,\n y: xy.y,\n z: seriesZ,\n }))\n })\n .then((data) => {\n // Stream data into series very quickly.\n setInterval(() => {\n const batch = data.splice(0, 3)\n if (batch.length > 0) {\n series.add(batch)\n totalDataAmount += batch.length\n chart3D.setTitle(`3D Line Series (${totalDataAmount} data points)`)\n }\n }, 30)\n })\n})\n\n// Add LegendBox to chart.\nconst legend = chart3D\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart3D)\n","url":null,"readme":"_Also known as a Line Graph or Line Chart_\n\nThis example shows the basic usage of a 3D line series. The line series is drawn on a Cartesian coordinate system and represents the relationship between two variables. Line series display information as a series of data points connected by straight line segments. They are most often used to visualize the changes in data or reveal trends in a dataset.\n\nThis type of series does not contain the visual representation of 'markers' for the data points but only continuously connected line between all of them. Additionally, it allows drawing lines in any direction.\n\nThe chart can be created with few simple lines of code:\n\n```javascript\n// Create a new ChartXY.\nconst chart3D = lightningChart().Chart3D()\n\n// Add a line series using default X, Y and Z axes.\nconst series = chart3D.addLineSeries()\n```\n\nThe series accepts points in format `{ x: number, y: number, z:number }`. Any number of points can be added with a single call.\n\n```javascript\n// Single point.\nseries.add({ x: 50, y: 60, z: 40 })\n\n// Multiple points at once.\nseries.add([\n { x: 55, y: 60, z: 60 },\n { x: 60, y: 62, z: 50 },\n { x: 65, y: 65, z: 60 },\n])\n```\n","image":"3dLine"},{"id":"lcjs-example-0904-3dSpectrogramBox","title":"JavaScript Spectrogram Box Series 3D","tags":["3d","box","spectrogram","palette"],"description":"Example showcasing the use of BoxSeries3D to render a scrolling 3D spectrogram.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChartJS example that showcases Box Series 3D to render a 3D spectrogram.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n ColorRGBA,\n LUT,\n PalettedFill,\n AxisScrollStrategies,\n UIElementBuilders,\n UIOrigins,\n UILayoutBuilders,\n UIBackgrounds,\n regularColorSteps,\n Themes,\n} = lcjs\n\nconst { createSpectrumDataGenerator } = xydata\n\n// Length of single data sample.\nconst dataSampleSize = 60\n\n// Length of data history.\nconst dataHistoryLength = 120\n\n// Initial camera location.\nconst initialCameraLocation = { x: 0.1, y: 0.08, z: 1.2 }\n\n// Create Chart3D and configure Axes.\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle('3D Box Series Spectrogram')\n .setBoundingBox({ x: 1, y: 1, z: 2 })\nchart3D.setCameraLocation(initialCameraLocation)\nchart3D\n .getDefaultAxisY()\n .setScrollStrategy(AxisScrollStrategies.expansion)\n .setInterval({ start: 0, end: 100, stopAxisAfter: false })\n .setTitle('Power spectrum P(f)')\nchart3D.getDefaultAxisX().setTitle('Frequency (Hz)')\nchart3D\n .getDefaultAxisZ()\n .setTitle('Time')\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - dataHistoryLength, stopAxisAfter: false }))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\n// Setup PalettedFill for dynamically coloring Boxes by an associated 'value' property.\nconst theme = chart3D.getTheme()\nconst lut = new LUT({\n steps: regularColorSteps(0, 100, theme.examples.intensityColorPalette),\n units: 'dB',\n interpolate: true,\n})\nconst paletteFill = new PalettedFill({ lut, lookUpProperty: 'y' })\n\n// Create Box Series 3D.\nconst boxSeries = chart3D.addBoxSeries().setFillStyle(paletteFill).setRoundedEdges(undefined).setName('Spectrogram (box)')\n\n// Create a data grid of Boxes which we can mutate without needing to create new Boxes for best performance.\nconst boxGrid = []\nfor (let sampleIndex = 0; sampleIndex < dataHistoryLength; sampleIndex++) {\n const sampleBoxIDs = []\n for (let i = 0; i < dataSampleSize; i++) {\n const id = sampleIndex * dataSampleSize + i\n // Add empty Box to series.\n boxSeries.invalidateData([\n {\n id,\n yMin: 0,\n yMax: 0,\n zMin: 0,\n zMax: 0,\n // Box X coordinates don't have to change afterwards.\n xMin: i,\n xMax: i + 1.0,\n },\n ])\n sampleBoxIDs.push(id)\n }\n boxGrid.push(sampleBoxIDs)\n}\n\n// Add LegendBox to chart.\nconst legend = chart3D\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart3D)\n\nlet sampleIndex = 0\ncreateSpectrumDataGenerator()\n .setSampleSize(dataSampleSize)\n .setNumberOfSamples(dataHistoryLength)\n .setVariation(5.0)\n .generate()\n .setStreamRepeat(true)\n .setStreamInterval(1000 / 60)\n .setStreamBatchSize(1)\n .toStream()\n // Scale Y values from [0.0, 1.0] to [0.0, 80]\n .map((sample) => sample.map((y) => y * 80))\n // Map Y values to a Row of Boxes.\n .forEach((sample) => {\n const infiniteStreamingDataEnabled = toggleStreamingCheckBox.getOn()\n const addSample = infiniteStreamingDataEnabled || sampleIndex < dataHistoryLength\n\n if (addSample) {\n // Instead of making new Boxes each sample (slow), get the oldest row of Boxes that were created beforehand.\n const rowIndex = sampleIndex % dataHistoryLength\n const boxIDs = boxGrid[rowIndex]\n\n // Map Y values to BoxDataBounds format.\n const boxesData = sample.map((y, i) => ({\n id: boxIDs[i],\n yMin: 0,\n yMax: y,\n zMin: sampleIndex,\n zMax: sampleIndex + 1.0,\n }))\n boxSeries.invalidateData(boxesData)\n\n sampleIndex++\n }\n })\n\n// Animate Camera movement from file.\n;(async () => {\n const cameraAnimationData = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0904/camera.json',\n ).then((r) => r.json())\n if (!cameraAnimationData) {\n console.log(`No Camera animation data.`)\n return\n }\n console.log(`Loaded Camera animation data.`)\n let frame = 0\n const nextFrame = () => {\n if (cameraAnimationEnabledCheckbox.getOn()) {\n const { cameraLocation } = cameraAnimationData.frames[Math.floor(frame) % cameraAnimationData.frames.length]\n chart3D.setCameraLocation(cameraLocation)\n frame += 2\n }\n requestAnimationFrame(nextFrame)\n }\n requestAnimationFrame(nextFrame)\n})()\n\n// * UI controls *\nconst group = chart3D.addUIElement(UILayoutBuilders.Column.setBackground(UIBackgrounds.Rectangle))\ngroup\n .setPosition({ x: 0, y: 100 })\n .setOrigin(UIOrigins.LeftTop)\n .setMargin(10)\n .setPadding(4)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-height',\n maxHeight: 0.3,\n })\n\n// Add UI control for toggling between infinite streaming data and static data amount.\nconst handleStreamingToggled = (state) => {\n toggleStreamingCheckBox.setText(state ? 'Disable infinite streaming data' : 'Enable infinite streaming data')\n if (toggleStreamingCheckBox.getOn() !== state) {\n toggleStreamingCheckBox.setOn(state)\n }\n}\nconst toggleStreamingCheckBox = group.addElement(UIElementBuilders.CheckBox)\ntoggleStreamingCheckBox.onSwitch((_, state) => handleStreamingToggled(state))\nhandleStreamingToggled(true)\n\n// Add UI control for toggling camera animation.\nconst handleCameraAnimationToggled = (state) => {\n cameraAnimationEnabledCheckbox.setText(state ? 'Disable camera animation' : 'Enable camera animation')\n if (cameraAnimationEnabledCheckbox.getOn() !== state) {\n cameraAnimationEnabledCheckbox.setOn(state)\n }\n}\nconst cameraAnimationEnabledCheckbox = group.addElement(UIElementBuilders.CheckBox)\ncameraAnimationEnabledCheckbox.onSwitch((_, state) => handleCameraAnimationToggled(state))\nhandleCameraAnimationToggled(true)\nchart3D.onBackgroundMouseDrag(() => {\n handleCameraAnimationToggled(false)\n})\n","url":null,"readme":"This example shows a use case for 3D Box Series as a 3D _spectrogram_\n\nSpectrogram is a visual representation of the spectrum of frequencies. Spectrograms can be used to visualize any wave form. Most often spectrograms are used to display audio signals.\n\nThe spectrogram shows frequency on one axis (X Axis) and time on the other (Z Axis). The amplitude of the frequency is displayed both by the Y coordinate as well as the dynamically applied _color_.\n","image":"3dSpectrogramBox"},{"id":"lcjs-example-0906-3dSimpleSurfaceMesh","title":"JavaScript 3D Simple Surface Mesh","tags":["3d","surface","mesh","palette"],"description":"Example showcasing simple usage of 3D Surface Mesh Series","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChartJS example that showcases LineSeries in a 3D Chart.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n SurfaceSeriesTypes3D,\n ColorHSV,\n ColorRGBA,\n IndividualPointFill,\n PalettedFill,\n SolidFill,\n LUT,\n UIOrigins,\n UIBackgrounds,\n UIElementBuilders,\n UILayoutBuilders,\n emptyFill,\n Themes,\n} = lcjs\n\nconst { createWaterDropDataGenerator } = xydata\n\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle('Simple 3D Surface Mesh')\n\nchart3D.forEachAxis((axis) => axis.setInterval({ start: -3.55, end: 3.55, stopAxisAfter: false }))\n\n// Create color Look-Up-Tables for dynamic colouring.\nconst paletteY = new LUT({\n steps: [\n { value: -1.5, color: ColorRGBA(0, 0, 255) },\n { value: -0.2, color: ColorRGBA(255, 255, 255) },\n ],\n interpolate: true,\n})\nconst paletteValue = new LUT({\n steps: [\n { value: 0, color: ColorRGBA(0, 0, 0) },\n { value: 30, color: ColorRGBA(255, 255, 0) },\n { value: 45, color: ColorRGBA(255, 204, 0) },\n { value: 60, color: ColorRGBA(255, 128, 0) },\n { value: 100, color: ColorRGBA(255, 0, 0) },\n ],\n interpolate: true,\n})\n\nconst rows = 150\nconst columns = rows\nconst surface = chart3D.addSurfaceSeries({\n type: SurfaceSeriesTypes3D.Mesh,\n rows,\n columns,\n start: { x: 0, z: 0 },\n end: { x: 100, z: 100 },\n pixelate: true,\n})\n\n// Assign a Value to each coordinate of the Grid to be used when colouring by look up value.\ncreateWaterDropDataGenerator()\n .setRows(rows)\n .setColumns(columns)\n .setWaterDrops([\n { rowNormalized: 0.2, columnNormalized: 0.6, amplitude: 23 },\n { rowNormalized: 0.5, columnNormalized: 0.5, amplitude: 74 },\n { rowNormalized: 0.7, columnNormalized: 0.3, amplitude: 16 },\n ])\n .setOffsetLevel(58)\n .setVolatility(25)\n .generate()\n .then((intensityData) => {\n surface.invalidateValuesOnly(intensityData)\n })\n\n// Assign a Color to each coordinate of the Grid to be used when colouring by individual color.\n// Leave some blanks to showcase fall back color.\nsurface.invalidateColorsOnly((row, column) => (Math.random() >= 0.8 ? ColorRGBA(255, 0, 0) : undefined))\n\n// Define Mesh geometry as a function of: (row, column) => { x, y, z }\nconst y1 = (t) => 0.3 * Math.sin((t * 4 * Math.PI) / columns)\nconst y2 = (t) => 2.5 + Math.cos((t * 4 * Math.PI) / columns)\nsurface.invalidateGeometryOnly((row, column, prev) => {\n const angle = (row * 2 * Math.PI) / (rows - 1)\n const radius = Math.abs(y2(column) - y1(column))\n return {\n x: Math.sin(angle) * radius,\n y: Math.cos(angle) * radius,\n z: column,\n }\n})\n\n// Animate Camera movement from file.\n;(async () => {\n const cameraAnimationData = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0906/camera.json',\n ).then((r) => r.json())\n if (!cameraAnimationData) {\n console.log(`No Camera animation data.`)\n return\n }\n console.log(`Loaded Camera animation data.`)\n let frame = 0\n const nextFrame = () => {\n if (cameraAnimationEnabledCheckbox.getOn()) {\n const { cameraLocation } = cameraAnimationData.frames[Math.floor(frame) % cameraAnimationData.frames.length]\n chart3D.setCameraLocation(cameraLocation)\n frame += 1.5\n }\n requestAnimationFrame(nextFrame)\n }\n requestAnimationFrame(nextFrame)\n})()\n\n// * UI controls *\nconst group = chart3D.addUIElement(UILayoutBuilders.Column.setBackground(UIBackgrounds.Rectangle))\ngroup\n .setPosition({ x: 0, y: 100 })\n .setOrigin(UIOrigins.LeftTop)\n .setMargin(10)\n .setPadding(4)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-height',\n maxHeight: 0.3,\n })\n\n// Add UI for selecting surface style\nconst options = []\nconst addOption = (label, onEnabled, defaultSelection = false) => {\n const checkBox = group.addElement(UIElementBuilders.CheckBox).setText(label)\n\n if (defaultSelection) {\n checkBox.setOn(true)\n onEnabled()\n }\n\n checkBox.onSwitch((_, state) => {\n if (state) {\n onEnabled()\n checkBox.setMouseInteractions(false)\n // Set all other check boxes off.\n options.forEach((option) => option.checkBox !== checkBox && option.checkBox.setOn(false).setMouseInteractions(true))\n }\n })\n\n options.push({ checkBox })\n}\n\naddOption('Color look up by Y', () =>\n // Look up data point color from LUT by Y coordinate\n surface.setFillStyle(new PalettedFill({ lut: paletteY, lookUpProperty: 'y' })),\n)\naddOption(\n 'Color look up by Value',\n () =>\n // Look up data point color from LUT by number Value associated with it (assigned by user)\n surface.setFillStyle(new PalettedFill({ lut: paletteValue, lookUpProperty: 'value' })),\n true,\n)\naddOption('Individual Color', () =>\n // Color data points by Colors assigned to each data point.\n surface.setFillStyle(\n new IndividualPointFill()\n // Specify Color to be used for data points that haven't been assigned a Color.\n .setFallbackColor(ColorRGBA(0, 255, 0)),\n ),\n)\naddOption('Solid color', () =>\n // Single solid color.\n surface.setFillStyle(new SolidFill({ color: ColorHSV(Math.random() * 360) })),\n)\n\n// Add UI for toggling wireframe.\nconst handleWireframeToggled = (state) => {\n // Set Wireframe style.\n surface.setWireframeStyle(state ? new SolidFill({ color: ColorRGBA(0, 0, 0, 50) }) : emptyFill)\n wireframeCheckbox.setText(state ? 'Hide wireframe' : 'Show wireframe')\n}\nconst wireframeCheckbox = group.addElement(UIElementBuilders.CheckBox)\nwireframeCheckbox.onSwitch((_, state) => handleWireframeToggled(state))\nwireframeCheckbox.setOn(true)\n\n// Add UI control for toggling camera animation.\nconst handleCameraAnimationToggled = (state) => {\n cameraAnimationEnabledCheckbox.setText(state ? 'Disable camera animation' : 'Enable camera animation')\n if (cameraAnimationEnabledCheckbox.getOn() !== state) {\n cameraAnimationEnabledCheckbox.setOn(state)\n }\n}\nconst cameraAnimationEnabledCheckbox = group.addElement(UIElementBuilders.CheckBox)\ncameraAnimationEnabledCheckbox.onSwitch((_, state) => handleCameraAnimationToggled(state))\nhandleCameraAnimationToggled(true)\nchart3D.onBackgroundMouseDrag(() => {\n handleCameraAnimationToggled(false)\n})\n\n// Add LegendBox to chart.\nconst legend = chart3D\n .addLegendBox()\n .add(chart3D)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n","url":null,"readme":"The Surface Mesh feature has been removed in v4.0.0.\n\nIf your application requires this feature, please, contact us at [email protected]\n","image":"3dSimpleSurfaceMesh"},{"id":"lcjs-example-0907-3dBoxRounded","title":"JavaScript 3D Box Series rounded edges","tags":["3d","box","palette"],"description":"Example showcasing simple usage of BoxSeries3D and the rounded edges feature.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChartJS example that showcases BoxSeries3D with rounded edges.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n AxisScrollStrategies,\n PalettedFill,\n LUT,\n UILayoutBuilders,\n UIOrigins,\n UIElementBuilders,\n regularColorSteps,\n Themes,\n} = lcjs\n\nconst { createWaterDropDataGenerator } = xydata\n\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle('BoxSeries3D with rounded edges enabled')\n\nchart3D.getDefaultAxisY().setScrollStrategy(AxisScrollStrategies.expansion).setTitle('Height')\n\nchart3D.getDefaultAxisX().setTitle('X')\n\nchart3D.getDefaultAxisZ().setTitle('Z')\n\nconst boxSeries = chart3D.addBoxSeries()\nconst resolution = 10\n\n// Create Color Look-Up-Table and FillStyle\nconst theme = chart3D.getTheme()\nconst lut = new LUT({\n steps: regularColorSteps(0, 100, theme.examples.intensityColorPalette),\n interpolate: true,\n})\n\nboxSeries\n .setFillStyle(new PalettedFill({ lut, lookUpProperty: 'y' }))\n // Specify edge roundness.\n // For applications with massive amounts of small Boxes, it is wise to disable for performance benefits.\n .setRoundedEdges(0.4)\n\n// Add LegendBox to chart.\nconst legend = chart3D\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(chart3D)\n\n// Generate height map data.\ncreateWaterDropDataGenerator()\n .setRows(resolution)\n .setColumns(resolution)\n .generate()\n .then((waterdropData) => {\n let t = 0\n const step = () => {\n const result = []\n for (let x = 0; x < resolution; x++) {\n for (let y = 0; y < resolution; y++) {\n const s = 1\n const height = Math.max(\n waterdropData[y][x] +\n 50 * Math.sin(((t + x * 0.5) * Math.PI) / resolution) +\n 20 * Math.sin(((t + y * 1.0) * Math.PI) / resolution),\n 0,\n )\n const box = {\n xCenter: x,\n yCenter: height / 2,\n zCenter: y,\n xSize: s,\n ySize: height,\n zSize: s,\n // Specify an ID for each Box in order to modify it during later frames, instead of making new Boxes.\n id: String(result.length),\n }\n result.push(box)\n }\n }\n\n boxSeries.invalidateData(result)\n\n t += 0.1\n requestAnimationFrame(step)\n }\n step()\n })\n\n// Animate Camera movement from file.\n;(async () => {\n const cameraAnimationData = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0907/camera.json',\n ).then((r) => r.json())\n if (!cameraAnimationData) {\n console.log(`No Camera animation data.`)\n return\n }\n console.log(`Loaded Camera animation data.`)\n let frame = 0\n const nextFrame = () => {\n if (cameraAnimationEnabledCheckbox.getOn()) {\n const { cameraLocation } = cameraAnimationData.frames[Math.floor(frame) % cameraAnimationData.frames.length]\n chart3D.setCameraLocation(cameraLocation)\n frame += 1.5\n }\n requestAnimationFrame(nextFrame)\n }\n requestAnimationFrame(nextFrame)\n})()\n\n// * UI controls *\nconst group = chart3D.addUIElement(UILayoutBuilders.Column)\ngroup\n .setPosition({ x: 0, y: 100 })\n .setOrigin(UIOrigins.LeftTop)\n .setMargin(10)\n .setPadding(4)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-height',\n maxHeight: 0.3,\n })\n\n// Add UI control for toggling camera animation.\nconst handleCameraAnimationToggled = (state) => {\n cameraAnimationEnabledCheckbox.setText(state ? 'Disable camera animation' : 'Enable camera animation')\n if (cameraAnimationEnabledCheckbox.getOn() !== state) {\n cameraAnimationEnabledCheckbox.setOn(state)\n }\n}\nconst cameraAnimationEnabledCheckbox = group.addElement(UIElementBuilders.CheckBox)\ncameraAnimationEnabledCheckbox.onSwitch((_, state) => handleCameraAnimationToggled(state))\nhandleCameraAnimationToggled(true)\nchart3D.onBackgroundMouseDrag(() => {\n handleCameraAnimationToggled(false)\n})\n","url":null,"readme":"This example shows an animated 3D Bar Chart with bars coloured dynamically based on their height.\n\nThe Chart is rendered using `BoxSeries3D`, a series type capable of rendering any number of Boxes as well as allowing individual full level modification (location, size, color) at any point during runtime.\n\nThe example also showcases the rounded edges feature. While enabled by default, it can be adjusted and disabled at any time with `BoxSeries3D.setRoundedEdges`\n\n## BoxSeries3D data format\n\n`BoxSeries3D` supports input data in two different formats, namely:\n\n- `BoxDataCentered` (specify Box center coordinate and size)\n- `BoxDataBounds` (specify Box start and end coordinates)\n\nOn top of this _geometry_ information, one can also supply the following optional properties:\n\n- **id**:\n - By supplying an ID, the Boxes' properties can be modified later (by passing the same _id_).\n - When modifying a previously added Box, **all** properties (other than _id_) are optional (supplied properties are overridden).\n\n```typescript\n// Initial Box definition (BoxDataCentered format).\nBoxSeries3D.invalidateData([\n {\n xCenter: 0,\n yCenter: 0,\n zCenter: 0,\n xSize: 1,\n ySize: 1,\n zSize: 1,\n id: 'box-#0',\n },\n])\n// Modify 'yCenter' property only.\nBoxSeries3D.invalidateData([\n {\n id: 'box-#0',\n yCenter: 5,\n },\n])\n```\n\n- **color**:\n - Assigns a _Color_ to the Box to be used when individual coloring mode is enabled.\n\n```typescript\n// Add Boxes with individual Colors.\nBoxSeries3D.invalidateData([{\n ...,\n color: ColorRGBA( 255, 0, 0 )\n}])\n// Enable individual coloring mode.\nBoxSeries3D.setFillStyle( new IndividualPointFill() )\n```\n\n- **value**:\n - Assigns a _look-up value_ to the Box to be used when look-up coloring mode is enabled.\n\n```typescript\n// Define Color Look-Up-Table.\nconst lut = new LUT( {\n steps: [\n { value: 0, color: ColorRGBA( 0, 0, 0 ) },\n { value: 100, color: ColorRGBA( 255, 0, 0 ) }\n ],\n interpolate: true\n} )\n// Add Boxes with look up values.\nBoxSeries3D.invalidateData([{\n ...,\n value: 50\n}])\n// Enable look up coloring mode\nBoxSeries3D.setFillStyle( new PalettedFill({ lut }) )\n```\n","image":"3dBoxRounded"},{"id":"lcjs-example-0908-3dRealtimePoints","title":"JavaScript 3D Realtime Scatter Chart","tags":["scatter","point","3d","realtime","point"],"description":"Example showcasing the use of 3D point series in a high performance application, with constantly changing data.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChartJS example that showcases PointSeries3D in a realtime application (continuous high speed data input)\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PointSeriesTypes3D, Themes } = lcjs\n\n// Initiate chart\nconst chart3D = lightningChart().Chart3D({\n // theme: Themes.darkGold\n})\n\n// Set Axis titles\nchart3D.getDefaultAxisX().setTitle('Axis X')\nchart3D.getDefaultAxisY().setTitle('Axis Y')\nchart3D.getDefaultAxisZ().setTitle('Axis Z')\n\n// Set static Axis intervals.\nchart3D.forEachAxis((axis) => axis.setInterval({ start: 0, end: 100 }))\n\n// Create Point Cloud Series (variant optimized for rendering minimal detail geometry)\nconst pointSeries3D = chart3D.addPointSeries({ type: PointSeriesTypes3D.Pixelated }).setPointStyle((style) => style.setSize(5))\n\n// : Example data generation configuration :\n// Amount of data visible at a time.\nconst pointBatchSize = 10000\n// Amount of unique data sets.\nconst uniqueDataSetsCount = 5\n// Visible duration of each data set in milliseconds.\nconst frameDurationMs = 100\n\n// Set Chart title\nchart3D.setTitle(`3D Realtime Point Series (${pointBatchSize} data points per frame)`)\n\n// Generate data.\nnew Promise((resolve, reject) => {\n const dataSets = []\n for (let iDataset = 0; iDataset < uniqueDataSetsCount; iDataset++) {\n const dataSet = []\n dataSets.push(dataSet)\n for (let iPoint = 0; iPoint < pointBatchSize; iPoint++) {\n const x = Math.random() * 100\n const y = Math.random() * 100\n const z = Math.random() * 100\n dataSet.push({ x, y, z })\n }\n }\n resolve(dataSets)\n}).then((dataSets) => {\n // Alternate visible dataset at regular intervals.\n let iDataSet = 0\n let lastSwitch\n const switchDataSet = () => {\n iDataSet = (iDataSet + 1) % uniqueDataSetsCount\n const data = dataSets[iDataSet]\n pointSeries3D\n // Clear previous data.\n .clear()\n // Add new data.\n .add(data)\n lastSwitch = Date.now()\n }\n switchDataSet()\n const checkRegularDataSetSwitch = () => {\n if (Date.now() - lastSwitch >= frameDurationMs) {\n switchDataSet()\n }\n requestAnimationFrame(checkRegularDataSetSwitch)\n }\n checkRegularDataSetSwitch()\n})\n","url":null,"readme":"Example showcasing the use of 3D point series in a high performance application, with constantly changing data.\n","image":"3dRealtimePoints"},{"id":"lcjs-example-0909-3dRealtimeLine","title":"JavaScript 3D Realtime Line Chart","tags":["line","3d","realtime"],"description":"Example showcasing the use of 3D line series in a high performance application, with constantly changing data.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChartJS example that showcases LineSeries3D in a realtime application (continuous high speed data input).\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, AxisTickStrategies, AxisScrollStrategies, Themes } = lcjs\n\n// Extract required parts from xyData.\nconst { createProgressiveTraceGenerator } = xydata\n\n// Initiate chart\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n // Set 3D bounding box dimensions to highlight X Axis.\n .setBoundingBox({ x: 1.0, y: 0.5, z: 0.4 })\n .setTitle('3D Realtime Line Series')\n\n// Set Axis titles\nchart3D.getDefaultAxisX().setTitle('Axis X')\nchart3D.getDefaultAxisY().setTitle('Axis Y')\nchart3D.getDefaultAxisZ().setTitle('')\n\n// Disable Z Axis ticks as it doesn't represent any actual data dimension (only visual perspective).\nchart3D.getDefaultAxisZ().setTickStrategy(AxisTickStrategies.Empty)\n\n// Define Series configuration for simplified example modification.\nconst seriesConf = [\n {\n name: 'Series A',\n },\n {\n name: 'Series B',\n },\n {\n name: 'Series C',\n },\n {\n name: 'Series D',\n },\n {\n name: 'Series E',\n },\n]\n\n// Configure Progressive X Axis.\nchart3D\n .getDefaultAxisX()\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 1000, stopAxisAfter: false }))\n .setScrollStrategy(AxisScrollStrategies.progressive)\n\n// Set Z Axis interval immediately.\nchart3D.getDefaultAxisZ().setInterval({ start: -1, end: 1 + seriesConf.reduce((prev, cur, i) => Math.max(prev, i), 0) })\n\n// : Create Series and generate test data :\n// Amount of unique data points per Series (looped indefinitely along the X plane)\nconst seriesUniqueDataAmount = 2500\n// Amount of new data points pushed each frame to EACH series.\nconst pointsPerFrame = 5\n\nPromise.all(\n seriesConf.map((conf, iSeries) => {\n const seriesName = conf.name || ''\n const seriesZ = conf.z || iSeries\n\n const series = chart3D.addLineSeries().setName(seriesName)\n\n // Generate a static YZ data-set for this series that repeats indefinitely along the X plane.\n return createProgressiveTraceGenerator()\n .setNumberOfPoints(seriesUniqueDataAmount / 2)\n .generate()\n .toPromise()\n .then((data) => {\n // Map XY data to YZ data.\n return data.map((xy) => ({\n y: xy.y,\n z: seriesZ,\n }))\n })\n .then((data) => {\n // Repeat data set so that it can be looped indefinitely.\n return {\n series,\n data: data.concat(data.slice(1, -1).reverse()),\n }\n })\n }),\n).then((seriesAndData) => {\n // Add LegendBox to chart (after series were created).\n const legend = chart3D\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.2,\n })\n .add(chart3D)\n\n // Setup streaming to all series.\n let tStart = Date.now()\n let dataAmount = 0\n let xPos = 0\n // Keep track of data currently in each series.\n seriesAndData.forEach((item) => (item.currentData = []))\n\n const pushNewData = () => {\n for (let iNewPoint = 0; iNewPoint < pointsPerFrame; iNewPoint++) {\n for (const { series, data, currentData } of seriesAndData) {\n // Pick YZ coordinates from data set.\n const yz = data[xPos % data.length]\n const point = {\n x: xPos,\n y: yz.y,\n z: yz.z,\n }\n series.add(point)\n currentData.push(point)\n dataAmount++\n }\n xPos++\n }\n // Schedule next batch of data.\n requestAnimationFrame(pushNewData)\n }\n pushNewData()\n\n // Schedule cleaning of old data.\n const checkCleanupOldData = () => {\n const minPointsToKeep = 1000\n for (let i = 0; i < seriesAndData.length; i++) {\n const { series, data, currentData } = seriesAndData[i]\n if (currentData.length < minPointsToKeep) continue\n const spliceStart = currentData.length - minPointsToKeep\n const spliceCount = Math.min(minPointsToKeep, currentData.length - spliceStart)\n const pointsToKeep = currentData.splice(spliceStart, spliceCount)\n series.clear().add(pointsToKeep)\n seriesAndData[i].currentData = pointsToKeep\n }\n }\n setInterval(checkCleanupOldData, 1000)\n\n // Display incoming points amount in Chart title.\n const title = chart3D.getTitle()\n let lastReset = Date.now()\n const updateChartTitle = () => {\n // Calculate amount of incoming points / second.\n if (dataAmount > 0 && Date.now() - tStart > 0) {\n const pps = (1000 * dataAmount) / (Date.now() - tStart)\n chart3D.setTitle(`${title} (${Math.round(pps)} data points / s)`)\n }\n // Reset pps counter every once in a while in case page is frozen, etc.\n if (Date.now() - lastReset >= 5000) {\n tStart = lastReset = Date.now()\n dataAmount = 0\n }\n }\n setInterval(updateChartTitle, 1000)\n})\n","url":null,"readme":"Example showcasing the use of 3D line series in a high performance application, with constantly changing data.\n","image":"3dRealtimeLine"},{"id":"lcjs-example-0910-3dLiDARPark","title":"3D LiDAR Park Visualization","tags":["lidar","3d","point","scatter"],"description":"Example showcasing visualization of a 3D LiDAR scanned park with over million data points","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChart JS example showcasing visualization of a LiDAR scanned park\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n PointSeriesTypes3D,\n PointStyle3D,\n ColorRGBA,\n SolidFill,\n IndividualPointFill,\n AxisTickStrategies,\n emptyLine,\n emptyFill,\n Themes,\n} = lcjs\n\n// Create 3D chart\nconst chart = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle(`LiDAR Point Cloud`)\n\nconst legend = chart.addLegendBox()\n\n// Setup static axis intervals.\nchart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setLabelFillStyle(emptyFill))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(emptyFill)),\n )\n .setStrokeStyle(emptyLine)\n .setInterval({ start: -11000, end: 19000 })\nchart\n .getDefaultAxisY()\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setLabelFillStyle(emptyFill))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(emptyFill)),\n )\n .setStrokeStyle(emptyLine)\n .setInterval({ start: -5, end: 8500 })\nchart\n .getDefaultAxisZ()\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setLabelFillStyle(emptyFill))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(emptyFill)),\n )\n .setStrokeStyle(emptyLine)\n .setInterval({ start: -14000, end: 12500 })\n\nlet totalPointsCount = 0\n\nconst loadBinaryLidarFile = async (assetName, isColored) => {\n // Load LiDAR data as custom formatted binary file (contains total number of data points + each point X, Y, Z, R, G, B values)\n const result = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + `examples/assets/0910/${assetName}`,\n )\n const blob = await result.blob()\n const arrayBuffer = await blob.arrayBuffer()\n // Read number of points as first Uint32 value.\n let arrayBufferBytePos = 0\n const pointsCount = new Uint32Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + 4))[0]\n arrayBufferBytePos += 4\n // Read binary data into XYZRGB points.\n const dataPoints = new Array(pointsCount).fill(0).map((_) => ({}))\n // X values in order.\n const xValuesByteLength = pointsCount * 2\n const xValues = new Int16Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + xValuesByteLength))\n arrayBufferBytePos += xValuesByteLength\n xValues.forEach((x, i) => (dataPoints[i].x = x))\n // Y values in order.\n const yValuesByteLength = pointsCount * 2\n const yValues = new Int16Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + yValuesByteLength))\n arrayBufferBytePos += yValuesByteLength\n yValues.forEach((y, i) => (dataPoints[i].y = y))\n // Z values in order.\n const zValuesByteLength = pointsCount * 2\n const zValues = new Int16Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + zValuesByteLength))\n arrayBufferBytePos += zValuesByteLength\n zValues.forEach((z, i) => (dataPoints[i].z = z))\n\n if (isColored) {\n // R values in order.\n const rValuesByteLength = pointsCount * 1\n const rValues = new Uint8Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + rValuesByteLength))\n arrayBufferBytePos += rValuesByteLength\n // G values in order.\n const gValuesByteLength = pointsCount * 1\n const gValues = new Uint8Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + rValuesByteLength))\n arrayBufferBytePos += gValuesByteLength\n // B values in order.\n const bValuesByteLength = pointsCount * 1\n const bValues = new Uint8Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + rValuesByteLength))\n arrayBufferBytePos += bValuesByteLength\n\n rValues.forEach((r, i) => {\n dataPoints[i].color = ColorRGBA(r, gValues[i], bValues[i])\n })\n }\n\n // Add Point Series with lidar point cloud data.\n const series = chart\n .addPointSeries({\n type: PointSeriesTypes3D.Pixelated,\n individualPointColorEnabled: isColored,\n })\n .add(dataPoints)\n\n totalPointsCount += pointsCount\n chart.setTitle(`LiDAR Point Cloud | ${totalPointsCount} data points`)\n\n return series\n}\n\nloadBinaryLidarFile('buildings.bin', false).then((series) => {\n series.setName('Buildings').setPointStyle(\n new PointStyle3D.Pixelated({\n size: 1,\n fillStyle: new SolidFill({ color: ColorRGBA(220, 220, 220) }),\n }),\n )\n\n legend.add(series)\n})\n\nloadBinaryLidarFile('green.bin', true).then((series) => {\n series.setName('Vegetation').setPointStyle(\n new PointStyle3D.Pixelated({\n size: 1,\n fillStyle: new IndividualPointFill(),\n }),\n )\n\n legend.add(series)\n})\n","url":null,"readme":"This example shows visualization of a LiDAR scanned 3D object with LightningChart JS 3D Charts.\n\nThis is LiDAR data of a Niemeyer Edifício Copan park in Brasil with 1.437.912 points\n\nLightningChart JS is suitable for really fast visualization of LiDAR data sets in range of tens of millions samples, with 3D points or 3D surface. This example shows the approach with points.\n\nThe LiDAR data points are classified in the source data set between buildings and vegetation, which allows us to separate them into different series. In this example, the building series is colored as solid white colour, while the vegetation is coloured with individual Red, Green and Blue values.\n\nLidar data from: [Philipp Urech](https://sketchfab.com/3d-models/parque-copan-ddfa8cf8aafa4d619e429d9e653ffe81) - Licensed under Creative Commons Attribute.\n","image":"NiemeyerCopan"},{"id":"lcjs-example-0911-3dLiDARLand","title":"3D LiDAR Topography Visualization","tags":["lidar","3d","point","scatter","palette"],"description":"Example showcasing the visualization of LiDAR scanned 3D topography","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * LightningChart JS example showcasing visualization of LiDAR scanned 3D typography\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, PointSeriesTypes3D, PointStyle3D, ColorRGBA, PalettedFill, LUT, AxisTickStrategies, emptyLine, emptyFill, Themes } =\n lcjs\n\n// Create 3D chart\nconst chart = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle(`LiDAR Point Cloud`)\n\nchart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setLabelFillStyle(emptyFill))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(emptyFill)),\n )\n .setStrokeStyle(emptyLine)\nchart\n .getDefaultAxisY()\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setLabelFillStyle(emptyFill))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(emptyFill)),\n )\n .setStrokeStyle(emptyLine)\n .setInterval({ start: -111, end: 2500 })\nchart\n .getDefaultAxisZ()\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setLabelFillStyle(emptyFill))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(emptyFill)),\n )\n .setStrokeStyle(emptyLine)\n\nconst legend = chart.addLegendBox()\n\nlet totalPointsCount = 0\n\nconst loadBinaryLidarFile = async (assetName) => {\n // Load LiDAR data as custom formatted binary file (contains total number of data points + each point X, Y, Z values)\n const result = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + `examples/assets/0911/${assetName}`,\n )\n const blob = await result.blob()\n const arrayBuffer = await blob.arrayBuffer()\n // Read number of points as first Uint32 value.\n let arrayBufferBytePos = 0\n const pointsCount = new Uint32Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + 4))[0]\n arrayBufferBytePos += 4\n // Read binary data into XYZRGB points.\n const dataPoints = new Array(pointsCount).fill(0).map((_) => ({}))\n // X values in order.\n const xValuesByteLength = pointsCount * 2\n const xValues = new Int16Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + xValuesByteLength))\n arrayBufferBytePos += xValuesByteLength\n xValues.forEach((x, i) => (dataPoints[i].x = x))\n // Y values in order.\n const yValuesByteLength = pointsCount * 2\n const yValues = new Int16Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + yValuesByteLength))\n arrayBufferBytePos += yValuesByteLength\n yValues.forEach((y, i) => (dataPoints[i].y = y))\n // Z values in order.\n const zValuesByteLength = pointsCount * 2\n const zValues = new Int16Array(arrayBuffer.slice(arrayBufferBytePos, arrayBufferBytePos + zValuesByteLength))\n arrayBufferBytePos += zValuesByteLength\n zValues.forEach((z, i) => (dataPoints[i].z = z))\n\n // Add Point Series with lidar point cloud data.\n const series = chart\n .addPointSeries({\n type: PointSeriesTypes3D.Pixelated,\n individualPointColorEnabled: true,\n })\n .add(dataPoints)\n .setPointStyle(\n new PointStyle3D.Pixelated({\n fillStyle: new PalettedFill({\n lookUpProperty: 'y',\n lut: new LUT({\n units: 'Elevation (m)',\n interpolate: false,\n steps: [\n { value: -100, color: ColorRGBA(30, 144, 255) },\n { value: 0, color: ColorRGBA(49, 201, 60) },\n { value: 200, color: ColorRGBA(255, 87, 0) },\n { value: 400, color: ColorRGBA(202, 22, 80) },\n { value: 600, color: ColorRGBA(148, 18, 18) },\n { value: 800, color: ColorRGBA(178, 0, 255) },\n { value: 1000, color: ColorRGBA(225, 122, 239) },\n ],\n }),\n }),\n size: 1,\n }),\n )\n\n legend.add(series)\n\n totalPointsCount += pointsCount\n chart.setTitle(`LiDAR Point Cloud | ${totalPointsCount} data points`)\n\n return series\n}\n\nloadBinaryLidarFile('NEWLAND.bin').then((series) => {\n series.setName('Badwater Basin')\n})\n","url":null,"readme":"This example shows visualization of a LiDAR scanned 3D object with LightningChart JS 3D Charts\n\nThis is LiDAR data of Badwater Basin in Death Valley National Park, Inyo County, California with 1.139.662 points\n\nLightningChart JS is suitable for really fast visualization of LiDAR data sets in range of tens of millions samples, with 3D points or 3D surface. This example shows the approach with points. In this example, each point is coloured dynamically by their Y coordinate according to a value -> color lookup table.\n\nLidar data from: [Philipp Urech](https://sketchfab.com/3d-models/badwater-basin-30-sections-across-a-wash-ca8eebf6798d4b0a967336e16f066754) - Licensed under Creative Commons Attribute.\n","image":"LidarLand"},{"id":"lcjs-example-0912-surfaceGrid","title":"JavaScript 3D Surface Grid Chart","tags":["3d","surface","palette"],"description":"Example showcasing the Surface Grid Series feature of LightningChart JS.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/**\n * Example showcasing the Surface Grid Series feature of LightningChart JS.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\nconst {\n lightningChart,\n LUT,\n PalettedFill,\n emptyLine,\n ColorShadingStyles,\n LegendBoxBuilders,\n UIElementBuilders,\n UIOrigins,\n UIDraggingModes,\n regularColorSteps,\n Themes,\n} = lcjs\nconst { createWaterDropDataGenerator } = xydata\n\nconst HEATMAP_COLUMNS = 1024\nconst HEATMAP_ROWS = 1024\n\n// Initialize empty Dashboard and charts.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart()\n .Dashboard({\n numberOfColumns: 2,\n numberOfRows: 1,\n // theme: Themes.darkGold\n })\n .setColumnWidth(0, 1.0)\n .setColumnWidth(1, 1.8)\n\nconst chart2D = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n })\n .setTitle('Generating test data ...')\n\nconst chart3D = dashboard\n .createChart3D({\n columnIndex: 1,\n rowIndex: 0,\n })\n .setTitle('Generating test data ...')\n\n// Generate example data.\ncreateWaterDropDataGenerator()\n .setColumns(HEATMAP_COLUMNS)\n .setRows(HEATMAP_ROWS)\n .generate()\n .then((data) => {\n chart2D.setTitle(`2D Heatmap Grid ${HEATMAP_COLUMNS}x${HEATMAP_ROWS}`)\n chart3D.setTitle(`3D Surface Grid ${HEATMAP_COLUMNS}x${HEATMAP_ROWS} color by Y`)\n\n // Define value -> color lookup table.\n const theme = dashboard.getTheme()\n const lut = new LUT({\n interpolate: true,\n steps: regularColorSteps(0, 70, theme.examples.intensityColorPalette),\n })\n\n // Create series for both 2D and 3D heatmap data visualization and push data in.\n const heatmapSeries2D = chart2D\n .addHeatmapGridSeries({\n columns: HEATMAP_COLUMNS,\n rows: HEATMAP_ROWS,\n })\n .setFillStyle(new PalettedFill({ lut }))\n .setWireframeStyle(emptyLine)\n .invalidateIntensityValues(data)\n\n const surfaceSeries3D = chart3D\n .addSurfaceGridSeries({\n columns: HEATMAP_COLUMNS,\n rows: HEATMAP_ROWS,\n })\n .setFillStyle(new PalettedFill({ lut, lookUpProperty: 'y' }))\n .setWireframeStyle(emptyLine)\n .invalidateHeightMap(data)\n\n // Add selector to see difference between Simple and Phong 3D color shading style in Surface grid series.\n const selectorColorShadingStyle = chart3D\n .addUIElement(UIElementBuilders.CheckBox)\n .setPosition({ x: 100, y: 100 })\n .setOrigin(UIOrigins.RightTop)\n .setMargin({ top: 40, right: 8 })\n .setDraggingMode(UIDraggingModes.notDraggable)\n selectorColorShadingStyle.onSwitch((_, state) => {\n surfaceSeries3D.setColorShadingStyle(state ? new ColorShadingStyles.Phong() : new ColorShadingStyles.Simple())\n selectorColorShadingStyle.setText(`Color shading style: ${state ? 'Phong' : 'Simple'}`)\n })\n selectorColorShadingStyle.setOn(false).setText(`Color shading style: Simple`)\n\n // Add legend with color look up table to chart.\n const legend = chart3D.addLegendBox(LegendBoxBuilders.HorizontalLegendBox).add(chart2D).add(chart3D)\n })\n","url":null,"readme":"This example showcases the `SurfaceGridSeries` feature of LightningChart JS.\n\nSurface Grid Series is used to visualize a data set in form of a grid. To interpret the data, imagine a grid that is layed on the plane between X and Z axes.\n\nSimilarly to Heatmap Grid Series, Surface Grids are split into a number of **columns** (X axis) and **rows** (Z axis). For each intersection between a column and row, there is a **data point** in the surface grid series.\n\nIn this example, the surface grid has 1024 columns and 1024 rows, summing up to a total of 1 048 576 data points. Each of this data points is associated with a **height** (Y axis) value. Additionally, the surface is colored dynamically based on each data points Y value.\n\nTo highlight the similarity, a 2D Heatmap Grid Series with the same data set and palette is displayed on the left side.\n\nFinally, this example also showcases the available selection of _3D color shading style_ (simple or _Phong_). By default, surface series use simple color shading, which displays all colors as they are. To improve depth perception, _phong_ shading can be enabled to simulate the behavior of light in the scene.\n\n# About Performance\n\n`SurfaceGridSeries` is one of the latest additions to LightningChart JS, and as such it enjoys from the very latest optimizations. Surface Grid Series is very well optimized for memory consumption and CPU usage, usual maximum data set sizes with good PC's are in range of billions of data points.\n\nThis is ground breaking performance, as traditionally surface charts are really expensive components with the size limit being around 10 000 data points (100 000x smaller).\n\nLarge Surface Grid Series are very GPU intensive which shows as slow redrawing. When developing applications that utilize them, it is best to avoid unnecessary redraws to maintain good refresh rate with weak devices, such as laptops and phones.\n\n# More Surface Examples\n\n- [Chunked Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0916-surfaceChunkLoad.html) | This example shows how surface grid series can be split into sub sections which are loaded individually for better performance and response time.\n\n- [Intensity Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0914-surfaceIntensityGrid.html) | This example showcases how surface grid series can be colored based on a different data set than the height map used in this example.\n\n- [Real-Time Audio Spectrum Surface Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0913-surfaceScrollingGrid.html) | This example showcases using real-time data source with surface series.\n\n- [All Surface Examples](https://lightningchart.com/lightningchart-js-interactive-examples/search.html?t=surface)\n","image":"surfaceGrid"},{"id":"lcjs-example-0913-surfaceScrollingGrid","title":"JavaScript Audio Spectrogram 2D & 3D Chart","tags":["3d","surface","palette","realtime"],"description":"Example showcasing the Surface Scrolling Grid Series feature of LightningChart JS.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/**\n * Example showcasing the Surface Scrolling Grid Series feature of LightningChart JS.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, LUT, ColorHSV, PalettedFill, emptyLine, AxisScrollStrategies, AxisTickStrategies, regularColorSteps, Themes } = lcjs\n\nconst historyMs = 27 * 1000\n// Sampling rate as samples per second.\nconst sampleRateHz = 35\nconst sampleIntervalMs = 1000 / sampleRateHz\n\n// Create empty dashboard and charts.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart()\n .Dashboard({\n numberOfColumns: 2,\n numberOfRows: 2,\n // theme: Themes.darkGold\n })\n .setRowHeight(0, 1)\n .setRowHeight(1, 2)\n\nlet labelLoading = dashboard.addUIElement().setText('Loading example data ...')\n\n// Load example data from file.\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/0913/audio2ch.json')\n .then((r) => r.json())\n .then((data) => {\n labelLoading.dispose()\n labelLoading = undefined\n\n // Define value -> color lookup table.\n const theme = dashboard.getTheme()\n const lut = new LUT({\n steps: regularColorSteps(0, 255, theme.examples.spectrogramColorPalette),\n units: 'dB',\n interpolate: true,\n })\n\n const rowStep = 40\n const intensityValueToDb = (value) => -100 + (value / 255) * (-30 - -100)\n\n let channelList = [\n {\n name: 'Channel 1',\n data: data.ch1,\n columnIndex: 0,\n },\n {\n name: 'Channel 2',\n data: data.ch2,\n columnIndex: 1,\n },\n ]\n\n channelList = channelList.map((channel) => {\n const rows = channel.data[0].length\n const chart2D = dashboard\n .createChartXY({\n columnIndex: channel.columnIndex,\n rowIndex: 0,\n })\n .setTitle(`${channel.name} | 2D audio spectrogram`)\n chart2D\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time)\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - historyMs, stopAxisAfter: false }))\n chart2D.getDefaultAxisY().setTitle('Frequency (Hz)')\n\n const chart3D = dashboard\n .createChart3D({\n columnIndex: channel.columnIndex,\n rowIndex: 1,\n })\n .setTitle(`${channel.name} | 3D audio spectrogram`)\n\n chart3D\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time)\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - historyMs, stopAxisAfter: false }))\n chart3D\n .getDefaultAxisY()\n .setTitle('Intensity (dB)')\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks.setFormattingFunction((y) => intensityValueToDb(y).toFixed(0)),\n )\n chart3D.getDefaultAxisZ().setTitle('Frequency (Hz)')\n\n const heatmapSeries2D = chart2D\n .addHeatmapScrollingGridSeries({\n scrollDimension: 'columns',\n resolution: rows,\n step: { x: sampleIntervalMs, y: rowStep },\n })\n .setFillStyle(new PalettedFill({ lut }))\n .setWireframeStyle(emptyLine)\n .setDataCleaning({ maxDataPointCount: 10000 })\n\n const surfaceSeries3D = chart3D\n .addSurfaceScrollingGridSeries({\n scrollDimension: 'columns',\n columns: Math.ceil(historyMs / sampleIntervalMs),\n rows,\n step: { x: sampleIntervalMs, z: rowStep },\n })\n .setFillStyle(new PalettedFill({ lut, lookUpProperty: 'y' }))\n .setWireframeStyle(emptyLine)\n\n return { ...channel, chart2D, chart3D, heatmapSeries2D, surfaceSeries3D }\n })\n\n // Setup infinite streaming from static data set.\n let tStart = window.performance.now()\n let pushedDataCount = 0\n const streamData = () => {\n const tNow = window.performance.now()\n // NOTE: This code is for example purposes (streaming stable data rate without destroying browser when switching tabs etc.)\n // In real use cases, data should be pushed in when it comes.\n const shouldBeDataPointsCount = Math.floor((sampleRateHz * (tNow - tStart)) / 1000)\n const newDataPointsCount = Math.min(shouldBeDataPointsCount - pushedDataCount, 100) // Add max 100 samples per frame into a series. This prevents massive performance spikes when switching tabs for long times\n if (newDataPointsCount > 0) {\n channelList.forEach((channel, i) => {\n const newDataPoints = []\n for (let iDp = 0; iDp < newDataPointsCount; iDp++) {\n const iData = (pushedDataCount + iDp) % channel.data.length\n const sample = channel.data[iData]\n newDataPoints.push(sample)\n }\n channel.heatmapSeries2D.addIntensityValues(newDataPoints)\n channel.surfaceSeries3D.addValues({ yValues: newDataPoints })\n })\n pushedDataCount += newDataPointsCount\n }\n requestAnimationFrame(streamData)\n }\n streamData()\n })\n","url":null,"readme":"This example showcases the `SurfaceScrollingGridSeries` feature of LightningChart JS.\n\nThis works otherwise same as `SurfaceGridSeries`, except that it is designed explicitly for applications that are based on pushing new samples in, while shifting old samples out. For this reason, its data modification API is different.\n\n`SurfaceScrollingGridSeries` is the 3D variant of [`HeatmapScrollingGridSeries`](https://lightningchart.com/lightningchart-js-api-documentation/v3.2.0/classes/heatmapscrollinggridseries.html). This is highlighted in this example, by displaying the same data in both 2D and 3D at the same time on top of another.\n\nThis example visualizes the frequency spectrum of a short audio clip (about 9 seconds long) of a truck driving. The visualization is done in real-time, simulating applications that measure, analyse and display audio metrics in real-time. One such application is the [LightningChart Audio analysis showcase](https://arction.github.io/lcjs-showcase-audio/).\n\nEach spectrogram in this application displays ~35 samples per second, each sample having 308 data points. With 4 spectrograms, this sums to about 10 000 data points per second.\n\n# About Performance\n\n`SurfaceScrollingGridSeries` is one of the latest additions to LightningChart JS, and as such it enjoys from the very latest optimizations. Surface Grid Series is very well optimized for memory consumption and CPU usage.\n\nContrary to traditional data visualization tools, which perform a full update whenever data is changed, the scrolling grid series append operation is truly lightning fast due to it being designed specifically for this kind of applications. The data input rate of scrolling grid series is virtually unlimited, performing well with even **tens of millions of incoming data points per second**.\n\nThe performance bottleneck in scrolling spectrogram applications is generally axis ticks (surprisingly), and if the surface grid is large (several million data points and more) then the render time can start to limit the refresh rate. This is alleviated by using a better Graphics Processing Unit.\n\n# More Surface Examples\n\n- [Static Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0912-surfaceGrid.html) | This example showcases the most simple usage of surface grid series, and also has a bit more detailed description of the related terms.\n\n- [Chunked Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0916-surfaceChunkLoad.html) | This example shows how surface grid series can be split into sub sections which are loaded individually for better performance and response time.\n\n- [Intensity Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0914-surfaceIntensityGrid.html) | This example showcases how surface grid series can be colored based on a different data set than the height map used in this example.\n\n- [All Surface Examples](https://lightningchart.com/lightningchart-js-interactive-examples/search.html?t=surface)\n","image":"surfaceScrollingGrid"},{"id":"lcjs-example-0914-surfaceIntensityGrid","title":"JavaScript Intensity Surface Grid Chart","tags":["3d","surface","palette"],"description":"Example showcasing the Surface Grid Series feature of LightningChart JS with separate data sets for height and Intensity","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/**\n * Example showcasing the Surface Grid Series feature of LightningChart JS with separate data sets for height and Intensity\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\nconst {\n lightningChart,\n LUT,\n PalettedFill,\n ColorShadingStyles,\n LegendBoxBuilders,\n UIElementBuilders,\n UIOrigins,\n UIDraggingModes,\n emptyFill,\n UILayoutBuilders,\n regularColorSteps,\n Themes,\n} = lcjs\nconst { createWaterDropDataGenerator } = xydata\n\nconst COLUMNS = 100\nconst ROWS = 100\n\nconst chart = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle('Generating example data ...')\n\nPromise.all([\n // Generate Height map data set.\n createWaterDropDataGenerator()\n .setColumns(COLUMNS)\n .setRows(ROWS)\n .setWaterDrops([\n {\n rowNormalized: 0.5,\n columnNormalized: 0.5,\n amplitude: 20,\n },\n ])\n .generate(),\n // Generate intensity data set.\n createWaterDropDataGenerator()\n .setColumns(COLUMNS)\n .setRows(ROWS)\n .setVolatility(10)\n .setWaterDrops([\n {\n columnNormalized: 0.22,\n rowNormalized: 0.2,\n amplitude: 80,\n },\n {\n columnNormalized: 0.4,\n rowNormalized: 0.7,\n amplitude: 70,\n },\n {\n columnNormalized: 0.8,\n rowNormalized: 0.3,\n amplitude: 100,\n },\n ])\n .generate(),\n]).then((dataSets) => {\n chart.setTitle('Rendering data ...')\n requestAnimationFrame(() => {\n const tStart = performance.now()\n const heightDataSet = dataSets[0]\n const intensityDataSet = dataSets[1]\n\n const surfaceGrid = chart\n .addSurfaceGridSeries({\n dataOrder: 'rows',\n columns: COLUMNS,\n rows: ROWS,\n })\n .setIntensityInterpolation('bilinear')\n .invalidateHeightMap(heightDataSet)\n .invalidateIntensityValues(intensityDataSet)\n\n requestAnimationFrame(() => {\n const tNow = performance.now()\n const tLoadupMs = tNow - tStart\n chart.setTitle(\n `Intensity Surface Grid ${COLUMNS}x${ROWS} (${((COLUMNS * ROWS) / 10 ** 3).toFixed(1)} thousand data points) | Ready in ${(\n tLoadupMs / 1000\n ).toFixed(2)} s`,\n )\n\n // Add selector to see difference between Simple and Phong 3D color shading style in Surface grid series.\n const layout = chart\n .addUIElement(UILayoutBuilders.Column)\n .setPosition({ x: 100, y: 100 })\n .setOrigin(UIOrigins.RightTop)\n .setMargin({ top: 40, right: 8 })\n .setDraggingMode(UIDraggingModes.notDraggable)\n\n const toggleColorShadingStyle = (state) => {\n surfaceGrid.setColorShadingStyle(state ? new ColorShadingStyles.Phong() : new ColorShadingStyles.Simple())\n selectorColorShadingStyle.setText(`Color shading style: ${state ? 'Phong' : 'Simple'}`)\n }\n const selectorColorShadingStyle = layout.addElement(UIElementBuilders.CheckBox)\n selectorColorShadingStyle.onSwitch((_, state) => toggleColorShadingStyle(state))\n toggleColorShadingStyle(false)\n\n // Add selector for wireframe only style.\n const defaultWireframeStyle = surfaceGrid.getWireframeStyle()\n const toggleWireframeStyle = (state) => {\n if (state) {\n surfaceGrid.setFillStyle(emptyFill).setWireframeStyle(defaultStrokeStyle.setThickness(0.1))\n } else {\n const theme = chart.getTheme()\n surfaceGrid\n .setFillStyle(\n new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n interpolate: true,\n percentageValues: true,\n steps: regularColorSteps(0, 1, theme.examples.intensityColorPalette),\n }),\n }),\n )\n .setWireframeStyle(defaultWireframeStyle)\n }\n selectorWireframe.setText(state ? `Wireframe only` : 'Fill + Wireframe')\n }\n const selectorWireframe = layout.addElement(UIElementBuilders.CheckBox)\n selectorWireframe.onSwitch((_, state) => toggleWireframeStyle(state))\n toggleWireframeStyle(false)\n\n // Add legend.\n const legend = chart.addLegendBox(LegendBoxBuilders.HorizontalLegendBox).add(chart)\n })\n })\n})\n\nlet tempLineSeries = chart.addLineSeries()\nconst defaultStrokeStyle = tempLineSeries.getStrokeStyle()\ntempLineSeries.dispose()\ntempLineSeries = undefined\n","url":null,"readme":"This example showcases the `SurfaceGridSeries` feature of LightningChart JS and more specifically its ability to process two different data sets:\n\n- Height data set\n- Intensity data set\n\nBoth of these data sets are structured similarly (one value for each column & row combination in surface grid), but serve different purposes. Height data set is used to alter the visible shape of the series, while the Intensity data set can **optionally** be used for coloring the series.\n\nSee [Surface Grid Chart Example](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0912-surfaceGrid.html) for a usage scenario, which only uses the Height data set.\n\nThis example generates a different data set for Height and Intensity data, and colors the surface according to the Intensity data set, effectively forming a 4-dimensional data visualization (X, Y, Z, Color).\n\n# More Surface Examples\n\n- [Surface Grid Chart (only Y data)](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0912-surfaceGrid.html) | This example showcases the most simple usage of surface grid series, and also has a bit more detailed description of the related terms.\n\n- [Chunked Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0916-surfaceChunkLoad.html) | This example shows how surface grid series can be split into sub sections which are loaded individually for better performance and response time.\n\n- [Real-Time Audio Spectrum Surface Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0913-surfaceScrollingGrid.html) | This example showcases using real-time data source with surface series.\n\n- [All Surface Examples](https://lightningchart.com/lightningchart-js-interactive-examples/search.html?t=surface)\n","image":"surfaceIntensityGrid"},{"id":"lcjs-example-0915-surfaceGridPartialInvalidation","title":"JavaScript Surface Partial Invalidation Chart","tags":["3d","surface","palette","realtime"],"description":"Example showcasing the partial data invalidation feature of Surface Grid Series","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/**\n * Example showcasing the partial data invalidation feature of Surface Grid Series\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst {\n lightningChart,\n LUT,\n ColorRGBA,\n PalettedFill,\n emptyLine,\n ColorShadingStyles,\n LegendBoxBuilders,\n AxisScrollStrategies,\n PointStyle3D,\n regularColorSteps,\n Themes,\n} = lcjs\n\nconst COLUMNS = 200\nconst ROWS = 200\n\nconst chart3D = lightningChart({\n warnings: false,\n}).Chart3D({\n // theme: Themes.darkGold\n})\n\nchart3D.getDefaultAxisY().setScrollStrategy(AxisScrollStrategies.expansion).setInterval({ start: 0, end: 100, stopAxisAfter: false })\n\nchart3D.setTitle(`3D Surface Grid ${COLUMNS}x${ROWS} | partial invalidation`)\n\n// Define value -> color lookup table.\nconst theme = chart3D.getTheme()\nconst lut = new LUT({\n interpolate: true,\n steps: regularColorSteps(0, 50, theme.examples.intensityColorPalette),\n // steps: [\n // { value: 0, color: ColorRGBA(255, 215, 0) },\n // { value: 50, color: ColorRGBA(255, 0, 0) },\n // { value: 100, color: ColorRGBA(0, 0, 255) },\n // ],\n})\n\nconst heightData = new Array(COLUMNS).fill(0).map((_) => new Array(ROWS).fill(0))\n\nconst surfaceSeries3D = chart3D\n .addSurfaceGridSeries({\n columns: COLUMNS,\n rows: ROWS,\n })\n .setFillStyle(new PalettedFill({ lut, lookUpProperty: 'y' }))\n .setWireframeStyle(emptyLine)\n .invalidateHeightMap(heightData)\n .setColorShadingStyle(new ColorShadingStyles.Phong())\n\n// Add legend with color look up table to chart.\nconst legend = chart3D.addLegendBox(LegendBoxBuilders.HorizontalLegendBox).add(chart3D)\n\n// Animate surface invalidation over a moving \"update location\". The goal here is to showcase the partial data update feature of LC JS heatmaps and surfaces.\nconst tStart = window.performance.now()\nconst updateMaskRadius = 5\nconst updateMask = []\nfor (let column = -updateMaskRadius; column <= updateMaskRadius; column += 1) {\n for (let row = -updateMaskRadius; row <= updateMaskRadius; row += 1) {\n const d = Math.sqrt(column ** 2 + row ** 2)\n if (d <= updateMaskRadius) {\n updateMask.push({ column, row })\n }\n }\n}\nconst random = (() => {\n const len = 123512\n const pattern = new Array(len).fill(0).map((_) => Math.random())\n let i = 0\n return () => {\n const next = pattern[i]\n i = (i + 1) % len\n return next\n }\n})()\nconst points = chart3D.addPointSeries().setColorShadingStyle(new ColorShadingStyles.Simple()).setAutoScrollingEnabled(false)\npoints.setPointStyle(\n new PointStyle3D.Triangulated({\n fillStyle: points.getPointStyle().getFillStyle(),\n shape: 'sphere',\n size: { x: updateMaskRadius * 2, y: 0.1, z: updateMaskRadius * 2 },\n }),\n)\n\nconst updateMaskValues = new Array(updateMaskRadius * 2 + 1).fill(0).map((_) => new Array(updateMaskRadius * 2 + 1).fill(0))\n\nconst updateAnimation = () => {\n const t = window.performance.now() - tStart\n const updateLoc_angle = t * 0.0005\n const updateLoc_radius = 40 + 30 * Math.sin(t * 0.0003) + 10 * Math.cos(t * 0.001)\n const updateLoc = {\n x: Math.round(COLUMNS / 2 + Math.cos(updateLoc_angle) * updateLoc_radius),\n z: Math.round(ROWS / 2 + Math.sin(updateLoc_angle) * updateLoc_radius),\n y: 0,\n }\n for (let iMask = 0; iMask < updateMask.length; iMask += 1) {\n const mask = updateMask[iMask]\n const column = updateLoc.x + mask.column\n const row = updateLoc.z + mask.row\n if (column < heightData.length && column >= 0 && row < heightData[0].length && row >= 0) {\n heightData[column][row] += random()\n }\n }\n for (let col = 0; col < updateMaskRadius * 2 + 1; col += 1) {\n for (let row = 0; row < updateMaskRadius * 2 + 1; row += 1) {\n const colData = updateLoc.x + col - updateMaskRadius\n const rowData = updateLoc.z + row - updateMaskRadius\n if (colData < heightData.length && colData >= 0 && rowData < heightData[0].length && rowData >= 0) {\n updateMaskValues[col][row] = heightData[colData][rowData]\n }\n }\n }\n surfaceSeries3D.invalidateHeightMap({\n iColumn: Math.round(updateLoc.x - updateMaskRadius),\n iRow: Math.round(updateLoc.z - updateMaskRadius),\n values: updateMaskValues,\n })\n\n points.clear().add(updateLoc)\n\n requestAnimationFrame(updateAnimation)\n}\nupdateAnimation()\n","url":null,"readme":"This example showcases the _partial data update_ feature of `SurfaceGridSeries`.\n\nSurface Grid Series allows updating any rectangular sub-section of grid data without affecting any additional data. LightningChart JS has optimized this particular use case really well, whereas most traditional data visualization tools would have to prepare the entire visualization again even if only a small section of data needs to be updated.\n\nIn this example, there is a small focus area which is moving periodically along the XZ plane. Every frame, the height data within this focus area is changed.\n\n![Focus area](./assets/focus-point.png)\n\nMore commonly, the partial data update feature is used to load large data sets in several smaller \"chunks\", as showcased in the [Chunked Surface Grid Chart Example](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0916-surfaceChunkLoad.html).\n\n# More Surface Examples\n\n- [Chunked Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0916-surfaceChunkLoad.html) | This example shows how surface grid series can be split into sub sections which are loaded individually for better performance and response time.\n\n- [Intensity Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0914-surfaceIntensityGrid.html) | This example showcases how surface grid series can be colored based on a different data set than the height map used in this example.\n\n- [Real-Time Audio Spectrum Surface Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0913-surfaceScrollingGrid.html) | This example showcases using real-time data source with surface series.\n\n- [All Surface Examples](https://lightningchart.com/lightningchart-js-interactive-examples/search.html?t=surface)\n","image":"surfaceGridPartialInvalidation"},{"id":"lcjs-example-0916-surfaceChunkLoad","title":"JavaScript Chunked Surface Grid Chart","tags":["3d","surface","palette"],"description":"Example showcasing how large Surface Charts can be loaded in several small parts instead of 1 large data set","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/**\n * Example showcasing how large Surface Charts can be loaded in several small parts instead of 1 large data set\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Import xydata\nconst xydata = require('@lightningchart/xydata')\n\nconst { lightningChart, LUT, PalettedFill, emptyLine, LegendBoxBuilders, ColorShadingStyles, regularColorSteps, Themes } = lcjs\nconst { createWaterDropDataGenerator } = xydata\n\nconst COLUMNS = 2000\nconst ROWS = 2000\nconst CHUNK_SIZE = 1000\n\n// Create chart and series.\nconst chart = lightningChart().Chart3D({\n // theme: Themes.darkGold\n})\n\nconst theme = chart.getTheme()\nconst surfaceGrid = chart\n .addSurfaceGridSeries({\n columns: COLUMNS,\n rows: ROWS,\n })\n .setColorShadingStyle(new ColorShadingStyles.Phong())\n .setFillStyle(\n new PalettedFill({\n lookUpProperty: 'y',\n lut: new LUT({\n interpolate: false,\n steps: regularColorSteps(0, 75, theme.examples.coldHotColorPalette),\n }),\n }),\n )\n .setWireframeStyle(emptyLine)\n\nconst legend = chart\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox)\n .add(chart)\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.8,\n })\n\n// Load data set one \"chunk\" at a time. Chunk refers to a smaller sub set of the entire data set.\n// Loading large data sets in parts is extremely efficient in terms of memory usage and application usability.\n;(async () => {\n const chunks = []\n for (let column = 0; column < COLUMNS; column += CHUNK_SIZE) {\n for (let row = 0; row < ROWS; row += CHUNK_SIZE) {\n chunks.push({ column, row })\n }\n }\n\n chart.setTitle(`Loading data in chunks ... (0 / ${chunks.length})`)\n for (let iChunk = 0; iChunk < chunks.length; iChunk += 1) {\n const chunk = chunks[iChunk]\n\n const rand = (min, max) => min + Math.random() * (max - min)\n const waterDropsCount = Math.round(rand(1, 5))\n const waterdropOptions = new Array(waterDropsCount).fill(0).map((_) => ({\n rowNormalized: rand(0.0, 1.0),\n columnNormalized: rand(0.0, 1.0),\n amplitude: rand(5, 60),\n }))\n const chunkData = await createWaterDropDataGenerator()\n .setColumns(CHUNK_SIZE)\n .setRows(CHUNK_SIZE)\n .setWaterDrops(waterdropOptions)\n .generate()\n\n surfaceGrid.invalidateHeightMap({\n iColumn: chunk.column,\n iRow: chunk.row,\n values: chunkData,\n })\n\n chart.setTitle(`Loading data in chunks ... (${iChunk + 1} / ${chunks.length})`)\n\n await new Promise((resolve) => setTimeout(resolve, 2000))\n }\n\n chart.setTitle(`Surface Grid ${COLUMNS}x${ROWS} (total ${((COLUMNS * ROWS) / 10 ** 6).toFixed(1)} million data points)`)\n})()\n","url":null,"readme":"This example showcases how to load a large surface grid chart (several millions and up to billions data points) in small sub sections, instead of one massive interaction.\n\nThis is made possible by the _partial data invalidation_ syntax of `invalidateHeightMap` method (also possible with intensity data), which allows updating any rectangular sub section of the heatmap without having to update any extra data.\n\nLoading data in chunks is especially great for memory usage, because in web applications loading large data sets into memory comes with the risk of the browser crashing because there is not enough memory available. By separating the process into chunks, applications can work significantly increased reliability.\n\n# More Surface Examples\n\n- [Surface Grid Chart (only Y data)](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0912-surfaceGrid.html) | This example showcases the most simple usage of surface grid series, and also has a bit more detailed description of the related terms.\n\n- [Intensity Surface Grid Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0914-surfaceIntensityGrid.html) | This example showcases how surface grid series can be colored based on a different data set than the height map used in this example.\n\n- [Real-Time Audio Spectrum Surface Chart](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-0913-surfaceScrollingGrid.html) | This example showcases using real-time data source with surface series.\n\n- [All Surface Examples](https://lightningchart.com/lightningchart-js-interactive-examples/search.html?t=surface)\n","image":"surfaceChunkLoad"},{"id":"lcjs-example-0917-confidenceEllipsoid3d","title":"JavaScript 3D Confidence Ellipsoid Chart","tags":["3d","point"],"description":"Example showcasing 3D variant of popular 2D statistics data visualization method of confidence ellipses","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/**\n * Example showcasing 3D variant of popular 2D statistics data visualization method of confidence ellipses\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, PointStyle3D, ColorShadingStyles, Themes } = lcjs\n\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold\n })\n .setTitle('3D scatter data set and confidence ellipsoid')\n\nchart3D.forEachAxis((axis) => axis.setInterval({ start: -1.8, end: 1.8 }))\n\nconst scatterSeries = chart3D.addPointSeries().setName('Scatter series')\nconst confidenceEllipsoidSeries = chart3D.addPointSeries().setName('Confidence ellipsoid')\n\nconst xSize = 1.2\nconst ySize = 1.2\nconst zSize = 1.5\nconst pi2 = Math.PI * 2\nconst data = new Array(1000).fill(0).map((_) => {\n // https://karthikkaranth.me/blog/generating-random-points-in-a-sphere/\n const u = Math.random()\n const v = Math.random()\n const theta = u * pi2\n const phi = Math.acos(2.0 * v - 1.0)\n const r = Math.cbrt(Math.random())\n const sinTheta = Math.sin(theta)\n const cosTheta = Math.cos(theta)\n const sinPhi = Math.sin(phi)\n const cosPhi = Math.cos(phi)\n const x = xSize * r * sinPhi * cosTheta\n const y = ySize * r * sinPhi * sinTheta\n const z = zSize * r * cosPhi\n return { x, y, z }\n})\nscatterSeries.add(data)\n\nconfidenceEllipsoidSeries\n .setDepthTestEnabled(false)\n .setColorShadingStyle(new ColorShadingStyles.Simple())\n .setPointStyle(\n new PointStyle3D.Triangulated({\n // Ellipsoid is rendered as sphere with individual sizes along X, Y and Z axes.\n shape: 'sphere',\n size: { x: xSize * 2, y: ySize * 2, z: zSize * 2 },\n fillStyle: scatterSeries.getPointStyle().getFillStyle().setA(50),\n }),\n )\n .add({ x: 0, y: 0, z: 0 })\n\nconst legend = chart3D.addLegendBox().add(chart3D)\n","url":null,"readme":"Example showcasing the 3D variant of a common statistical data visualization method: confidence ellipses.\n\nConfidence ellipses are used especially with statistic chart applications. A common usage, for example, is the 95% confidence ellipse, which visualizes the area that contains 95% of samples, which makes it easier for the user to understand which points are _outliers_.\n\nThe same can be done in more complex 3D scatter data set visualizations, in which case the ellipse becomes an _ellipsoid_.\n\nProgrammatically, this can be implemented by drawing the ellipsoid as a _sphere_ with different sizes along the X, Y and Z axes.\n\n```ts\nconst ellipsoidSeries = chart3D\n .addPointSeries()\n // Specify ellipsoid center coordinate.\n .add({ x: 0, y: 0, z: 0 })\n .setPointStyle(\n new PointStyle3D.Triangulated({\n // Specify ellipsoid dimensions.\n size: { x: 1, y: 2, z: 1.5 },\n }),\n )\n```\n","image":"confidenceEllipsoid3d"},{"id":"lcjs-example-0918-scatterSurface","title":"JavaScript 3D Surface Chart from Scatter Data","tags":["3d","point","surface"],"description":"Example showcasing visualization of a 3D scatter data set using a Surface Chart","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, PalettedFill, LUT, regularColorSteps, PointShape } = lcjs\n\nfetch(`${new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname}examples/assets/0918/precalc-surface.json`)\n .then((r) => r.json())\n .then((data) => {\n const {\n keyIntensity,\n startX,\n stepX,\n startZ,\n stepZ,\n valueRanges,\n surfaceResolution,\n surfaceDataY,\n surfaceDataIntensity,\n dataPoints,\n } = data\n\n const lc = lightningChart()\n const chart = lc\n .Chart3D({\n // theme: Themes.darkGold,\n })\n .setTitle('3D surface chart visualized from scatter data set')\n chart.getDefaultAxisX().setTitle('KPI X')\n chart.getDefaultAxisY().setTitle('KPI Y')\n chart.getDefaultAxisZ().setTitle('KPI Z')\n const pointSeries = chart\n .addPointSeries()\n .setName('Raw samples')\n .add(dataPoints)\n .setPointStyle((points) => points.setSize(5))\n\n const surface = chart\n .addSurfaceGridSeries({\n dataOrder: 'columns',\n columns: surfaceResolution,\n rows: surfaceResolution,\n start: { x: startX, z: startZ },\n step: { x: stepX, z: stepZ },\n })\n .setName('Surface')\n .invalidateHeightMap(surfaceDataY)\n\n if (keyIntensity) {\n surface.invalidateIntensityValues(surfaceDataIntensity).setFillStyle(\n new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n interpolate: true,\n steps: regularColorSteps(\n valueRanges[keyIntensity].min,\n valueRanges[keyIntensity].max,\n chart.getTheme().examples.badGoodColorPalette,\n ),\n units: 'KPI 4',\n }),\n }),\n )\n }\n\n const legend = chart.addLegendBox().add(chart)\n })\n","url":null,"readme":"Example showing use of Surface charts to visualize 3 dimensional scatter data sets.\n\nSurface chart allow visualization of relations between 3 different data properties at once.\nThis can be extended to 4 properties at once by adding in dynamic coloring.\n\nThis example loads in a prepared data set of different data properties and displays the raw points using a 3D Point Series and the resulting surface using a 3D Surface Series.\n\n3D scatter data sets can be translated to surface data sets, but the operation is slightly heavy. In this case, this has been done before hand and the static example data has been saved in the surface format.\n","image":"scatterSurface","showNew":true},{"id":"lcjs-example-1001-polarMicrophoneSensitivity","title":"Polar Microphone Sensitivity JavaScript Chart","tags":["polar","line"],"description":"PolarChart showcase with LineSeries","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Polar Charts, Scientific Charts, High-Performance Charts, Medical Charts, Area Charts, Line Series.","src":"/*\n * LightningChartJS example showcasing PolarChart and PolarLineSeries in a microphone sensitivity visualization application.\n *\n * Also shows configuration of PolarAxes.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, Themes } = lcjs\n\nconst app = (data) => {\n // Create a polar chart.\n const polar = lightningChart()\n .Polar({\n // theme: Themes.darkGold\n })\n .setTitle('Microphone sensitivity 360 degrees')\n\n // Configure Polar Axes.\n const radialAxis = polar\n .getRadialAxis()\n // 0 = North, Clockwise direction.\n .setNorth(0)\n .setClockwise(true)\n\n const amplitudeAxis = polar\n .getAmplitudeAxis()\n // Set amplitude interval manually.\n // [-39 dB, 0 dB]\n .setInterval({ start: -39, end: 0, stopAxisAfter: false })\n .setTitle('Sensitivity (dB)')\n\n // Create series for each data set.\n const series = data.map((info, i) => {\n const { name, hex } = info\n const polarLineSeries = polar\n .addLineSeries()\n .setName(name)\n .setCursorResultTableFormatter((builder, series, angleDeg, amplitude, format) =>\n builder\n .addRow(`${series.getName()} signal`)\n .addRow('Angle', '', `${Math.round(angleDeg)} °`)\n .addRow('Sensitivity', '', `${format(amplitude)} dB`),\n )\n\n // Set series data.\n const polarPoints = data[i].data\n const polarPointsWithStatic = polarPoints.map((polarPoint) => ({\n angle: polarPoint.angle,\n amplitude: polarPoint.amplitude + (Math.random() * 2 - 1) * 0.2,\n }))\n polarLineSeries.setData(polarPointsWithStatic)\n\n return polarLineSeries\n })\n\n // Add LegendBox.\n const legendBox = polar\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.2,\n })\n legendBox.add(polar)\n}\n\napp([\n {\n name: '150Hz',\n data: [\n { angle: 0, amplitude: 0 },\n { angle: 0.5, amplitude: 0 },\n { angle: 0.8, amplitude: 0 },\n { angle: 1.1, amplitude: 0 },\n { angle: 2.1, amplitude: 0 },\n { angle: 2.4, amplitude: 0 },\n { angle: 2.9, amplitude: 0 },\n { angle: 3, amplitude: 0 },\n { angle: 3.4, amplitude: 0 },\n { angle: 4.6, amplitude: 0 },\n { angle: 6.1, amplitude: 0 },\n { angle: 6.6, amplitude: 0 },\n { angle: 7.2, amplitude: 0 },\n { angle: 7.5, amplitude: -0.40000000000000036 },\n { angle: 8.3, amplitude: -0.40000000000000036 },\n { angle: 8.4, amplitude: -0.40000000000000036 },\n { angle: 9, amplitude: -0.40000000000000036 },\n { angle: 9.4, amplitude: -0.40000000000000036 },\n { angle: 9.5, amplitude: -0.40000000000000036 },\n { angle: 10.1, amplitude: -0.40000000000000036 },\n { angle: 10.7, amplitude: -0.40000000000000036 },\n { angle: 11.2, amplitude: -0.40000000000000036 },\n { angle: 11.3, amplitude: -0.40000000000000036 },\n { angle: 11.8, amplitude: -0.40000000000000036 },\n { angle: 12.1, amplitude: -0.40000000000000036 },\n { angle: 12.4, amplitude: -0.40000000000000036 },\n { angle: 12.8, amplitude: -0.40000000000000036 },\n { angle: 12.9, amplitude: -0.40000000000000036 },\n { angle: 13.5, amplitude: -0.40000000000000036 },\n { angle: 13.7, amplitude: -0.40000000000000036 },\n { angle: 14, amplitude: -0.40000000000000036 },\n { angle: 14.5, amplitude: 0 },\n { angle: 15, amplitude: 0 },\n { angle: 15.3, amplitude: 0 },\n { angle: 16, amplitude: 0 },\n { angle: 16.3, amplitude: 0 },\n { angle: 16.5, amplitude: 0 },\n { angle: 16.6, amplitude: 0 },\n { angle: 16.9, amplitude: 0 },\n { angle: 17, amplitude: 0 },\n { angle: 17.2, amplitude: 0 },\n { angle: 17.6, amplitude: 0 },\n { angle: 17.8, amplitude: 0 },\n { angle: 18.1, amplitude: 0 },\n { angle: 18.3, amplitude: -0.40000000000000036 },\n { angle: 18.7, amplitude: -0.40000000000000036 },\n { angle: 18.9, amplitude: -0.40000000000000036 },\n { angle: 19.1, amplitude: -0.40000000000000036 },\n { angle: 19.5, amplitude: -0.40000000000000036 },\n { angle: 20.1, amplitude: -0.40000000000000036 },\n { angle: 20.5, amplitude: -0.40000000000000036 },\n { angle: 20.7, amplitude: -0.8000000000000007 },\n { angle: 20.9, amplitude: -0.8000000000000007 },\n { angle: 21.8, amplitude: -0.8000000000000007 },\n { angle: 21.9, amplitude: -0.8000000000000007 },\n { angle: 22, amplitude: -0.8000000000000007 },\n { angle: 22.1, amplitude: -0.8000000000000007 },\n { angle: 22.5, amplitude: -0.8000000000000007 },\n { angle: 22.6, amplitude: -0.8000000000000007 },\n { angle: 22.7, amplitude: -0.8000000000000007 },\n { angle: 23, amplitude: -0.8000000000000007 },\n { angle: 23.3, amplitude: -0.8000000000000007 },\n { angle: 23.8, amplitude: -0.8000000000000007 },\n { angle: 25.2, amplitude: -1.200000000000001 },\n { angle: 25.5, amplitude: -0.8000000000000007 },\n { angle: 26.1, amplitude: -1.200000000000001 },\n { angle: 26.4, amplitude: -1.200000000000001 },\n { angle: 26.9, amplitude: -1.200000000000001 },\n { angle: 27, amplitude: -1.200000000000001 },\n { angle: 27.6, amplitude: -1.200000000000001 },\n { angle: 27.8, amplitude: -1.200000000000001 },\n { angle: 28.1, amplitude: -1.200000000000001 },\n { angle: 28.3, amplitude: -1.200000000000001 },\n { angle: 28.8, amplitude: -1.200000000000001 },\n { angle: 28.9, amplitude: -1.200000000000001 },\n { angle: 29.6, amplitude: -1.200000000000001 },\n { angle: 29.8, amplitude: -1.200000000000001 },\n { angle: 30.1, amplitude: -1.200000000000001 },\n { angle: 30.3, amplitude: -1.6000000000000014 },\n { angle: 30.5, amplitude: -1.6000000000000014 },\n { angle: 31, amplitude: -1.6000000000000014 },\n { angle: 31.5, amplitude: -1.6000000000000014 },\n { angle: 31.8, amplitude: -1.6000000000000014 },\n { angle: 32.5, amplitude: -1.6000000000000014 },\n { angle: 33.7, amplitude: -1.6000000000000014 },\n { angle: 33.8, amplitude: -1.6000000000000014 },\n { angle: 34, amplitude: -1.6000000000000014 },\n { angle: 34.3, amplitude: -1.6000000000000014 },\n { angle: 34.5, amplitude: -2.0000000000000018 },\n { angle: 36.5, amplitude: -2.400000000000002 },\n { angle: 36.7, amplitude: -2.400000000000002 },\n { angle: 36.9, amplitude: -2.400000000000002 },\n { angle: 37.6, amplitude: -2.799999999999998 },\n { angle: 37.7, amplitude: -2.799999999999998 },\n { angle: 37.9, amplitude: -2.799999999999998 },\n { angle: 39.1, amplitude: -3.1999999999999984 },\n { angle: 39.6, amplitude: -3.1999999999999984 },\n { angle: 39.9, amplitude: -3.1999999999999984 },\n { angle: 40.2, amplitude: -3.1999999999999984 },\n { angle: 40.7, amplitude: -3.5999999999999988 },\n { angle: 41.6, amplitude: -3.5999999999999988 },\n { angle: 41.7, amplitude: -3.5999999999999988 },\n { angle: 41.9, amplitude: -3.5999999999999988 },\n { angle: 42.1, amplitude: -3.5999999999999988 },\n { angle: 42.3, amplitude: -3.5999999999999988 },\n { angle: 42.8, amplitude: -3.999999999999999 },\n { angle: 43.9, amplitude: -3.999999999999999 },\n { angle: 44.2, amplitude: -3.999999999999999 },\n { angle: 44.5, amplitude: -4.3999999999999995 },\n { angle: 44.8, amplitude: -3.999999999999999 },\n { angle: 45.1, amplitude: -3.999999999999999 },\n { angle: 45.3, amplitude: -4.3999999999999995 },\n { angle: 46, amplitude: -4.3999999999999995 },\n { angle: 46.3, amplitude: -4.3999999999999995 },\n { angle: 47.1, amplitude: -4.3999999999999995 },\n { angle: 47.4, amplitude: -4.3999999999999995 },\n { angle: 47.7, amplitude: -4.3999999999999995 },\n { angle: 49.2, amplitude: -4.8 },\n { angle: 49.6, amplitude: -4.8 },\n { angle: 49.8, amplitude: -4.8 },\n { angle: 50.4, amplitude: -4.8 },\n { angle: 50.6, amplitude: -4.8 },\n { angle: 50.9, amplitude: -4.8 },\n { angle: 51.7, amplitude: -4.8 },\n { angle: 51.9, amplitude: -4.8 },\n { angle: 52.4, amplitude: -4.8 },\n { angle: 52.5, amplitude: -4.8 },\n { angle: 52.7, amplitude: -4.8 },\n { angle: 53.2, amplitude: -4.8 },\n { angle: 54.1, amplitude: -5.2 },\n { angle: 54.4, amplitude: -5.2 },\n { angle: 54.5, amplitude: -5.2 },\n { angle: 54.6, amplitude: -5.2 },\n { angle: 55.9, amplitude: -5.2 },\n { angle: 56.3, amplitude: -5.6000000000000005 },\n { angle: 56.7, amplitude: -5.6000000000000005 },\n { angle: 57, amplitude: -5.6000000000000005 },\n { angle: 57.2, amplitude: -5.6000000000000005 },\n { angle: 57.6, amplitude: -5.6000000000000005 },\n { angle: 58, amplitude: -5.6000000000000005 },\n { angle: 59.5, amplitude: -6.000000000000001 },\n { angle: 59.9, amplitude: -6.000000000000001 },\n { angle: 60.2, amplitude: -6.000000000000001 },\n { angle: 60.8, amplitude: -6.400000000000001 },\n { angle: 61.1, amplitude: -6.400000000000001 },\n { angle: 61.7, amplitude: -6.400000000000001 },\n { angle: 61.8, amplitude: -6.400000000000001 },\n { angle: 62.1, amplitude: -6.400000000000001 },\n { angle: 62.4, amplitude: -6.400000000000001 },\n { angle: 64.7, amplitude: -6.800000000000002 },\n { angle: 65, amplitude: -6.800000000000002 },\n { angle: 65.6, amplitude: -6.800000000000002 },\n { angle: 65.8, amplitude: -6.800000000000002 },\n { angle: 66.3, amplitude: -6.800000000000002 },\n { angle: 66.5, amplitude: -6.800000000000002 },\n { angle: 67.3, amplitude: -6.800000000000002 },\n { angle: 67.8, amplitude: -6.800000000000002 },\n { angle: 67.9, amplitude: -6.800000000000002 },\n { angle: 68.2, amplitude: -7.200000000000002 },\n { angle: 68.4, amplitude: -7.200000000000002 },\n { angle: 68.6, amplitude: -6.800000000000002 },\n { angle: 68.9, amplitude: -6.800000000000002 },\n { angle: 69.2, amplitude: -7.200000000000002 },\n { angle: 70.2, amplitude: -7.200000000000002 },\n { angle: 70.4, amplitude: -7.200000000000002 },\n { angle: 70.9, amplitude: -7.200000000000002 },\n { angle: 71.2, amplitude: -7.200000000000002 },\n { angle: 72.1, amplitude: -7.599999999999998 },\n { angle: 72.2, amplitude: -7.599999999999998 },\n { angle: 72.4, amplitude: -7.599999999999998 },\n { angle: 73.5, amplitude: -7.599999999999998 },\n { angle: 73.6, amplitude: -7.599999999999998 },\n { angle: 73.9, amplitude: -7.599999999999998 },\n { angle: 74.6, amplitude: -7.999999999999998 },\n { angle: 74.7, amplitude: -7.999999999999998 },\n { angle: 75.2, amplitude: -7.999999999999998 },\n { angle: 75.4, amplitude: -7.999999999999998 },\n { angle: 76, amplitude: -7.999999999999998 },\n { angle: 76.8, amplitude: -7.999999999999998 },\n { angle: 77.1, amplitude: -7.999999999999998 },\n { angle: 77.5, amplitude: -8.399999999999999 },\n { angle: 77.8, amplitude: -8.399999999999999 },\n { angle: 78, amplitude: -8.399999999999999 },\n { angle: 78.1, amplitude: -8.399999999999999 },\n { angle: 78.4, amplitude: -8.399999999999999 },\n { angle: 79.4, amplitude: -8.399999999999999 },\n { angle: 79.8, amplitude: -8.399999999999999 },\n { angle: 80.1, amplitude: -8.799999999999999 },\n { angle: 80.6, amplitude: -8.799999999999999 },\n { angle: 81.1, amplitude: -8.799999999999999 },\n { angle: 81.2, amplitude: -8.799999999999999 },\n { angle: 82.7, amplitude: -8.799999999999999 },\n { angle: 83.2, amplitude: -8.799999999999999 },\n { angle: 83.4, amplitude: -8.799999999999999 },\n { angle: 83.7, amplitude: -8.799999999999999 },\n { angle: 84.1, amplitude: -9.2 },\n { angle: 84.4, amplitude: -9.2 },\n { angle: 84.7, amplitude: -9.2 },\n { angle: 85.3, amplitude: -9.2 },\n { angle: 85.4, amplitude: -9.2 },\n { angle: 85.9, amplitude: -9.2 },\n { angle: 86.6, amplitude: -9.2 },\n { angle: 86.8, amplitude: -9.2 },\n { angle: 87.1, amplitude: -9.2 },\n { angle: 89.2, amplitude: -9.6 },\n { angle: 89.3, amplitude: -9.6 },\n { angle: 89.9, amplitude: -9.6 },\n { angle: 90, amplitude: -10 },\n { angle: 90.6, amplitude: -10 },\n { angle: 90.7, amplitude: -10 },\n { angle: 91.3, amplitude: -10 },\n { angle: 91.5, amplitude: -10 },\n { angle: 92, amplitude: -10 },\n { angle: 92.2, amplitude: -10.4 },\n { angle: 93.1, amplitude: -10.4 },\n { angle: 93.6, amplitude: -10.4 },\n { angle: 93.8, amplitude: -10.4 },\n { angle: 94.3, amplitude: -10.4 },\n { angle: 94.9, amplitude: -10.8 },\n { angle: 95.8, amplitude: -10.8 },\n { angle: 96.4, amplitude: -11.200000000000001 },\n { angle: 96.6, amplitude: -11.200000000000001 },\n { angle: 96.8, amplitude: -11.200000000000001 },\n { angle: 97.4, amplitude: -11.200000000000001 },\n { angle: 97.6, amplitude: -11.200000000000001 },\n { angle: 99, amplitude: -11.600000000000001 },\n { angle: 99.6, amplitude: -11.600000000000001 },\n { angle: 99.8, amplitude: -11.600000000000001 },\n { angle: 101.5, amplitude: -12.000000000000002 },\n { angle: 101.7, amplitude: -12.000000000000002 },\n { angle: 102.1, amplitude: -12.400000000000002 },\n { angle: 102.3, amplitude: -12.400000000000002 },\n { angle: 102.9, amplitude: -12.400000000000002 },\n { angle: 103.2, amplitude: -12.400000000000002 },\n { angle: 103.9, amplitude: -12.799999999999997 },\n { angle: 104.1, amplitude: -12.799999999999997 },\n { angle: 104.2, amplitude: -12.799999999999997 },\n { angle: 104.3, amplitude: -12.799999999999997 },\n { angle: 104.8, amplitude: -12.799999999999997 },\n { angle: 106.2, amplitude: -13.599999999999998 },\n { angle: 106.4, amplitude: -13.599999999999998 },\n { angle: 107, amplitude: -13.599999999999998 },\n { angle: 107.7, amplitude: -14 },\n { angle: 108.1, amplitude: -14 },\n { angle: 108.3, amplitude: -14.399999999999999 },\n { angle: 108.8, amplitude: -14.399999999999999 },\n { angle: 108.9, amplitude: -14.8 },\n { angle: 109.6, amplitude: -14.8 },\n { angle: 109.9, amplitude: -14.8 },\n { angle: 110.1, amplitude: -15.2 },\n { angle: 110.3, amplitude: -15.2 },\n { angle: 110.7, amplitude: -15.2 },\n { angle: 111, amplitude: -15.600000000000001 },\n { angle: 111.7, amplitude: -15.600000000000001 },\n { angle: 111.8, amplitude: -16 },\n { angle: 112.4, amplitude: -16 },\n { angle: 112.5, amplitude: -16 },\n { angle: 112.7, amplitude: -16 },\n { angle: 113.3, amplitude: -16.400000000000002 },\n { angle: 114, amplitude: -16.8 },\n { angle: 114.1, amplitude: -16.8 },\n { angle: 114.6, amplitude: -16.8 },\n { angle: 115.5, amplitude: -17.200000000000003 },\n { angle: 115.9, amplitude: -17.200000000000003 },\n { angle: 116.4, amplitude: -17.200000000000003 },\n { angle: 116.9, amplitude: -17.200000000000003 },\n { angle: 117.2, amplitude: -17.599999999999998 },\n { angle: 118.9, amplitude: -18 },\n { angle: 119.3, amplitude: -18 },\n { angle: 119.7, amplitude: -18.4 },\n { angle: 120.1, amplitude: -18.4 },\n { angle: 121.6, amplitude: -18.799999999999997 },\n { angle: 121.7, amplitude: -18.799999999999997 },\n { angle: 122.1, amplitude: -19.2 },\n { angle: 123.2, amplitude: -19.6 },\n { angle: 123.9, amplitude: -20 },\n { angle: 124.2, amplitude: -20 },\n { angle: 124.6, amplitude: -20.4 },\n { angle: 125.4, amplitude: -20.8 },\n { angle: 126.1, amplitude: -21.200000000000003 },\n { angle: 127.5, amplitude: -21.200000000000003 },\n { angle: 127.9, amplitude: -21.6 },\n { angle: 128.4, amplitude: -21.6 },\n { angle: 129, amplitude: -22 },\n { angle: 129.9, amplitude: -22.400000000000002 },\n { angle: 130.5, amplitude: -22.400000000000002 },\n { angle: 131.6, amplitude: -23.200000000000003 },\n { angle: 131.8, amplitude: -23.200000000000003 },\n { angle: 132.2, amplitude: -23.6 },\n { angle: 132.4, amplitude: -23.6 },\n { angle: 132.6, amplitude: -24 },\n { angle: 134, amplitude: -24.8 },\n { angle: 134.2, amplitude: -24.8 },\n { angle: 135, amplitude: -24.8 },\n { angle: 135.2, amplitude: -25.2 },\n { angle: 135.7, amplitude: -25.2 },\n { angle: 136.5, amplitude: -25.6 },\n { angle: 137.1, amplitude: -26 },\n { angle: 137.4, amplitude: -26 },\n { angle: 137.7, amplitude: -26.4 },\n { angle: 138.3, amplitude: -26.799999999999997 },\n { angle: 138.6, amplitude: -26.799999999999997 },\n { angle: 139.9, amplitude: -27.199999999999996 },\n { angle: 140.3, amplitude: -27.199999999999996 },\n { angle: 141, amplitude: -27.599999999999998 },\n { angle: 141.4, amplitude: -28 },\n { angle: 142.2, amplitude: -28 },\n { angle: 143, amplitude: -28.4 },\n { angle: 144.2, amplitude: -28.799999999999997 },\n { angle: 144.9, amplitude: -29.2 },\n { angle: 145.7, amplitude: -29.2 },\n { angle: 146.2, amplitude: -29.2 },\n { angle: 147.5, amplitude: -29.6 },\n { angle: 148.5, amplitude: -30 },\n { angle: 149.4, amplitude: -30 },\n { angle: 149.6, amplitude: -30.4 },\n { angle: 150, amplitude: -30.4 },\n { angle: 150.5, amplitude: -30.4 },\n { angle: 152, amplitude: -30.8 },\n { angle: 152.2, amplitude: -30.8 },\n { angle: 153.5, amplitude: -30.8 },\n { angle: 154.6, amplitude: -31.200000000000003 },\n { angle: 154.9, amplitude: -31.6 },\n { angle: 155.5, amplitude: -31.6 },\n { angle: 156.4, amplitude: -32 },\n { angle: 157, amplitude: -32 },\n { angle: 158, amplitude: -32 },\n { angle: 158.6, amplitude: -32 },\n { angle: 159.2, amplitude: -32 },\n { angle: 160.2, amplitude: -32.400000000000006 },\n { angle: 162.2, amplitude: -32.400000000000006 },\n { angle: 162.9, amplitude: -32.800000000000004 },\n { angle: 163.4, amplitude: -32.800000000000004 },\n { angle: 164.4, amplitude: -32.800000000000004 },\n { angle: 164.9, amplitude: -33.199999999999996 },\n { angle: 166.6, amplitude: -33.6 },\n { angle: 167.4, amplitude: -33.6 },\n { angle: 169.6, amplitude: -33.6 },\n { angle: 170.4, amplitude: -33.6 },\n { angle: 171.2, amplitude: -33.6 },\n { angle: 173.6, amplitude: -33.6 },\n { angle: 176, amplitude: -34 },\n { angle: 176.9, amplitude: -34 },\n { angle: 179.5, amplitude: -34 },\n { angle: 180.4, amplitude: -34 },\n { amplitude: -34, angle: 179.6 },\n { amplitude: -34, angle: 180.5 },\n { amplitude: -34, angle: 183.1 },\n { amplitude: -34, angle: 184 },\n { amplitude: -33.6, angle: 186.4 },\n { amplitude: -33.6, angle: 188.8 },\n { amplitude: -33.6, angle: 189.6 },\n { amplitude: -33.6, angle: 190.4 },\n { amplitude: -33.6, angle: 192.6 },\n { amplitude: -33.6, angle: 193.4 },\n { amplitude: -33.199999999999996, angle: 195.1 },\n { amplitude: -32.800000000000004, angle: 195.6 },\n { amplitude: -32.800000000000004, angle: 196.6 },\n { amplitude: -32.800000000000004, angle: 197.1 },\n { amplitude: -32.400000000000006, angle: 197.8 },\n { amplitude: -32.400000000000006, angle: 199.8 },\n { amplitude: -32, angle: 200.8 },\n { amplitude: -32, angle: 201.4 },\n { amplitude: -32, angle: 202 },\n { amplitude: -32, angle: 203 },\n { amplitude: -32, angle: 203.6 },\n { amplitude: -31.6, angle: 204.5 },\n { amplitude: -31.6, angle: 205.1 },\n { amplitude: -31.200000000000003, angle: 205.4 },\n { amplitude: -30.8, angle: 206.5 },\n { amplitude: -30.8, angle: 207.8 },\n { amplitude: -30.8, angle: 208 },\n { amplitude: -30.4, angle: 209.5 },\n { amplitude: -30.4, angle: 210 },\n { amplitude: -30.4, angle: 210.4 },\n { amplitude: -30, angle: 210.6 },\n { amplitude: -30, angle: 211.5 },\n { amplitude: -29.6, angle: 212.5 },\n { amplitude: -29.2, angle: 213.8 },\n { amplitude: -29.2, angle: 214.3 },\n { amplitude: -29.2, angle: 215.1 },\n { amplitude: -28.799999999999997, angle: 215.8 },\n { amplitude: -28.4, angle: 217 },\n { amplitude: -28, angle: 217.8 },\n { amplitude: -28, angle: 218.6 },\n { amplitude: -27.599999999999998, angle: 219 },\n { amplitude: -27.199999999999996, angle: 219.7 },\n { amplitude: -27.199999999999996, angle: 220.1 },\n { amplitude: -26.799999999999997, angle: 221.4 },\n { amplitude: -26.799999999999997, angle: 221.7 },\n { amplitude: -26.4, angle: 222.3 },\n { amplitude: -26, angle: 222.6 },\n { amplitude: -26, angle: 222.9 },\n { amplitude: -25.6, angle: 223.5 },\n { amplitude: -25.2, angle: 224.3 },\n { amplitude: -25.2, angle: 224.8 },\n { amplitude: -24.8, angle: 225 },\n { amplitude: -24.8, angle: 225.8 },\n { amplitude: -24.8, angle: 226 },\n { amplitude: -24, angle: 227.4 },\n { amplitude: -23.6, angle: 227.6 },\n { amplitude: -23.6, angle: 227.8 },\n { amplitude: -23.200000000000003, angle: 228.2 },\n { amplitude: -23.200000000000003, angle: 228.4 },\n { amplitude: -22.400000000000002, angle: 229.5 },\n { amplitude: -22.400000000000002, angle: 230.1 },\n { amplitude: -22, angle: 231 },\n { amplitude: -21.6, angle: 231.6 },\n { amplitude: -21.6, angle: 232.1 },\n { amplitude: -21.200000000000003, angle: 232.5 },\n { amplitude: -21.200000000000003, angle: 233.9 },\n { amplitude: -20.8, angle: 234.6 },\n { amplitude: -20.4, angle: 235.4 },\n { amplitude: -20, angle: 235.8 },\n { amplitude: -20, angle: 236.1 },\n { amplitude: -19.6, angle: 236.8 },\n { amplitude: -19.2, angle: 237.9 },\n { amplitude: -18.799999999999997, angle: 238.3 },\n { amplitude: -18.799999999999997, angle: 238.4 },\n { amplitude: -18.4, angle: 239.9 },\n { amplitude: -18.4, angle: 240.3 },\n { amplitude: -18, angle: 240.7 },\n { amplitude: -18, angle: 241.1 },\n { amplitude: -17.599999999999998, angle: 242.8 },\n { amplitude: -17.200000000000003, angle: 243.1 },\n { amplitude: -17.200000000000003, angle: 243.6 },\n { amplitude: -17.200000000000003, angle: 244.1 },\n { amplitude: -17.200000000000003, angle: 244.5 },\n { amplitude: -16.8, angle: 245.4 },\n { amplitude: -16.8, angle: 245.9 },\n { amplitude: -16.8, angle: 246 },\n { amplitude: -16.400000000000002, angle: 246.7 },\n { amplitude: -16, angle: 247.3 },\n { amplitude: -16, angle: 247.5 },\n { amplitude: -16, angle: 247.6 },\n { amplitude: -16, angle: 248.2 },\n { amplitude: -15.600000000000001, angle: 248.3 },\n { amplitude: -15.600000000000001, angle: 249 },\n { amplitude: -15.2, angle: 249.3 },\n { amplitude: -15.2, angle: 249.7 },\n { amplitude: -15.2, angle: 249.9 },\n { amplitude: -14.8, angle: 250.1 },\n { amplitude: -14.8, angle: 250.4 },\n { amplitude: -14.8, angle: 251.1 },\n { amplitude: -14.399999999999999, angle: 251.2 },\n { amplitude: -14.399999999999999, angle: 251.7 },\n { amplitude: -14, angle: 251.9 },\n { amplitude: -14, angle: 252.3 },\n { amplitude: -13.599999999999998, angle: 253 },\n { amplitude: -13.599999999999998, angle: 253.6 },\n { amplitude: -13.599999999999998, angle: 253.8 },\n { amplitude: -12.799999999999997, angle: 255.2 },\n { amplitude: -12.799999999999997, angle: 255.7 },\n { amplitude: -12.799999999999997, angle: 255.8 },\n { amplitude: -12.799999999999997, angle: 255.9 },\n { amplitude: -12.799999999999997, angle: 256.1 },\n { amplitude: -12.400000000000002, angle: 256.8 },\n { amplitude: -12.400000000000002, angle: 257.1 },\n { amplitude: -12.400000000000002, angle: 257.7 },\n { amplitude: -12.400000000000002, angle: 257.9 },\n { amplitude: -12.000000000000002, angle: 258.3 },\n { amplitude: -12.000000000000002, angle: 258.5 },\n { amplitude: -11.600000000000001, angle: 260.2 },\n { amplitude: -11.600000000000001, angle: 260.4 },\n { amplitude: -11.600000000000001, angle: 261 },\n { amplitude: -11.200000000000001, angle: 262.4 },\n { amplitude: -11.200000000000001, angle: 262.6 },\n { amplitude: -11.200000000000001, angle: 263.2 },\n { amplitude: -11.200000000000001, angle: 263.4 },\n { amplitude: -11.200000000000001, angle: 263.6 },\n { amplitude: -10.8, angle: 264.2 },\n { amplitude: -10.8, angle: 265.1 },\n { amplitude: -10.4, angle: 265.7 },\n { amplitude: -10.4, angle: 266.2 },\n { amplitude: -10.4, angle: 266.4 },\n { amplitude: -10.4, angle: 266.9 },\n { amplitude: -10.4, angle: 267.8 },\n { amplitude: -10, angle: 268 },\n { amplitude: -10, angle: 268.5 },\n { amplitude: -10, angle: 268.7 },\n { amplitude: -10, angle: 269.3 },\n { amplitude: -10, angle: 269.4 },\n { amplitude: -10, angle: 270 },\n { amplitude: -9.6, angle: 270.1 },\n { amplitude: -9.6, angle: 270.7 },\n { amplitude: -9.6, angle: 270.8 },\n { amplitude: -9.2, angle: 272.9 },\n { amplitude: -9.2, angle: 273.2 },\n { amplitude: -9.2, angle: 273.4 },\n { amplitude: -9.2, angle: 274.1 },\n { amplitude: -9.2, angle: 274.6 },\n { amplitude: -9.2, angle: 274.7 },\n { amplitude: -9.2, angle: 275.3 },\n { amplitude: -9.2, angle: 275.6 },\n { amplitude: -9.2, angle: 275.9 },\n { amplitude: -8.799999999999999, angle: 276.3 },\n { amplitude: -8.799999999999999, angle: 276.6 },\n { amplitude: -8.799999999999999, angle: 276.8 },\n { amplitude: -8.799999999999999, angle: 277.3 },\n { amplitude: -8.799999999999999, angle: 278.8 },\n { amplitude: -8.799999999999999, angle: 278.9 },\n { amplitude: -8.799999999999999, angle: 279.4 },\n { amplitude: -8.799999999999999, angle: 279.9 },\n { amplitude: -8.399999999999999, angle: 280.2 },\n { amplitude: -8.399999999999999, angle: 280.6 },\n { amplitude: -8.399999999999999, angle: 281.6 },\n { amplitude: -8.399999999999999, angle: 281.9 },\n { amplitude: -8.399999999999999, angle: 282 },\n { amplitude: -8.399999999999999, angle: 282.2 },\n { amplitude: -8.399999999999999, angle: 282.5 },\n { amplitude: -7.999999999999998, angle: 282.9 },\n { amplitude: -7.999999999999998, angle: 283.2 },\n { amplitude: -7.999999999999998, angle: 284 },\n { amplitude: -7.999999999999998, angle: 284.6 },\n { amplitude: -7.999999999999998, angle: 284.8 },\n { amplitude: -7.999999999999998, angle: 285.3 },\n { amplitude: -7.999999999999998, angle: 285.4 },\n { amplitude: -7.599999999999998, angle: 286.1 },\n { amplitude: -7.599999999999998, angle: 286.4 },\n { amplitude: -7.599999999999998, angle: 286.5 },\n { amplitude: -7.599999999999998, angle: 287.6 },\n { amplitude: -7.599999999999998, angle: 287.8 },\n { amplitude: -7.599999999999998, angle: 287.9 },\n { amplitude: -7.200000000000002, angle: 288.8 },\n { amplitude: -7.200000000000002, angle: 289.1 },\n { amplitude: -7.200000000000002, angle: 289.6 },\n { amplitude: -7.200000000000002, angle: 289.8 },\n { amplitude: -7.200000000000002, angle: 290.8 },\n { amplitude: -6.800000000000002, angle: 291.1 },\n { amplitude: -6.800000000000002, angle: 291.4 },\n { amplitude: -7.200000000000002, angle: 291.6 },\n { amplitude: -7.200000000000002, angle: 291.8 },\n { amplitude: -6.800000000000002, angle: 292.1 },\n { amplitude: -6.800000000000002, angle: 292.2 },\n { amplitude: -6.800000000000002, angle: 292.7 },\n { amplitude: -6.800000000000002, angle: 293.5 },\n { amplitude: -6.800000000000002, angle: 293.7 },\n { amplitude: -6.800000000000002, angle: 294.2 },\n { amplitude: -6.800000000000002, angle: 294.4 },\n { amplitude: -6.800000000000002, angle: 295 },\n { amplitude: -6.800000000000002, angle: 295.3 },\n { amplitude: -6.400000000000001, angle: 297.6 },\n { amplitude: -6.400000000000001, angle: 297.9 },\n { amplitude: -6.400000000000001, angle: 298.2 },\n { amplitude: -6.400000000000001, angle: 298.3 },\n { amplitude: -6.400000000000001, angle: 298.9 },\n { amplitude: -6.400000000000001, angle: 299.2 },\n { amplitude: -6.000000000000001, angle: 299.8 },\n { amplitude: -6.000000000000001, angle: 300.1 },\n { amplitude: -6.000000000000001, angle: 300.5 },\n { amplitude: -5.6000000000000005, angle: 302 },\n { amplitude: -5.6000000000000005, angle: 302.4 },\n { amplitude: -5.6000000000000005, angle: 302.8 },\n { amplitude: -5.6000000000000005, angle: 303 },\n { amplitude: -5.6000000000000005, angle: 303.3 },\n { amplitude: -5.6000000000000005, angle: 303.7 },\n { amplitude: -5.2, angle: 304.1 },\n { amplitude: -5.2, angle: 305.4 },\n { amplitude: -5.2, angle: 305.5 },\n { amplitude: -5.2, angle: 305.6 },\n { amplitude: -5.2, angle: 305.9 },\n { amplitude: -4.8, angle: 306.8 },\n { amplitude: -4.8, angle: 307.3 },\n { amplitude: -4.8, angle: 307.5 },\n { amplitude: -4.8, angle: 307.6 },\n { amplitude: -4.8, angle: 308.1 },\n { amplitude: -4.8, angle: 308.3 },\n { amplitude: -4.8, angle: 309.1 },\n { amplitude: -4.8, angle: 309.4 },\n { amplitude: -4.8, angle: 309.6 },\n { amplitude: -4.8, angle: 310.2 },\n { amplitude: -4.8, angle: 310.4 },\n { amplitude: -4.8, angle: 310.8 },\n { amplitude: -4.3999999999999995, angle: 312.3 },\n { amplitude: -4.3999999999999995, angle: 312.6 },\n { amplitude: -4.3999999999999995, angle: 312.9 },\n { amplitude: -4.3999999999999995, angle: 313.7 },\n { amplitude: -4.3999999999999995, angle: 314 },\n { amplitude: -4.3999999999999995, angle: 314.7 },\n { amplitude: -3.999999999999999, angle: 314.9 },\n { amplitude: -3.999999999999999, angle: 315.2 },\n { amplitude: -4.3999999999999995, angle: 315.5 },\n { amplitude: -3.999999999999999, angle: 315.8 },\n { amplitude: -3.999999999999999, angle: 316.1 },\n { amplitude: -3.999999999999999, angle: 317.2 },\n { amplitude: -3.5999999999999988, angle: 317.7 },\n { amplitude: -3.5999999999999988, angle: 317.9 },\n { amplitude: -3.5999999999999988, angle: 318.1 },\n { amplitude: -3.5999999999999988, angle: 318.3 },\n { amplitude: -3.5999999999999988, angle: 318.4 },\n { amplitude: -3.5999999999999988, angle: 319.3 },\n { amplitude: -3.1999999999999984, angle: 319.8 },\n { amplitude: -3.1999999999999984, angle: 320.1 },\n { amplitude: -3.1999999999999984, angle: 320.4 },\n { amplitude: -3.1999999999999984, angle: 320.9 },\n { amplitude: -2.799999999999998, angle: 322.1 },\n { amplitude: -2.799999999999998, angle: 322.3 },\n { amplitude: -2.799999999999998, angle: 322.4 },\n { amplitude: -2.400000000000002, angle: 323.1 },\n { amplitude: -2.400000000000002, angle: 323.3 },\n { amplitude: -2.400000000000002, angle: 323.5 },\n { amplitude: -2.0000000000000018, angle: 325.5 },\n { amplitude: -1.6000000000000014, angle: 325.7 },\n { amplitude: -1.6000000000000014, angle: 326 },\n { amplitude: -1.6000000000000014, angle: 326.2 },\n { amplitude: -1.6000000000000014, angle: 326.3 },\n { amplitude: -1.6000000000000014, angle: 327.5 },\n { amplitude: -1.6000000000000014, angle: 328.2 },\n { amplitude: -1.6000000000000014, angle: 328.5 },\n { amplitude: -1.6000000000000014, angle: 329 },\n { amplitude: -1.6000000000000014, angle: 329.5 },\n { amplitude: -1.6000000000000014, angle: 329.7 },\n { amplitude: -1.200000000000001, angle: 329.9 },\n { amplitude: -1.200000000000001, angle: 330.2 },\n { amplitude: -1.200000000000001, angle: 330.4 },\n { amplitude: -1.200000000000001, angle: 331.1 },\n { amplitude: -1.200000000000001, angle: 331.2 },\n { amplitude: -1.200000000000001, angle: 331.7 },\n { amplitude: -1.200000000000001, angle: 331.9 },\n { amplitude: -1.200000000000001, angle: 332.2 },\n { amplitude: -1.200000000000001, angle: 332.4 },\n { amplitude: -1.200000000000001, angle: 333 },\n { amplitude: -1.200000000000001, angle: 333.1 },\n { amplitude: -1.200000000000001, angle: 333.6 },\n { amplitude: -1.200000000000001, angle: 333.9 },\n { amplitude: -0.8000000000000007, angle: 334.5 },\n { amplitude: -1.200000000000001, angle: 334.8 },\n { amplitude: -0.8000000000000007, angle: 336.2 },\n { amplitude: -0.8000000000000007, angle: 336.7 },\n { amplitude: -0.8000000000000007, angle: 337 },\n { amplitude: -0.8000000000000007, angle: 337.3 },\n { amplitude: -0.8000000000000007, angle: 337.4 },\n { amplitude: -0.8000000000000007, angle: 337.5 },\n { amplitude: -0.8000000000000007, angle: 337.9 },\n { amplitude: -0.8000000000000007, angle: 338 },\n { amplitude: -0.8000000000000007, angle: 338.1 },\n { amplitude: -0.8000000000000007, angle: 338.2 },\n { amplitude: -0.8000000000000007, angle: 339.1 },\n { amplitude: -0.8000000000000007, angle: 339.3 },\n { amplitude: -0.40000000000000036, angle: 339.5 },\n { amplitude: -0.40000000000000036, angle: 339.9 },\n { amplitude: -0.40000000000000036, angle: 340.5 },\n { amplitude: -0.40000000000000036, angle: 340.9 },\n { amplitude: -0.40000000000000036, angle: 341.1 },\n { amplitude: -0.40000000000000036, angle: 341.3 },\n { amplitude: -0.40000000000000036, angle: 341.7 },\n { amplitude: 0, angle: 341.9 },\n { amplitude: 0, angle: 342.2 },\n { amplitude: 0, angle: 342.4 },\n { amplitude: 0, angle: 342.8 },\n { amplitude: 0, angle: 343 },\n { amplitude: 0, angle: 343.1 },\n { amplitude: 0, angle: 343.4 },\n { amplitude: 0, angle: 343.5 },\n { amplitude: 0, angle: 343.7 },\n { amplitude: 0, angle: 344 },\n { amplitude: 0, angle: 344.7 },\n { amplitude: 0, angle: 345 },\n { amplitude: 0, angle: 345.5 },\n { amplitude: -0.40000000000000036, angle: 346 },\n { amplitude: -0.40000000000000036, angle: 346.3 },\n { amplitude: -0.40000000000000036, angle: 346.5 },\n { amplitude: -0.40000000000000036, angle: 347.1 },\n { amplitude: -0.40000000000000036, angle: 347.2 },\n { amplitude: -0.40000000000000036, angle: 347.6 },\n { amplitude: -0.40000000000000036, angle: 347.9 },\n { amplitude: -0.40000000000000036, angle: 348.2 },\n { amplitude: -0.40000000000000036, angle: 348.7 },\n { amplitude: -0.40000000000000036, angle: 348.8 },\n { amplitude: -0.40000000000000036, angle: 349.3 },\n { amplitude: -0.40000000000000036, angle: 349.9 },\n { amplitude: -0.40000000000000036, angle: 350.5 },\n { amplitude: -0.40000000000000036, angle: 350.6 },\n { amplitude: -0.40000000000000036, angle: 351 },\n { amplitude: -0.40000000000000036, angle: 351.6 },\n { amplitude: -0.40000000000000036, angle: 351.7 },\n { amplitude: -0.40000000000000036, angle: 352.5 },\n { amplitude: 0, angle: 352.8 },\n { amplitude: 0, angle: 353.4 },\n { amplitude: 0, angle: 353.9 },\n { amplitude: 0, angle: 355.4 },\n { amplitude: 0, angle: 356.6 },\n { amplitude: 0, angle: 357 },\n { amplitude: 0, angle: 357.1 },\n { amplitude: 0, angle: 357.6 },\n { amplitude: 0, angle: 357.9 },\n { amplitude: 0, angle: 358.9 },\n { amplitude: 0, angle: 359.2 },\n { amplitude: 0, angle: 359.5 },\n { amplitude: 0, angle: 360 },\n ],\n },\n {\n name: '1KHz',\n data: [\n { angle: 0, amplitude: -0.40000000000000036 },\n { angle: 0.9, amplitude: -0.40000000000000036 },\n { angle: 1.5, amplitude: -0.40000000000000036 },\n { angle: 1.9, amplitude: -0.40000000000000036 },\n { angle: 2, amplitude: -0.40000000000000036 },\n { angle: 2.4, amplitude: 0 },\n { angle: 2.7, amplitude: 0 },\n { angle: 2.9, amplitude: 0 },\n { angle: 3.1, amplitude: 0 },\n { angle: 3.2, amplitude: 0 },\n { angle: 3.5, amplitude: 0 },\n { angle: 3.6, amplitude: -0.40000000000000036 },\n { angle: 4, amplitude: -0.40000000000000036 },\n { angle: 4.3, amplitude: -0.40000000000000036 },\n { angle: 4.7, amplitude: -0.40000000000000036 },\n { angle: 5.2, amplitude: -0.40000000000000036 },\n { angle: 6.4, amplitude: -0.40000000000000036 },\n { angle: 7, amplitude: -0.40000000000000036 },\n { angle: 7.4, amplitude: -0.40000000000000036 },\n { angle: 7.5, amplitude: -0.8000000000000007 },\n { angle: 7.9, amplitude: -0.40000000000000036 },\n { angle: 8.1, amplitude: -0.8000000000000007 },\n { angle: 8.4, amplitude: -0.8000000000000007 },\n { angle: 8.5, amplitude: -0.8000000000000007 },\n { angle: 8.9, amplitude: -0.8000000000000007 },\n { angle: 9.1, amplitude: -0.8000000000000007 },\n { angle: 9.2, amplitude: -0.8000000000000007 },\n { angle: 9.6, amplitude: -0.8000000000000007 },\n { angle: 10, amplitude: -0.8000000000000007 },\n { angle: 10.4, amplitude: -0.8000000000000007 },\n { angle: 10.8, amplitude: -0.8000000000000007 },\n { angle: 11.2, amplitude: -0.8000000000000007 },\n { angle: 11.3, amplitude: -0.8000000000000007 },\n { angle: 11.4, amplitude: -0.8000000000000007 },\n { angle: 11.7, amplitude: -0.8000000000000007 },\n { angle: 11.8, amplitude: -0.8000000000000007 },\n { angle: 12, amplitude: -0.8000000000000007 },\n { angle: 12.4, amplitude: -0.8000000000000007 },\n { angle: 12.8, amplitude: -0.8000000000000007 },\n { angle: 13.1, amplitude: -0.8000000000000007 },\n { angle: 13.5, amplitude: -0.8000000000000007 },\n { angle: 13.9, amplitude: -0.8000000000000007 },\n { angle: 14.2, amplitude: -0.8000000000000007 },\n { angle: 14.5, amplitude: -0.8000000000000007 },\n { angle: 14.7, amplitude: -0.8000000000000007 },\n { angle: 15.1, amplitude: -0.8000000000000007 },\n { angle: 15.6, amplitude: -0.8000000000000007 },\n { angle: 16, amplitude: -0.40000000000000036 },\n { angle: 16.1, amplitude: -0.40000000000000036 },\n { angle: 16.5, amplitude: -0.40000000000000036 },\n { angle: 16.6, amplitude: -0.40000000000000036 },\n { angle: 16.7, amplitude: -0.40000000000000036 },\n { angle: 17.1, amplitude: -0.40000000000000036 },\n { angle: 17.3, amplitude: -0.40000000000000036 },\n { angle: 17.7, amplitude: -0.40000000000000036 },\n { angle: 18.2, amplitude: -0.40000000000000036 },\n { angle: 18.8, amplitude: -0.40000000000000036 },\n { angle: 19, amplitude: -0.40000000000000036 },\n { angle: 19.1, amplitude: -0.40000000000000036 },\n { angle: 19.5, amplitude: -0.40000000000000036 },\n { angle: 19.7, amplitude: -0.40000000000000036 },\n { angle: 20, amplitude: -0.40000000000000036 },\n { angle: 20.2, amplitude: -0.40000000000000036 },\n { angle: 20.6, amplitude: -0.40000000000000036 },\n { angle: 20.7, amplitude: -0.40000000000000036 },\n { angle: 20.8, amplitude: -0.40000000000000036 },\n { angle: 21.3, amplitude: -0.40000000000000036 },\n { angle: 21.9, amplitude: -0.8000000000000007 },\n { angle: 22, amplitude: -0.8000000000000007 },\n { angle: 22.3, amplitude: -0.40000000000000036 },\n { angle: 22.5, amplitude: -0.40000000000000036 },\n { angle: 22.8, amplitude: -0.40000000000000036 },\n { angle: 23.2, amplitude: -0.8000000000000007 },\n { angle: 23.4, amplitude: -0.40000000000000036 },\n { angle: 23.6, amplitude: -0.8000000000000007 },\n { angle: 23.7, amplitude: -0.40000000000000036 },\n { angle: 24, amplitude: -0.40000000000000036 },\n { angle: 24.3, amplitude: -0.8000000000000007 },\n { angle: 24.4, amplitude: -0.8000000000000007 },\n { angle: 24.8, amplitude: -0.8000000000000007 },\n { angle: 25.2, amplitude: -0.8000000000000007 },\n { angle: 26, amplitude: -0.8000000000000007 },\n { angle: 26.2, amplitude: -0.8000000000000007 },\n { angle: 26.7, amplitude: -0.8000000000000007 },\n { angle: 26.8, amplitude: -0.8000000000000007 },\n { angle: 27.1, amplitude: -0.8000000000000007 },\n { angle: 27.3, amplitude: -0.8000000000000007 },\n { angle: 27.4, amplitude: -0.8000000000000007 },\n { angle: 27.8, amplitude: -0.8000000000000007 },\n { angle: 28, amplitude: -0.8000000000000007 },\n { angle: 28.1, amplitude: -0.8000000000000007 },\n { angle: 28.2, amplitude: -1.200000000000001 },\n { angle: 28.7, amplitude: -1.200000000000001 },\n { angle: 28.8, amplitude: -0.8000000000000007 },\n { angle: 29, amplitude: -1.200000000000001 },\n { angle: 29.4, amplitude: -1.200000000000001 },\n { angle: 29.6, amplitude: -1.200000000000001 },\n { angle: 29.7, amplitude: -1.200000000000001 },\n { angle: 30.2, amplitude: -1.200000000000001 },\n { angle: 30.8, amplitude: -1.6000000000000014 },\n { angle: 31, amplitude: -1.6000000000000014 },\n { angle: 31.1, amplitude: -1.6000000000000014 },\n { angle: 31.3, amplitude: -1.6000000000000014 },\n { angle: 31.4, amplitude: -1.6000000000000014 },\n { angle: 31.8, amplitude: -2.0000000000000018 },\n { angle: 32.3, amplitude: -2.0000000000000018 },\n { angle: 32.7, amplitude: -2.0000000000000018 },\n { angle: 33, amplitude: -2.400000000000002 },\n { angle: 33.2, amplitude: -2.400000000000002 },\n { angle: 33.8, amplitude: -2.400000000000002 },\n { angle: 34.1, amplitude: -2.400000000000002 },\n { angle: 34.4, amplitude: -2.400000000000002 },\n { angle: 34.5, amplitude: -2.400000000000002 },\n { angle: 34.8, amplitude: -2.799999999999998 },\n { angle: 35.1, amplitude: -2.799999999999998 },\n { angle: 35.6, amplitude: -2.799999999999998 },\n { angle: 35.8, amplitude: -2.799999999999998 },\n { angle: 35.9, amplitude: -2.799999999999998 },\n { angle: 36.3, amplitude: -2.799999999999998 },\n { angle: 36.7, amplitude: -3.1999999999999984 },\n { angle: 36.9, amplitude: -3.1999999999999984 },\n { angle: 37.2, amplitude: -3.1999999999999984 },\n { angle: 37.4, amplitude: -3.1999999999999984 },\n { angle: 37.6, amplitude: -3.1999999999999984 },\n { angle: 37.8, amplitude: -3.1999999999999984 },\n { angle: 38.2, amplitude: -3.1999999999999984 },\n { angle: 38.4, amplitude: -3.1999999999999984 },\n { angle: 39, amplitude: -3.1999999999999984 },\n { angle: 39.1, amplitude: -3.5999999999999988 },\n { angle: 39.3, amplitude: -3.5999999999999988 },\n { angle: 39.5, amplitude: -3.5999999999999988 },\n { angle: 39.6, amplitude: -3.5999999999999988 },\n { angle: 39.9, amplitude: -3.5999999999999988 },\n { angle: 40.1, amplitude: -3.5999999999999988 },\n { angle: 40.7, amplitude: -3.5999999999999988 },\n { angle: 41.3, amplitude: -3.5999999999999988 },\n { angle: 41.8, amplitude: -3.5999999999999988 },\n { angle: 42.1, amplitude: -3.5999999999999988 },\n { angle: 42.4, amplitude: -3.5999999999999988 },\n { angle: 42.6, amplitude: -3.5999999999999988 },\n { angle: 42.8, amplitude: -3.5999999999999988 },\n { angle: 43, amplitude: -3.5999999999999988 },\n { angle: 43.1, amplitude: -3.999999999999999 },\n { angle: 43.3, amplitude: -3.5999999999999988 },\n { angle: 43.5, amplitude: -3.999999999999999 },\n { angle: 43.6, amplitude: -3.999999999999999 },\n { angle: 43.7, amplitude: -3.999999999999999 },\n { angle: 44, amplitude: -3.999999999999999 },\n { angle: 44.2, amplitude: -3.999999999999999 },\n { angle: 44.7, amplitude: -3.999999999999999 },\n { angle: 45.1, amplitude: -3.999999999999999 },\n { angle: 45.3, amplitude: -4.3999999999999995 },\n { angle: 45.6, amplitude: -4.3999999999999995 },\n { angle: 45.8, amplitude: -4.3999999999999995 },\n { angle: 46.1, amplitude: -4.3999999999999995 },\n { angle: 46.3, amplitude: -4.3999999999999995 },\n { angle: 46.8, amplitude: -4.3999999999999995 },\n { angle: 47, amplitude: -4.3999999999999995 },\n { angle: 47.2, amplitude: -4.3999999999999995 },\n { angle: 47.4, amplitude: -4.3999999999999995 },\n { angle: 47.8, amplitude: -4.3999999999999995 },\n { angle: 48.2, amplitude: -4.3999999999999995 },\n { angle: 48.4, amplitude: -4.3999999999999995 },\n { angle: 49.2, amplitude: -4.3999999999999995 },\n { angle: 49.6, amplitude: -4.8 },\n { angle: 50, amplitude: -4.8 },\n { angle: 50.3, amplitude: -4.8 },\n { angle: 50.7, amplitude: -4.8 },\n { angle: 50.9, amplitude: -4.3999999999999995 },\n { angle: 51.2, amplitude: -4.3999999999999995 },\n { angle: 51.5, amplitude: -4.8 },\n { angle: 51.9, amplitude: -4.8 },\n { angle: 52, amplitude: -4.8 },\n { angle: 52.6, amplitude: -4.8 },\n { angle: 52.7, amplitude: -4.8 },\n { angle: 52.9, amplitude: -4.3999999999999995 },\n { angle: 53, amplitude: -4.8 },\n { angle: 53.3, amplitude: -4.8 },\n { angle: 53.5, amplitude: -4.8 },\n { angle: 53.8, amplitude: -4.3999999999999995 },\n { angle: 54.3, amplitude: -4.8 },\n { angle: 55, amplitude: -4.8 },\n { angle: 55.2, amplitude: -4.8 },\n { angle: 55.7, amplitude: -4.8 },\n { angle: 56, amplitude: -4.8 },\n { angle: 56.4, amplitude: -4.8 },\n { angle: 56.9, amplitude: -4.8 },\n { angle: 57.7, amplitude: -4.8 },\n { angle: 57.8, amplitude: -4.8 },\n { angle: 57.9, amplitude: -4.8 },\n { angle: 58.5, amplitude: -4.8 },\n { angle: 58.9, amplitude: -4.8 },\n { angle: 59.2, amplitude: -4.8 },\n { angle: 59.5, amplitude: -4.8 },\n { angle: 59.8, amplitude: -5.2 },\n { angle: 60.1, amplitude: -5.2 },\n { angle: 60.2, amplitude: -5.2 },\n { angle: 60.4, amplitude: -5.2 },\n { angle: 60.6, amplitude: -5.2 },\n { angle: 60.9, amplitude: -5.2 },\n { angle: 61.3, amplitude: -5.2 },\n { angle: 61.6, amplitude: -5.2 },\n { angle: 61.9, amplitude: -5.2 },\n { angle: 62.2, amplitude: -5.6000000000000005 },\n { angle: 62.5, amplitude: -5.6000000000000005 },\n { angle: 62.6, amplitude: -5.6000000000000005 },\n { angle: 63.1, amplitude: -5.6000000000000005 },\n { angle: 63.2, amplitude: -5.6000000000000005 },\n { angle: 63.6, amplitude: -6.000000000000001 },\n { angle: 63.9, amplitude: -6.000000000000001 },\n { angle: 64, amplitude: -5.6000000000000005 },\n { angle: 64.3, amplitude: -6.000000000000001 },\n { angle: 64.5, amplitude: -5.6000000000000005 },\n { angle: 64.7, amplitude: -6.000000000000001 },\n { angle: 64.9, amplitude: -6.000000000000001 },\n { angle: 65.1, amplitude: -6.000000000000001 },\n { angle: 65.2, amplitude: -6.000000000000001 },\n { angle: 65.6, amplitude: -6.000000000000001 },\n { angle: 65.7, amplitude: -6.000000000000001 },\n { angle: 66, amplitude: -6.000000000000001 },\n { angle: 66.3, amplitude: -6.000000000000001 },\n { angle: 66.4, amplitude: -6.000000000000001 },\n { angle: 66.9, amplitude: -6.000000000000001 },\n { angle: 67, amplitude: -6.000000000000001 },\n { angle: 67.2, amplitude: -6.000000000000001 },\n { angle: 67.5, amplitude: -6.000000000000001 },\n { angle: 68, amplitude: -6.400000000000001 },\n { angle: 68.3, amplitude: -6.400000000000001 },\n { angle: 68.8, amplitude: -6.400000000000001 },\n { angle: 69.4, amplitude: -6.400000000000001 },\n { angle: 69.6, amplitude: -6.400000000000001 },\n { angle: 70, amplitude: -6.800000000000002 },\n { angle: 70.6, amplitude: -6.800000000000002 },\n { angle: 70.8, amplitude: -6.800000000000002 },\n { angle: 71.1, amplitude: -6.800000000000002 },\n { angle: 71.2, amplitude: -6.800000000000002 },\n { angle: 71.4, amplitude: -6.800000000000002 },\n { angle: 71.7, amplitude: -6.800000000000002 },\n { angle: 71.8, amplitude: -6.800000000000002 },\n { angle: 72, amplitude: -7.200000000000002 },\n { angle: 72.3, amplitude: -7.200000000000002 },\n { angle: 72.6, amplitude: -7.200000000000002 },\n { angle: 73.2, amplitude: -7.200000000000002 },\n { angle: 73.8, amplitude: -7.200000000000002 },\n { angle: 74.1, amplitude: -7.200000000000002 },\n { angle: 74.8, amplitude: -7.200000000000002 },\n { angle: 75, amplitude: -7.200000000000002 },\n { angle: 75.5, amplitude: -7.200000000000002 },\n { angle: 75.6, amplitude: -7.599999999999998 },\n { angle: 75.8, amplitude: -7.599999999999998 },\n { angle: 76.1, amplitude: -7.599999999999998 },\n { angle: 76.3, amplitude: -7.599999999999998 },\n { angle: 76.4, amplitude: -7.599999999999998 },\n { angle: 76.8, amplitude: -7.599999999999998 },\n { angle: 76.9, amplitude: -7.599999999999998 },\n { angle: 77.4, amplitude: -7.599999999999998 },\n { angle: 77.6, amplitude: -7.599999999999998 },\n { angle: 78, amplitude: -7.599999999999998 },\n { angle: 78.2, amplitude: -7.599999999999998 },\n { angle: 78.4, amplitude: -7.599999999999998 },\n { angle: 78.7, amplitude: -7.599999999999998 },\n { angle: 78.8, amplitude: -7.599999999999998 },\n { angle: 79.3, amplitude: -7.599999999999998 },\n { angle: 79.5, amplitude: -7.999999999999998 },\n { angle: 79.6, amplitude: -7.999999999999998 },\n { angle: 80.1, amplitude: -7.999999999999998 },\n { angle: 80.3, amplitude: -7.999999999999998 },\n { angle: 80.6, amplitude: -7.999999999999998 },\n { angle: 80.9, amplitude: -7.999999999999998 },\n { angle: 81.3, amplitude: -7.999999999999998 },\n { angle: 81.4, amplitude: -7.999999999999998 },\n { angle: 81.6, amplitude: -7.999999999999998 },\n { angle: 81.9, amplitude: -7.999999999999998 },\n { angle: 82.2, amplitude: -7.999999999999998 },\n { angle: 82.6, amplitude: -7.999999999999998 },\n { angle: 82.9, amplitude: -7.999999999999998 },\n { angle: 83.2, amplitude: -7.999999999999998 },\n { angle: 83.4, amplitude: -7.999999999999998 },\n { angle: 83.6, amplitude: -7.999999999999998 },\n { angle: 83.9, amplitude: -7.999999999999998 },\n { angle: 84.2, amplitude: -7.999999999999998 },\n { angle: 84.7, amplitude: -8.399999999999999 },\n { angle: 84.9, amplitude: -8.399999999999999 },\n { angle: 85.2, amplitude: -8.399999999999999 },\n { angle: 85.5, amplitude: -8.399999999999999 },\n { angle: 86, amplitude: -8.399999999999999 },\n { angle: 86.2, amplitude: -8.399999999999999 },\n { angle: 86.5, amplitude: -8.399999999999999 },\n { angle: 86.8, amplitude: -8.399999999999999 },\n { angle: 87.2, amplitude: -8.799999999999999 },\n { angle: 87.5, amplitude: -8.799999999999999 },\n { angle: 87.8, amplitude: -8.799999999999999 },\n { angle: 88.2, amplitude: -8.799999999999999 },\n { angle: 88.7, amplitude: -9.2 },\n { angle: 88.8, amplitude: -9.2 },\n { angle: 89.4, amplitude: -9.2 },\n { angle: 89.5, amplitude: -9.2 },\n { angle: 89.9, amplitude: -9.6 },\n { angle: 90.2, amplitude: -9.6 },\n { angle: 90.7, amplitude: -9.6 },\n { angle: 90.9, amplitude: -9.6 },\n { angle: 91.4, amplitude: -10 },\n { angle: 92, amplitude: -10 },\n { angle: 92.2, amplitude: -10 },\n { angle: 92.7, amplitude: -10.4 },\n { angle: 92.9, amplitude: -10.4 },\n { angle: 93.1, amplitude: -10.4 },\n { angle: 93.4, amplitude: -10.4 },\n { angle: 93.6, amplitude: -10.4 },\n { angle: 93.8, amplitude: -10.4 },\n { angle: 94.2, amplitude: -10.4 },\n { angle: 94.3, amplitude: -10.4 },\n { angle: 94.5, amplitude: -10.4 },\n { angle: 94.9, amplitude: -10.4 },\n { angle: 95.1, amplitude: -10.8 },\n { angle: 95.3, amplitude: -10.8 },\n { angle: 95.7, amplitude: -10.8 },\n { angle: 96.1, amplitude: -11.200000000000001 },\n { angle: 96.4, amplitude: -11.200000000000001 },\n { angle: 96.8, amplitude: -11.200000000000001 },\n { angle: 97.6, amplitude: -11.600000000000001 },\n { angle: 98, amplitude: -11.600000000000001 },\n { angle: 98.3, amplitude: -11.600000000000001 },\n { angle: 98.5, amplitude: -11.600000000000001 },\n { angle: 98.8, amplitude: -11.600000000000001 },\n { angle: 99.2, amplitude: -11.600000000000001 },\n { angle: 99.7, amplitude: -12.000000000000002 },\n { angle: 100.1, amplitude: -12.000000000000002 },\n { angle: 100.6, amplitude: -12.000000000000002 },\n { angle: 100.8, amplitude: -12.400000000000002 },\n { angle: 101, amplitude: -12.400000000000002 },\n { angle: 101.7, amplitude: -12.400000000000002 },\n { angle: 101.8, amplitude: -12.799999999999997 },\n { angle: 102, amplitude: -12.799999999999997 },\n { angle: 102.4, amplitude: -12.799999999999997 },\n { angle: 102.6, amplitude: -12.799999999999997 },\n { angle: 103.2, amplitude: -12.799999999999997 },\n { angle: 103.3, amplitude: -13.2 },\n { angle: 103.5, amplitude: -13.2 },\n { angle: 103.7, amplitude: -13.2 },\n { angle: 104.2, amplitude: -13.2 },\n { angle: 104.4, amplitude: -13.2 },\n { angle: 104.7, amplitude: -13.599999999999998 },\n { angle: 105.2, amplitude: -13.599999999999998 },\n { angle: 105.5, amplitude: -13.599999999999998 },\n { angle: 105.7, amplitude: -13.599999999999998 },\n { angle: 106.2, amplitude: -14 },\n { angle: 106.5, amplitude: -14 },\n { angle: 106.8, amplitude: -14 },\n { angle: 107.5, amplitude: -14.399999999999999 },\n { angle: 108.3, amplitude: -14.399999999999999 },\n { angle: 108.9, amplitude: -14.8 },\n { angle: 109.6, amplitude: -14.8 },\n { angle: 110, amplitude: -14.8 },\n { angle: 110.1, amplitude: -14.8 },\n { angle: 110.7, amplitude: -15.2 },\n { angle: 110.9, amplitude: -15.2 },\n { angle: 111.2, amplitude: -15.2 },\n { angle: 111.9, amplitude: -15.600000000000001 },\n { angle: 112.5, amplitude: -15.600000000000001 },\n { angle: 112.6, amplitude: -15.600000000000001 },\n { angle: 113.5, amplitude: -16 },\n { angle: 113.6, amplitude: -16 },\n { angle: 113.8, amplitude: -16 },\n { angle: 114.6, amplitude: -16.400000000000002 },\n { angle: 114.8, amplitude: -16.400000000000002 },\n { angle: 115.6, amplitude: -16.8 },\n { angle: 115.7, amplitude: -16.8 },\n { angle: 116.7, amplitude: -16.8 },\n { angle: 117, amplitude: -17.200000000000003 },\n { angle: 117.4, amplitude: -17.200000000000003 },\n { angle: 118.1, amplitude: -17.599999999999998 },\n { angle: 118.7, amplitude: -17.599999999999998 },\n { angle: 118.8, amplitude: -17.599999999999998 },\n { angle: 118.9, amplitude: -18 },\n { angle: 119.4, amplitude: -18 },\n { angle: 119.5, amplitude: -18 },\n { angle: 119.6, amplitude: -18 },\n { angle: 120.7, amplitude: -18.4 },\n { angle: 120.9, amplitude: -18.4 },\n { angle: 121, amplitude: -18.799999999999997 },\n { angle: 121.3, amplitude: -18.799999999999997 },\n { angle: 121.4, amplitude: -18.799999999999997 },\n { angle: 122.1, amplitude: -19.2 },\n { angle: 122.5, amplitude: -19.2 },\n { angle: 122.8, amplitude: -19.6 },\n { angle: 123.1, amplitude: -19.6 },\n { angle: 123.2, amplitude: -19.6 },\n { angle: 123.4, amplitude: -20 },\n { angle: 123.7, amplitude: -20 },\n { angle: 123.8, amplitude: -20 },\n { angle: 124.3, amplitude: -20.4 },\n { angle: 124.9, amplitude: -20.8 },\n { angle: 125.2, amplitude: -20.8 },\n { angle: 125.5, amplitude: -20.8 },\n { angle: 125.8, amplitude: -21.200000000000003 },\n { angle: 126.2, amplitude: -21.200000000000003 },\n { angle: 126.5, amplitude: -21.200000000000003 },\n { angle: 127, amplitude: -21.6 },\n { angle: 127.2, amplitude: -21.6 },\n { angle: 127.5, amplitude: -21.6 },\n { angle: 127.7, amplitude: -22 },\n { angle: 127.9, amplitude: -22 },\n { angle: 128.3, amplitude: -22 },\n { angle: 128.4, amplitude: -22 },\n { angle: 128.6, amplitude: -22.400000000000002 },\n { angle: 129, amplitude: -22.400000000000002 },\n { angle: 129.2, amplitude: -22.400000000000002 },\n { angle: 129.4, amplitude: -22.400000000000002 },\n { angle: 129.8, amplitude: -22.800000000000004 },\n { angle: 130.2, amplitude: -22.800000000000004 },\n { angle: 130.6, amplitude: -22.800000000000004 },\n { angle: 131.2, amplitude: -23.200000000000003 },\n { angle: 131.6, amplitude: -23.6 },\n { angle: 132, amplitude: -23.6 },\n { angle: 132.1, amplitude: -24 },\n { angle: 133, amplitude: -24.4 },\n { angle: 133.2, amplitude: -24.8 },\n { angle: 133.5, amplitude: -24.8 },\n { angle: 133.9, amplitude: -25.2 },\n { angle: 134.2, amplitude: -25.6 },\n { angle: 134.7, amplitude: -25.6 },\n { angle: 136.3, amplitude: -26 },\n { angle: 136.9, amplitude: -26.4 },\n { angle: 137.2, amplitude: -26.4 },\n { angle: 137.5, amplitude: -26.799999999999997 },\n { angle: 137.8, amplitude: -27.199999999999996 },\n { angle: 138.2, amplitude: -27.199999999999996 },\n { angle: 138.9, amplitude: -27.599999999999998 },\n { angle: 139.6, amplitude: -28 },\n { angle: 139.7, amplitude: -28.4 },\n { angle: 140.1, amplitude: -28.4 },\n { angle: 140.2, amplitude: -28.4 },\n { angle: 140.5, amplitude: -28.799999999999997 },\n { angle: 141.3, amplitude: -28.799999999999997 },\n { angle: 142, amplitude: -28.799999999999997 },\n { angle: 142.5, amplitude: -29.2 },\n { angle: 142.9, amplitude: -29.2 },\n { angle: 143.4, amplitude: -29.2 },\n { angle: 143.5, amplitude: -29.6 },\n { angle: 144.8, amplitude: -29.6 },\n { angle: 145.2, amplitude: -29.6 },\n { angle: 145.6, amplitude: -30 },\n { angle: 146, amplitude: -30 },\n { angle: 146.5, amplitude: -30.4 },\n { angle: 147.4, amplitude: -30.4 },\n { angle: 147.6, amplitude: -30.4 },\n { angle: 148.4, amplitude: -30.8 },\n { angle: 148.6, amplitude: -30.8 },\n { angle: 148.8, amplitude: -31.200000000000003 },\n { angle: 149.2, amplitude: -31.200000000000003 },\n { angle: 149.4, amplitude: -31.200000000000003 },\n { angle: 149.9, amplitude: -31.6 },\n { angle: 150.6, amplitude: -32 },\n { angle: 152.1, amplitude: -32 },\n { angle: 152.6, amplitude: -32 },\n { angle: 152.9, amplitude: -32 },\n { angle: 154.1, amplitude: -32.400000000000006 },\n { angle: 154.2, amplitude: -32.400000000000006 },\n { angle: 154.8, amplitude: -32.400000000000006 },\n { angle: 155.8, amplitude: -32.800000000000004 },\n { angle: 156.5, amplitude: -32.800000000000004 },\n { angle: 156.8, amplitude: -32.800000000000004 },\n { angle: 157.7, amplitude: -33.199999999999996 },\n { angle: 158.4, amplitude: -33.199999999999996 },\n { angle: 158.8, amplitude: -33.199999999999996 },\n { angle: 160.3, amplitude: -33.199999999999996 },\n { angle: 161, amplitude: -33.199999999999996 },\n { angle: 161.5, amplitude: -33.6 },\n { angle: 162.6, amplitude: -33.6 },\n { angle: 163.4, amplitude: -33.6 },\n { angle: 165.4, amplitude: -34 },\n { angle: 166.2, amplitude: -34 },\n { angle: 166.7, amplitude: -34 },\n { angle: 168.5, amplitude: -34.4 },\n { angle: 169.4, amplitude: -34.4 },\n { angle: 170.1, amplitude: -34.4 },\n { angle: 172, amplitude: -34.4 },\n { angle: 173.7, amplitude: -34.4 },\n { angle: 175.6, amplitude: -34.4 },\n { angle: 176.6, amplitude: -34.4 },\n { angle: 177.5, amplitude: -34.4 },\n { angle: 179.5, amplitude: -34.4 },\n { angle: 181.4, amplitude: -34.8 },\n { amplitude: -34.8, angle: 178.6 },\n { amplitude: -34.4, angle: 180.5 },\n { amplitude: -34.4, angle: 182.5 },\n { amplitude: -34.4, angle: 183.4 },\n { amplitude: -34.4, angle: 184.4 },\n { amplitude: -34.4, angle: 186.3 },\n { amplitude: -34.4, angle: 188 },\n { amplitude: -34.4, angle: 189.9 },\n { amplitude: -34.4, angle: 190.6 },\n { amplitude: -34.4, angle: 191.5 },\n { amplitude: -34, angle: 193.3 },\n { amplitude: -34, angle: 193.8 },\n { amplitude: -34, angle: 194.6 },\n { amplitude: -33.6, angle: 196.6 },\n { amplitude: -33.6, angle: 197.4 },\n { amplitude: -33.6, angle: 198.5 },\n { amplitude: -33.199999999999996, angle: 199 },\n { amplitude: -33.199999999999996, angle: 199.7 },\n { amplitude: -33.199999999999996, angle: 201.2 },\n { amplitude: -33.199999999999996, angle: 201.6 },\n { amplitude: -33.199999999999996, angle: 202.3 },\n { amplitude: -32.800000000000004, angle: 203.2 },\n { amplitude: -32.800000000000004, angle: 203.5 },\n { amplitude: -32.800000000000004, angle: 204.2 },\n { amplitude: -32.400000000000006, angle: 205.2 },\n { amplitude: -32.400000000000006, angle: 205.8 },\n { amplitude: -32.400000000000006, angle: 205.9 },\n { amplitude: -32, angle: 207.1 },\n { amplitude: -32, angle: 207.4 },\n { amplitude: -32, angle: 207.9 },\n { amplitude: -32, angle: 209.4 },\n { amplitude: -31.6, angle: 210.1 },\n { amplitude: -31.200000000000003, angle: 210.6 },\n { amplitude: -31.200000000000003, angle: 210.8 },\n { amplitude: -31.200000000000003, angle: 211.2 },\n { amplitude: -30.8, angle: 211.4 },\n { amplitude: -30.8, angle: 211.6 },\n { amplitude: -30.4, angle: 212.4 },\n { amplitude: -30.4, angle: 212.6 },\n { amplitude: -30.4, angle: 213.5 },\n { amplitude: -30, angle: 214 },\n { amplitude: -30, angle: 214.4 },\n { amplitude: -29.6, angle: 214.8 },\n { amplitude: -29.6, angle: 215.2 },\n { amplitude: -29.6, angle: 216.5 },\n { amplitude: -29.2, angle: 216.6 },\n { amplitude: -29.2, angle: 217.1 },\n { amplitude: -29.2, angle: 217.5 },\n { amplitude: -28.799999999999997, angle: 218 },\n { amplitude: -28.799999999999997, angle: 218.7 },\n { amplitude: -28.799999999999997, angle: 219.5 },\n { amplitude: -28.4, angle: 219.8 },\n { amplitude: -28.4, angle: 219.9 },\n { amplitude: -28.4, angle: 220.3 },\n { amplitude: -28, angle: 220.4 },\n { amplitude: -27.599999999999998, angle: 221.1 },\n { amplitude: -27.199999999999996, angle: 221.8 },\n { amplitude: -27.199999999999996, angle: 222.2 },\n { amplitude: -26.799999999999997, angle: 222.5 },\n { amplitude: -26.4, angle: 222.8 },\n { amplitude: -26.4, angle: 223.1 },\n { amplitude: -26, angle: 223.7 },\n { amplitude: -25.6, angle: 225.3 },\n { amplitude: -25.6, angle: 225.8 },\n { amplitude: -25.2, angle: 226.1 },\n { amplitude: -24.8, angle: 226.5 },\n { amplitude: -24.8, angle: 226.8 },\n { amplitude: -24.4, angle: 227 },\n { amplitude: -24, angle: 227.9 },\n { amplitude: -23.6, angle: 228 },\n { amplitude: -23.6, angle: 228.4 },\n { amplitude: -23.200000000000003, angle: 228.8 },\n { amplitude: -22.800000000000004, angle: 229.4 },\n { amplitude: -22.800000000000004, angle: 229.8 },\n { amplitude: -22.800000000000004, angle: 230.2 },\n { amplitude: -22.400000000000002, angle: 230.6 },\n { amplitude: -22.400000000000002, angle: 230.8 },\n { amplitude: -22.400000000000002, angle: 231 },\n { amplitude: -22.400000000000002, angle: 231.4 },\n { amplitude: -22, angle: 231.6 },\n { amplitude: -22, angle: 231.7 },\n { amplitude: -22, angle: 232.1 },\n { amplitude: -22, angle: 232.3 },\n { amplitude: -21.6, angle: 232.5 },\n { amplitude: -21.6, angle: 232.8 },\n { amplitude: -21.6, angle: 233 },\n { amplitude: -21.200000000000003, angle: 233.5 },\n { amplitude: -21.200000000000003, angle: 233.8 },\n { amplitude: -21.200000000000003, angle: 234.2 },\n { amplitude: -20.8, angle: 234.5 },\n { amplitude: -20.8, angle: 234.8 },\n { amplitude: -20.8, angle: 235.1 },\n { amplitude: -20.4, angle: 235.7 },\n { amplitude: -20, angle: 236.2 },\n { amplitude: -20, angle: 236.3 },\n { amplitude: -20, angle: 236.6 },\n { amplitude: -19.6, angle: 236.8 },\n { amplitude: -19.6, angle: 236.9 },\n { amplitude: -19.6, angle: 237.2 },\n { amplitude: -19.2, angle: 237.5 },\n { amplitude: -19.2, angle: 237.9 },\n { amplitude: -18.799999999999997, angle: 238.6 },\n { amplitude: -18.799999999999997, angle: 238.7 },\n { amplitude: -18.799999999999997, angle: 239 },\n { amplitude: -18.4, angle: 239.1 },\n { amplitude: -18.4, angle: 239.3 },\n { amplitude: -18, angle: 240.4 },\n { amplitude: -18, angle: 240.5 },\n { amplitude: -18, angle: 240.6 },\n { amplitude: -18, angle: 241.1 },\n { amplitude: -17.599999999999998, angle: 241.2 },\n { amplitude: -17.599999999999998, angle: 241.3 },\n { amplitude: -17.599999999999998, angle: 241.9 },\n { amplitude: -17.200000000000003, angle: 242.6 },\n { amplitude: -17.200000000000003, angle: 243 },\n { amplitude: -16.8, angle: 243.3 },\n { amplitude: -16.8, angle: 244.3 },\n { amplitude: -16.8, angle: 244.4 },\n { amplitude: -16.400000000000002, angle: 245.2 },\n { amplitude: -16.400000000000002, angle: 245.4 },\n { amplitude: -16, angle: 246.2 },\n { amplitude: -16, angle: 246.4 },\n { amplitude: -16, angle: 246.5 },\n { amplitude: -15.600000000000001, angle: 247.4 },\n { amplitude: -15.600000000000001, angle: 247.5 },\n { amplitude: -15.600000000000001, angle: 248.1 },\n { amplitude: -15.2, angle: 248.8 },\n { amplitude: -15.2, angle: 249.1 },\n { amplitude: -15.2, angle: 249.3 },\n { amplitude: -14.8, angle: 249.9 },\n { amplitude: -14.8, angle: 250 },\n { amplitude: -14.8, angle: 250.4 },\n { amplitude: -14.8, angle: 251.1 },\n { amplitude: -14.399999999999999, angle: 251.7 },\n { amplitude: -14.399999999999999, angle: 252.5 },\n { amplitude: -14, angle: 253.2 },\n { amplitude: -14, angle: 253.5 },\n { amplitude: -14, angle: 253.8 },\n { amplitude: -13.599999999999998, angle: 254.3 },\n { amplitude: -13.599999999999998, angle: 254.5 },\n { amplitude: -13.599999999999998, angle: 254.8 },\n { amplitude: -13.599999999999998, angle: 255.3 },\n { amplitude: -13.2, angle: 255.6 },\n { amplitude: -13.2, angle: 255.8 },\n { amplitude: -13.2, angle: 256.3 },\n { amplitude: -13.2, angle: 256.5 },\n { amplitude: -13.2, angle: 256.7 },\n { amplitude: -12.799999999999997, angle: 256.8 },\n { amplitude: -12.799999999999997, angle: 257.4 },\n { amplitude: -12.799999999999997, angle: 257.6 },\n { amplitude: -12.799999999999997, angle: 258 },\n { amplitude: -12.799999999999997, angle: 258.2 },\n { amplitude: -12.400000000000002, angle: 258.3 },\n { amplitude: -12.400000000000002, angle: 259 },\n { amplitude: -12.400000000000002, angle: 259.2 },\n { amplitude: -12.000000000000002, angle: 259.4 },\n { amplitude: -12.000000000000002, angle: 259.9 },\n { amplitude: -12.000000000000002, angle: 260.3 },\n { amplitude: -11.600000000000001, angle: 260.8 },\n { amplitude: -11.600000000000001, angle: 261.2 },\n { amplitude: -11.600000000000001, angle: 261.5 },\n { amplitude: -11.600000000000001, angle: 261.7 },\n { amplitude: -11.600000000000001, angle: 262 },\n { amplitude: -11.600000000000001, angle: 262.4 },\n { amplitude: -11.200000000000001, angle: 263.2 },\n { amplitude: -11.200000000000001, angle: 263.6 },\n { amplitude: -11.200000000000001, angle: 263.9 },\n { amplitude: -10.8, angle: 264.3 },\n { amplitude: -10.8, angle: 264.7 },\n { amplitude: -10.8, angle: 264.9 },\n { amplitude: -10.4, angle: 265.1 },\n { amplitude: -10.4, angle: 265.5 },\n { amplitude: -10.4, angle: 265.7 },\n { amplitude: -10.4, angle: 265.8 },\n { amplitude: -10.4, angle: 266.2 },\n { amplitude: -10.4, angle: 266.4 },\n { amplitude: -10.4, angle: 266.6 },\n { amplitude: -10.4, angle: 266.9 },\n { amplitude: -10.4, angle: 267.1 },\n { amplitude: -10.4, angle: 267.3 },\n { amplitude: -10, angle: 267.8 },\n { amplitude: -10, angle: 268 },\n { amplitude: -10, angle: 268.6 },\n { amplitude: -9.6, angle: 269.1 },\n { amplitude: -9.6, angle: 269.3 },\n { amplitude: -9.6, angle: 269.8 },\n { amplitude: -9.6, angle: 270.1 },\n { amplitude: -9.2, angle: 270.5 },\n { amplitude: -9.2, angle: 270.6 },\n { amplitude: -9.2, angle: 271.2 },\n { amplitude: -9.2, angle: 271.3 },\n { amplitude: -8.799999999999999, angle: 271.8 },\n { amplitude: -8.799999999999999, angle: 272.2 },\n { amplitude: -8.799999999999999, angle: 272.5 },\n { amplitude: -8.799999999999999, angle: 272.8 },\n { amplitude: -8.399999999999999, angle: 273.2 },\n { amplitude: -8.399999999999999, angle: 273.5 },\n { amplitude: -8.399999999999999, angle: 273.8 },\n { amplitude: -8.399999999999999, angle: 274 },\n { amplitude: -8.399999999999999, angle: 274.5 },\n { amplitude: -8.399999999999999, angle: 274.8 },\n { amplitude: -8.399999999999999, angle: 275.1 },\n { amplitude: -8.399999999999999, angle: 275.3 },\n { amplitude: -7.999999999999998, angle: 275.8 },\n { amplitude: -7.999999999999998, angle: 276.1 },\n { amplitude: -7.999999999999998, angle: 276.4 },\n { amplitude: -7.999999999999998, angle: 276.6 },\n { amplitude: -7.999999999999998, angle: 276.8 },\n { amplitude: -7.999999999999998, angle: 277.1 },\n { amplitude: -7.999999999999998, angle: 277.4 },\n { amplitude: -7.999999999999998, angle: 277.8 },\n { amplitude: -7.999999999999998, angle: 278.1 },\n { amplitude: -7.999999999999998, angle: 278.4 },\n { amplitude: -7.999999999999998, angle: 278.6 },\n { amplitude: -7.999999999999998, angle: 278.7 },\n { amplitude: -7.999999999999998, angle: 279.1 },\n { amplitude: -7.999999999999998, angle: 279.4 },\n { amplitude: -7.999999999999998, angle: 279.7 },\n { amplitude: -7.999999999999998, angle: 279.9 },\n { amplitude: -7.999999999999998, angle: 280.4 },\n { amplitude: -7.999999999999998, angle: 280.5 },\n { amplitude: -7.599999999999998, angle: 280.7 },\n { amplitude: -7.599999999999998, angle: 281.2 },\n { amplitude: -7.599999999999998, angle: 281.3 },\n { amplitude: -7.599999999999998, angle: 281.6 },\n { amplitude: -7.599999999999998, angle: 281.8 },\n { amplitude: -7.599999999999998, angle: 282 },\n { amplitude: -7.599999999999998, angle: 282.4 },\n { amplitude: -7.599999999999998, angle: 282.6 },\n { amplitude: -7.599999999999998, angle: 283.1 },\n { amplitude: -7.599999999999998, angle: 283.2 },\n { amplitude: -7.599999999999998, angle: 283.6 },\n { amplitude: -7.599999999999998, angle: 283.7 },\n { amplitude: -7.599999999999998, angle: 283.9 },\n { amplitude: -7.599999999999998, angle: 284.2 },\n { amplitude: -7.599999999999998, angle: 284.4 },\n { amplitude: -7.200000000000002, angle: 284.5 },\n { amplitude: -7.200000000000002, angle: 285 },\n { amplitude: -7.200000000000002, angle: 285.2 },\n { amplitude: -7.200000000000002, angle: 285.9 },\n { amplitude: -7.200000000000002, angle: 286.2 },\n { amplitude: -7.200000000000002, angle: 286.8 },\n { amplitude: -7.200000000000002, angle: 287.4 },\n { amplitude: -7.200000000000002, angle: 287.7 },\n { amplitude: -7.200000000000002, angle: 288 },\n { amplitude: -6.800000000000002, angle: 288.2 },\n { amplitude: -6.800000000000002, angle: 288.3 },\n { amplitude: -6.800000000000002, angle: 288.6 },\n { amplitude: -6.800000000000002, angle: 288.8 },\n { amplitude: -6.800000000000002, angle: 288.9 },\n { amplitude: -6.800000000000002, angle: 289.2 },\n { amplitude: -6.800000000000002, angle: 289.4 },\n { amplitude: -6.800000000000002, angle: 290 },\n { amplitude: -6.400000000000001, angle: 290.4 },\n { amplitude: -6.400000000000001, angle: 290.6 },\n { amplitude: -6.400000000000001, angle: 291.2 },\n { amplitude: -6.400000000000001, angle: 291.7 },\n { amplitude: -6.400000000000001, angle: 292 },\n { amplitude: -6.000000000000001, angle: 292.5 },\n { amplitude: -6.000000000000001, angle: 292.8 },\n { amplitude: -6.000000000000001, angle: 293 },\n { amplitude: -6.000000000000001, angle: 293.1 },\n { amplitude: -6.000000000000001, angle: 293.6 },\n { amplitude: -6.000000000000001, angle: 293.7 },\n { amplitude: -6.000000000000001, angle: 294 },\n { amplitude: -6.000000000000001, angle: 294.3 },\n { amplitude: -6.000000000000001, angle: 294.4 },\n { amplitude: -6.000000000000001, angle: 294.8 },\n { amplitude: -6.000000000000001, angle: 294.9 },\n { amplitude: -6.000000000000001, angle: 295.1 },\n { amplitude: -6.000000000000001, angle: 295.3 },\n { amplitude: -5.6000000000000005, angle: 295.5 },\n { amplitude: -6.000000000000001, angle: 295.7 },\n { amplitude: -5.6000000000000005, angle: 296 },\n { amplitude: -6.000000000000001, angle: 296.1 },\n { amplitude: -6.000000000000001, angle: 296.4 },\n { amplitude: -5.6000000000000005, angle: 296.8 },\n { amplitude: -5.6000000000000005, angle: 296.9 },\n { amplitude: -5.6000000000000005, angle: 297.4 },\n { amplitude: -5.6000000000000005, angle: 297.5 },\n { amplitude: -5.6000000000000005, angle: 297.8 },\n { amplitude: -5.2, angle: 298.1 },\n { amplitude: -5.2, angle: 298.4 },\n { amplitude: -5.2, angle: 298.7 },\n { amplitude: -5.2, angle: 299.1 },\n { amplitude: -5.2, angle: 299.4 },\n { amplitude: -5.2, angle: 299.6 },\n { amplitude: -5.2, angle: 299.8 },\n { amplitude: -5.2, angle: 299.9 },\n { amplitude: -5.2, angle: 300.2 },\n { amplitude: -4.8, angle: 300.5 },\n { amplitude: -4.8, angle: 300.8 },\n { amplitude: -4.8, angle: 301.1 },\n { amplitude: -4.8, angle: 301.5 },\n { amplitude: -4.8, angle: 302.1 },\n { amplitude: -4.8, angle: 302.2 },\n { amplitude: -4.8, angle: 302.3 },\n { amplitude: -4.8, angle: 303.1 },\n { amplitude: -4.8, angle: 303.6 },\n { amplitude: -4.8, angle: 304 },\n { amplitude: -4.8, angle: 304.3 },\n { amplitude: -4.8, angle: 304.8 },\n { amplitude: -4.8, angle: 305 },\n { amplitude: -4.8, angle: 305.7 },\n { amplitude: -4.3999999999999995, angle: 306.2 },\n { amplitude: -4.8, angle: 306.5 },\n { amplitude: -4.8, angle: 306.7 },\n { amplitude: -4.8, angle: 307 },\n { amplitude: -4.3999999999999995, angle: 307.1 },\n { amplitude: -4.8, angle: 307.3 },\n { amplitude: -4.8, angle: 307.4 },\n { amplitude: -4.8, angle: 308 },\n { amplitude: -4.8, angle: 308.1 },\n { amplitude: -4.8, angle: 308.5 },\n { amplitude: -4.3999999999999995, angle: 308.8 },\n { amplitude: -4.3999999999999995, angle: 309.1 },\n { amplitude: -4.8, angle: 309.3 },\n { amplitude: -4.8, angle: 309.7 },\n { amplitude: -4.8, angle: 310 },\n { amplitude: -4.8, angle: 310.4 },\n { amplitude: -4.3999999999999995, angle: 310.8 },\n { amplitude: -4.3999999999999995, angle: 311.6 },\n { amplitude: -4.3999999999999995, angle: 311.8 },\n { amplitude: -4.3999999999999995, angle: 312.2 },\n { amplitude: -4.3999999999999995, angle: 312.6 },\n { amplitude: -4.3999999999999995, angle: 312.8 },\n { amplitude: -4.3999999999999995, angle: 313 },\n { amplitude: -4.3999999999999995, angle: 313.2 },\n { amplitude: -4.3999999999999995, angle: 313.7 },\n { amplitude: -4.3999999999999995, angle: 313.9 },\n { amplitude: -4.3999999999999995, angle: 314.2 },\n { amplitude: -4.3999999999999995, angle: 314.4 },\n { amplitude: -4.3999999999999995, angle: 314.7 },\n { amplitude: -3.999999999999999, angle: 314.9 },\n { amplitude: -3.999999999999999, angle: 315.3 },\n { amplitude: -3.999999999999999, angle: 315.8 },\n { amplitude: -3.999999999999999, angle: 316 },\n { amplitude: -3.999999999999999, angle: 316.3 },\n { amplitude: -3.999999999999999, angle: 316.4 },\n { amplitude: -3.999999999999999, angle: 316.5 },\n { amplitude: -3.5999999999999988, angle: 316.7 },\n { amplitude: -3.999999999999999, angle: 316.9 },\n { amplitude: -3.5999999999999988, angle: 317 },\n { amplitude: -3.5999999999999988, angle: 317.2 },\n { amplitude: -3.5999999999999988, angle: 317.4 },\n { amplitude: -3.5999999999999988, angle: 317.6 },\n { amplitude: -3.5999999999999988, angle: 317.9 },\n { amplitude: -3.5999999999999988, angle: 318.2 },\n { amplitude: -3.5999999999999988, angle: 318.7 },\n { amplitude: -3.5999999999999988, angle: 319.3 },\n { amplitude: -3.5999999999999988, angle: 319.9 },\n { amplitude: -3.5999999999999988, angle: 320.1 },\n { amplitude: -3.5999999999999988, angle: 320.4 },\n { amplitude: -3.5999999999999988, angle: 320.5 },\n { amplitude: -3.5999999999999988, angle: 320.7 },\n { amplitude: -3.5999999999999988, angle: 320.9 },\n { amplitude: -3.1999999999999984, angle: 321 },\n { amplitude: -3.1999999999999984, angle: 321.6 },\n { amplitude: -3.1999999999999984, angle: 321.8 },\n { amplitude: -3.1999999999999984, angle: 322.2 },\n { amplitude: -3.1999999999999984, angle: 322.4 },\n { amplitude: -3.1999999999999984, angle: 322.6 },\n { amplitude: -3.1999999999999984, angle: 322.8 },\n { amplitude: -3.1999999999999984, angle: 323.1 },\n { amplitude: -3.1999999999999984, angle: 323.3 },\n { amplitude: -2.799999999999998, angle: 323.7 },\n { amplitude: -2.799999999999998, angle: 324.1 },\n { amplitude: -2.799999999999998, angle: 324.2 },\n { amplitude: -2.799999999999998, angle: 324.4 },\n { amplitude: -2.799999999999998, angle: 324.9 },\n { amplitude: -2.799999999999998, angle: 325.2 },\n { amplitude: -2.400000000000002, angle: 325.5 },\n { amplitude: -2.400000000000002, angle: 325.6 },\n { amplitude: -2.400000000000002, angle: 325.9 },\n { amplitude: -2.400000000000002, angle: 326.2 },\n { amplitude: -2.400000000000002, angle: 326.8 },\n { amplitude: -2.400000000000002, angle: 327 },\n { amplitude: -2.0000000000000018, angle: 327.3 },\n { amplitude: -2.0000000000000018, angle: 327.7 },\n { amplitude: -2.0000000000000018, angle: 328.2 },\n { amplitude: -1.6000000000000014, angle: 328.6 },\n { amplitude: -1.6000000000000014, angle: 328.7 },\n { amplitude: -1.6000000000000014, angle: 328.9 },\n { amplitude: -1.6000000000000014, angle: 329 },\n { amplitude: -1.6000000000000014, angle: 329.2 },\n { amplitude: -1.200000000000001, angle: 329.8 },\n { amplitude: -1.200000000000001, angle: 330.3 },\n { amplitude: -1.200000000000001, angle: 330.4 },\n { amplitude: -1.200000000000001, angle: 330.6 },\n { amplitude: -1.200000000000001, angle: 331 },\n { amplitude: -0.8000000000000007, angle: 331.2 },\n { amplitude: -1.200000000000001, angle: 331.3 },\n { amplitude: -1.200000000000001, angle: 331.8 },\n { amplitude: -0.8000000000000007, angle: 331.9 },\n { amplitude: -0.8000000000000007, angle: 332 },\n { amplitude: -0.8000000000000007, angle: 332.2 },\n { amplitude: -0.8000000000000007, angle: 332.6 },\n { amplitude: -0.8000000000000007, angle: 332.7 },\n { amplitude: -0.8000000000000007, angle: 332.9 },\n { amplitude: -0.8000000000000007, angle: 333.2 },\n { amplitude: -0.8000000000000007, angle: 333.3 },\n { amplitude: -0.8000000000000007, angle: 333.8 },\n { amplitude: -0.8000000000000007, angle: 334 },\n { amplitude: -0.8000000000000007, angle: 334.8 },\n { amplitude: -0.8000000000000007, angle: 335.2 },\n { amplitude: -0.8000000000000007, angle: 335.6 },\n { amplitude: -0.8000000000000007, angle: 335.7 },\n { amplitude: -0.40000000000000036, angle: 336 },\n { amplitude: -0.40000000000000036, angle: 336.3 },\n { amplitude: -0.8000000000000007, angle: 336.4 },\n { amplitude: -0.40000000000000036, angle: 336.6 },\n { amplitude: -0.8000000000000007, angle: 336.8 },\n { amplitude: -0.40000000000000036, angle: 337.2 },\n { amplitude: -0.40000000000000036, angle: 337.5 },\n { amplitude: -0.40000000000000036, angle: 337.7 },\n { amplitude: -0.8000000000000007, angle: 338 },\n { amplitude: -0.8000000000000007, angle: 338.1 },\n { amplitude: -0.40000000000000036, angle: 338.7 },\n { amplitude: -0.40000000000000036, angle: 339.2 },\n { amplitude: -0.40000000000000036, angle: 339.3 },\n { amplitude: -0.40000000000000036, angle: 339.4 },\n { amplitude: -0.40000000000000036, angle: 339.8 },\n { amplitude: -0.40000000000000036, angle: 340 },\n { amplitude: -0.40000000000000036, angle: 340.3 },\n { amplitude: -0.40000000000000036, angle: 340.5 },\n { amplitude: -0.40000000000000036, angle: 340.9 },\n { amplitude: -0.40000000000000036, angle: 341 },\n { amplitude: -0.40000000000000036, angle: 341.2 },\n { amplitude: -0.40000000000000036, angle: 341.8 },\n { amplitude: -0.40000000000000036, angle: 342.3 },\n { amplitude: -0.40000000000000036, angle: 342.7 },\n { amplitude: -0.40000000000000036, angle: 342.9 },\n { amplitude: -0.40000000000000036, angle: 343.3 },\n { amplitude: -0.40000000000000036, angle: 343.4 },\n { amplitude: -0.40000000000000036, angle: 343.5 },\n { amplitude: -0.40000000000000036, angle: 343.9 },\n { amplitude: -0.40000000000000036, angle: 344 },\n { amplitude: -0.8000000000000007, angle: 344.4 },\n { amplitude: -0.8000000000000007, angle: 344.9 },\n { amplitude: -0.8000000000000007, angle: 345.3 },\n { amplitude: -0.8000000000000007, angle: 345.5 },\n { amplitude: -0.8000000000000007, angle: 345.8 },\n { amplitude: -0.8000000000000007, angle: 346.1 },\n { amplitude: -0.8000000000000007, angle: 346.5 },\n { amplitude: -0.8000000000000007, angle: 346.9 },\n { amplitude: -0.8000000000000007, angle: 347.2 },\n { amplitude: -0.8000000000000007, angle: 347.6 },\n { amplitude: -0.8000000000000007, angle: 348 },\n { amplitude: -0.8000000000000007, angle: 348.2 },\n { amplitude: -0.8000000000000007, angle: 348.3 },\n { amplitude: -0.8000000000000007, angle: 348.6 },\n { amplitude: -0.8000000000000007, angle: 348.7 },\n { amplitude: -0.8000000000000007, angle: 348.8 },\n { amplitude: -0.8000000000000007, angle: 349.2 },\n { amplitude: -0.8000000000000007, angle: 349.6 },\n { amplitude: -0.8000000000000007, angle: 350 },\n { amplitude: -0.8000000000000007, angle: 350.4 },\n { amplitude: -0.8000000000000007, angle: 350.8 },\n { amplitude: -0.8000000000000007, angle: 350.9 },\n { amplitude: -0.8000000000000007, angle: 351.1 },\n { amplitude: -0.8000000000000007, angle: 351.5 },\n { amplitude: -0.8000000000000007, angle: 351.6 },\n { amplitude: -0.8000000000000007, angle: 351.9 },\n { amplitude: -0.40000000000000036, angle: 352.1 },\n { amplitude: -0.8000000000000007, angle: 352.5 },\n { amplitude: -0.40000000000000036, angle: 352.6 },\n { amplitude: -0.40000000000000036, angle: 353 },\n { amplitude: -0.40000000000000036, angle: 353.6 },\n { amplitude: -0.40000000000000036, angle: 354.8 },\n { amplitude: -0.40000000000000036, angle: 355.3 },\n { amplitude: -0.40000000000000036, angle: 355.7 },\n { amplitude: -0.40000000000000036, angle: 356 },\n { amplitude: -0.40000000000000036, angle: 356.4 },\n { amplitude: 0, angle: 356.5 },\n { amplitude: 0, angle: 356.8 },\n { amplitude: 0, angle: 356.9 },\n { amplitude: 0, angle: 357.1 },\n { amplitude: 0, angle: 357.3 },\n { amplitude: 0, angle: 357.6 },\n { amplitude: -0.40000000000000036, angle: 358 },\n { amplitude: -0.40000000000000036, angle: 358.1 },\n { amplitude: -0.40000000000000036, angle: 358.5 },\n { amplitude: -0.40000000000000036, angle: 359.1 },\n { amplitude: -0.40000000000000036, angle: 360 },\n { amplitude: -0.40000000000000036, angle: 0 },\n { amplitude: -0.40000000000000036, angle: 0.8999999999999773 },\n { amplitude: -0.40000000000000036, angle: 1.5 },\n { amplitude: -0.40000000000000036, angle: 1.8999999999999773 },\n { amplitude: -0.40000000000000036, angle: 2 },\n { amplitude: 0, angle: 2.3999999999999773 },\n { amplitude: 0, angle: 2.6999999999999886 },\n { amplitude: 0, angle: 2.8999999999999773 },\n { amplitude: 0, angle: 3.1000000000000227 },\n { amplitude: 0, angle: 3.1999999999999886 },\n { amplitude: 0, angle: 3.5 },\n { amplitude: -0.40000000000000036, angle: 3.6000000000000227 },\n { amplitude: -0.40000000000000036, angle: 4 },\n { amplitude: -0.40000000000000036, angle: 4.300000000000011 },\n { amplitude: -0.40000000000000036, angle: 4.699999999999989 },\n { amplitude: -0.40000000000000036, angle: 5.199999999999989 },\n { amplitude: -0.40000000000000036, angle: 6.399999999999977 },\n { amplitude: -0.40000000000000036, angle: 7 },\n { amplitude: -0.40000000000000036, angle: 7.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 7.5 },\n { amplitude: -0.40000000000000036, angle: 7.899999999999977 },\n { amplitude: -0.8000000000000007, angle: 8.100000000000023 },\n { amplitude: -0.8000000000000007, angle: 8.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 8.5 },\n { amplitude: -0.8000000000000007, angle: 8.899999999999977 },\n { amplitude: -0.8000000000000007, angle: 9.100000000000023 },\n { amplitude: -0.8000000000000007, angle: 9.199999999999989 },\n { amplitude: -0.8000000000000007, angle: 9.600000000000023 },\n { amplitude: -0.8000000000000007, angle: 10 },\n { amplitude: -0.8000000000000007, angle: 10.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 10.800000000000011 },\n { amplitude: -0.8000000000000007, angle: 11.199999999999989 },\n { amplitude: -0.8000000000000007, angle: 11.300000000000011 },\n { amplitude: -0.8000000000000007, angle: 11.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 11.699999999999989 },\n { amplitude: -0.8000000000000007, angle: 11.800000000000011 },\n { amplitude: -0.8000000000000007, angle: 12 },\n { amplitude: -0.8000000000000007, angle: 12.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 12.800000000000011 },\n { amplitude: -0.8000000000000007, angle: 13.100000000000023 },\n { amplitude: -0.8000000000000007, angle: 13.5 },\n { amplitude: -0.8000000000000007, angle: 13.899999999999977 },\n { amplitude: -0.8000000000000007, angle: 14.199999999999989 },\n { amplitude: -0.8000000000000007, angle: 14.5 },\n { amplitude: -0.8000000000000007, angle: 14.699999999999989 },\n { amplitude: -0.8000000000000007, angle: 15.100000000000023 },\n { amplitude: -0.8000000000000007, angle: 15.600000000000023 },\n { amplitude: -0.40000000000000036, angle: 16 },\n { amplitude: -0.40000000000000036, angle: 16.100000000000023 },\n { amplitude: -0.40000000000000036, angle: 16.5 },\n { amplitude: -0.40000000000000036, angle: 16.600000000000023 },\n { amplitude: -0.40000000000000036, angle: 16.69999999999999 },\n { amplitude: -0.40000000000000036, angle: 17.100000000000023 },\n { amplitude: -0.40000000000000036, angle: 17.30000000000001 },\n { amplitude: -0.40000000000000036, angle: 17.69999999999999 },\n { amplitude: -0.40000000000000036, angle: 18.19999999999999 },\n { amplitude: -0.40000000000000036, angle: 18.80000000000001 },\n { amplitude: -0.40000000000000036, angle: 19 },\n { amplitude: -0.40000000000000036, angle: 19.100000000000023 },\n { amplitude: -0.40000000000000036, angle: 19.5 },\n { amplitude: -0.40000000000000036, angle: 19.69999999999999 },\n { amplitude: -0.40000000000000036, angle: 20 },\n { amplitude: -0.40000000000000036, angle: 20.19999999999999 },\n { amplitude: -0.40000000000000036, angle: 20.600000000000023 },\n { amplitude: -0.40000000000000036, angle: 20.69999999999999 },\n { amplitude: -0.40000000000000036, angle: 20.80000000000001 },\n { amplitude: -0.40000000000000036, angle: 21.30000000000001 },\n { amplitude: -0.8000000000000007, angle: 21.899999999999977 },\n { amplitude: -0.8000000000000007, angle: 22 },\n { amplitude: -0.40000000000000036, angle: 22.30000000000001 },\n { amplitude: -0.40000000000000036, angle: 22.5 },\n { amplitude: -0.40000000000000036, angle: 22.80000000000001 },\n { amplitude: -0.8000000000000007, angle: 23.19999999999999 },\n { amplitude: -0.40000000000000036, angle: 23.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 23.600000000000023 },\n { amplitude: -0.40000000000000036, angle: 23.69999999999999 },\n { amplitude: -0.40000000000000036, angle: 24 },\n { amplitude: -0.8000000000000007, angle: 24.30000000000001 },\n { amplitude: -0.8000000000000007, angle: 24.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 24.80000000000001 },\n { amplitude: -0.8000000000000007, angle: 25.19999999999999 },\n { amplitude: -0.8000000000000007, angle: 26 },\n { amplitude: -0.8000000000000007, angle: 26.19999999999999 },\n { amplitude: -0.8000000000000007, angle: 26.69999999999999 },\n { amplitude: -0.8000000000000007, angle: 26.80000000000001 },\n { amplitude: -0.8000000000000007, angle: 27.100000000000023 },\n { amplitude: -0.8000000000000007, angle: 27.30000000000001 },\n { amplitude: -0.8000000000000007, angle: 27.399999999999977 },\n { amplitude: -0.8000000000000007, angle: 27.80000000000001 },\n { amplitude: -0.8000000000000007, angle: 28 },\n { amplitude: -0.8000000000000007, angle: 28.100000000000023 },\n { amplitude: -1.200000000000001, angle: 28.19999999999999 },\n { amplitude: -1.200000000000001, angle: 28.69999999999999 },\n { amplitude: -0.8000000000000007, angle: 28.80000000000001 },\n { amplitude: -1.200000000000001, angle: 29 },\n { amplitude: -1.200000000000001, angle: 29.399999999999977 },\n { amplitude: -1.200000000000001, angle: 29.600000000000023 },\n { amplitude: -1.200000000000001, angle: 29.69999999999999 },\n { amplitude: -1.200000000000001, angle: 30.19999999999999 },\n { amplitude: -1.6000000000000014, angle: 30.80000000000001 },\n { amplitude: -1.6000000000000014, angle: 31 },\n { amplitude: -1.6000000000000014, angle: 31.100000000000023 },\n { amplitude: -1.6000000000000014, angle: 31.30000000000001 },\n { amplitude: -1.6000000000000014, angle: 31.399999999999977 },\n { amplitude: -2.0000000000000018, angle: 31.80000000000001 },\n { amplitude: -2.0000000000000018, angle: 32.30000000000001 },\n { amplitude: -2.0000000000000018, angle: 32.69999999999999 },\n { amplitude: -2.400000000000002, angle: 33 },\n { amplitude: -2.400000000000002, angle: 33.19999999999999 },\n { amplitude: -2.400000000000002, angle: 33.80000000000001 },\n { amplitude: -2.400000000000002, angle: 34.10000000000002 },\n { amplitude: -2.400000000000002, angle: 34.39999999999998 },\n { amplitude: -2.400000000000002, angle: 34.5 },\n { amplitude: -2.799999999999998, angle: 34.80000000000001 },\n { amplitude: -2.799999999999998, angle: 35.10000000000002 },\n { amplitude: -2.799999999999998, angle: 35.60000000000002 },\n { amplitude: -2.799999999999998, angle: 35.80000000000001 },\n { amplitude: -2.799999999999998, angle: 35.89999999999998 },\n { amplitude: -2.799999999999998, angle: 36.30000000000001 },\n { amplitude: -3.1999999999999984, angle: 36.69999999999999 },\n { amplitude: -3.1999999999999984, angle: 36.89999999999998 },\n { amplitude: -3.1999999999999984, angle: 37.19999999999999 },\n { amplitude: -3.1999999999999984, angle: 37.39999999999998 },\n { amplitude: -3.1999999999999984, angle: 37.60000000000002 },\n { amplitude: -3.1999999999999984, angle: 37.80000000000001 },\n { amplitude: -3.1999999999999984, angle: 38.19999999999999 },\n { amplitude: -3.1999999999999984, angle: 38.39999999999998 },\n { amplitude: -3.1999999999999984, angle: 39 },\n { amplitude: -3.5999999999999988, angle: 39.10000000000002 },\n { amplitude: -3.5999999999999988, angle: 39.30000000000001 },\n { amplitude: -3.5999999999999988, angle: 39.5 },\n { amplitude: -3.5999999999999988, angle: 39.60000000000002 },\n { amplitude: -3.5999999999999988, angle: 39.89999999999998 },\n { amplitude: -3.5999999999999988, angle: 40.10000000000002 },\n { amplitude: -3.5999999999999988, angle: 40.69999999999999 },\n { amplitude: -3.5999999999999988, angle: 41.30000000000001 },\n { amplitude: -3.5999999999999988, angle: 41.80000000000001 },\n { amplitude: -3.5999999999999988, angle: 42.10000000000002 },\n { amplitude: -3.5999999999999988, angle: 42.39999999999998 },\n { amplitude: -3.5999999999999988, angle: 42.60000000000002 },\n { amplitude: -3.5999999999999988, angle: 42.80000000000001 },\n { amplitude: -3.5999999999999988, angle: 43 },\n { amplitude: -3.999999999999999, angle: 43.10000000000002 },\n { amplitude: -3.5999999999999988, angle: 43.30000000000001 },\n { amplitude: -3.999999999999999, angle: 43.5 },\n { amplitude: -3.999999999999999, angle: 43.60000000000002 },\n { amplitude: -3.999999999999999, angle: 43.69999999999999 },\n { amplitude: -3.999999999999999, angle: 44 },\n { amplitude: -3.999999999999999, angle: 44.19999999999999 },\n { amplitude: -3.999999999999999, angle: 44.69999999999999 },\n { amplitude: -3.999999999999999, angle: 45.10000000000002 },\n { amplitude: -4.3999999999999995, angle: 45.30000000000001 },\n { amplitude: -4.3999999999999995, angle: 45.60000000000002 },\n { amplitude: -4.3999999999999995, angle: 45.80000000000001 },\n { amplitude: -4.3999999999999995, angle: 46.10000000000002 },\n { amplitude: -4.3999999999999995, angle: 46.30000000000001 },\n { amplitude: -4.3999999999999995, angle: 46.80000000000001 },\n { amplitude: -4.3999999999999995, angle: 47 },\n { amplitude: -4.3999999999999995, angle: 47.19999999999999 },\n { amplitude: -4.3999999999999995, angle: 47.39999999999998 },\n { amplitude: -4.3999999999999995, angle: 47.80000000000001 },\n { amplitude: -4.3999999999999995, angle: 48.19999999999999 },\n { amplitude: -4.3999999999999995, angle: 48.39999999999998 },\n { amplitude: -4.3999999999999995, angle: 49.19999999999999 },\n { amplitude: -4.8, angle: 49.60000000000002 },\n { amplitude: -4.8, angle: 50 },\n { amplitude: -4.8, angle: 50.30000000000001 },\n { amplitude: -4.8, angle: 50.69999999999999 },\n { amplitude: -4.3999999999999995, angle: 50.89999999999998 },\n { amplitude: -4.3999999999999995, angle: 51.19999999999999 },\n { amplitude: -4.8, angle: 51.5 },\n { amplitude: -4.8, angle: 51.89999999999998 },\n { amplitude: -4.8, angle: 52 },\n { amplitude: -4.8, angle: 52.60000000000002 },\n { amplitude: -4.8, angle: 52.69999999999999 },\n { amplitude: -4.3999999999999995, angle: 52.89999999999998 },\n { amplitude: -4.8, angle: 53 },\n { amplitude: -4.8, angle: 53.30000000000001 },\n { amplitude: -4.8, angle: 53.5 },\n { amplitude: -4.3999999999999995, angle: 53.80000000000001 },\n { amplitude: -4.8, angle: 54.30000000000001 },\n { amplitude: -4.8, angle: 55 },\n { amplitude: -4.8, angle: 55.19999999999999 },\n { amplitude: -4.8, angle: 55.69999999999999 },\n { amplitude: -4.8, angle: 56 },\n { amplitude: -4.8, angle: 56.39999999999998 },\n { amplitude: -4.8, angle: 56.89999999999998 },\n { amplitude: -4.8, angle: 57.69999999999999 },\n { amplitude: -4.8, angle: 57.80000000000001 },\n { amplitude: -4.8, angle: 57.89999999999998 },\n { amplitude: -4.8, angle: 58.5 },\n { amplitude: -4.8, angle: 58.89999999999998 },\n { amplitude: -4.8, angle: 59.19999999999999 },\n { amplitude: -4.8, angle: 59.5 },\n { amplitude: -5.2, angle: 59.80000000000001 },\n { amplitude: -5.2, angle: 60.10000000000002 },\n { amplitude: -5.2, angle: 60.19999999999999 },\n { amplitude: -5.2, angle: 60.39999999999998 },\n { amplitude: -5.2, angle: 60.60000000000002 },\n { amplitude: -5.2, angle: 60.89999999999998 },\n { amplitude: -5.2, angle: 61.30000000000001 },\n { amplitude: -5.2, angle: 61.60000000000002 },\n { amplitude: -5.2, angle: 61.89999999999998 },\n { amplitude: -5.6000000000000005, angle: 62.19999999999999 },\n { amplitude: -5.6000000000000005, angle: 62.5 },\n { amplitude: -5.6000000000000005, angle: 62.60000000000002 },\n { amplitude: -5.6000000000000005, angle: 63.10000000000002 },\n { amplitude: -5.6000000000000005, angle: 63.19999999999999 },\n { amplitude: -6.000000000000001, angle: 63.60000000000002 },\n { amplitude: -6.000000000000001, angle: 63.89999999999998 },\n { amplitude: -5.6000000000000005, angle: 64 },\n { amplitude: -6.000000000000001, angle: 64.30000000000001 },\n { amplitude: -5.6000000000000005, angle: 64.5 },\n { amplitude: -6.000000000000001, angle: 64.69999999999999 },\n { amplitude: -6.000000000000001, angle: 64.89999999999998 },\n { amplitude: -6.000000000000001, angle: 65.10000000000002 },\n { amplitude: -6.000000000000001, angle: 65.19999999999999 },\n { amplitude: -6.000000000000001, angle: 65.60000000000002 },\n { amplitude: -6.000000000000001, angle: 65.69999999999999 },\n { amplitude: -6.000000000000001, angle: 66 },\n { amplitude: -6.000000000000001, angle: 66.30000000000001 },\n { amplitude: -6.000000000000001, angle: 66.39999999999998 },\n { amplitude: -6.000000000000001, angle: 66.89999999999998 },\n { amplitude: -6.000000000000001, angle: 67 },\n { amplitude: -6.000000000000001, angle: 67.19999999999999 },\n { amplitude: -6.000000000000001, angle: 67.5 },\n { amplitude: -6.400000000000001, angle: 68 },\n { amplitude: -6.400000000000001, angle: 68.30000000000001 },\n { amplitude: -6.400000000000001, angle: 68.80000000000001 },\n { amplitude: -6.400000000000001, angle: 69.39999999999998 },\n { amplitude: -6.400000000000001, angle: 69.60000000000002 },\n { amplitude: -6.800000000000002, angle: 70 },\n { amplitude: -6.800000000000002, angle: 70.60000000000002 },\n { amplitude: -6.800000000000002, angle: 70.80000000000001 },\n { amplitude: -6.800000000000002, angle: 71.10000000000002 },\n { amplitude: -6.800000000000002, angle: 71.19999999999999 },\n { amplitude: -6.800000000000002, angle: 71.39999999999998 },\n { amplitude: -6.800000000000002, angle: 71.69999999999999 },\n { amplitude: -6.800000000000002, angle: 71.80000000000001 },\n { amplitude: -7.200000000000002, angle: 72 },\n { amplitude: -7.200000000000002, angle: 72.30000000000001 },\n { amplitude: -7.200000000000002, angle: 72.60000000000002 },\n { amplitude: -7.200000000000002, angle: 73.19999999999999 },\n { amplitude: -7.200000000000002, angle: 73.80000000000001 },\n { amplitude: -7.200000000000002, angle: 74.10000000000002 },\n { amplitude: -7.200000000000002, angle: 74.80000000000001 },\n { amplitude: -7.200000000000002, angle: 75 },\n { amplitude: -7.200000000000002, angle: 75.5 },\n { amplitude: -7.599999999999998, angle: 75.60000000000002 },\n { amplitude: -7.599999999999998, angle: 75.80000000000001 },\n { amplitude: -7.599999999999998, angle: 76.10000000000002 },\n { amplitude: -7.599999999999998, angle: 76.30000000000001 },\n { amplitude: -7.599999999999998, angle: 76.39999999999998 },\n { amplitude: -7.599999999999998, angle: 76.80000000000001 },\n { amplitude: -7.599999999999998, angle: 76.89999999999998 },\n { amplitude: -7.599999999999998, angle: 77.39999999999998 },\n { amplitude: -7.599999999999998, angle: 77.60000000000002 },\n { amplitude: -7.599999999999998, angle: 78 },\n { amplitude: -7.599999999999998, angle: 78.19999999999999 },\n { amplitude: -7.599999999999998, angle: 78.39999999999998 },\n { amplitude: -7.599999999999998, angle: 78.69999999999999 },\n { amplitude: -7.599999999999998, angle: 78.80000000000001 },\n { amplitude: -7.599999999999998, angle: 79.30000000000001 },\n { amplitude: -7.999999999999998, angle: 79.5 },\n { amplitude: -7.999999999999998, angle: 79.60000000000002 },\n { amplitude: -7.999999999999998, angle: 80.10000000000002 },\n { amplitude: -7.999999999999998, angle: 80.30000000000001 },\n { amplitude: -7.999999999999998, angle: 80.60000000000002 },\n { amplitude: -7.999999999999998, angle: 80.89999999999998 },\n { amplitude: -7.999999999999998, angle: 81.30000000000001 },\n { amplitude: -7.999999999999998, angle: 81.39999999999998 },\n { amplitude: -7.999999999999998, angle: 81.60000000000002 },\n { amplitude: -7.999999999999998, angle: 81.89999999999998 },\n { amplitude: -7.999999999999998, angle: 82.19999999999999 },\n { amplitude: -7.999999999999998, angle: 82.60000000000002 },\n { amplitude: -7.999999999999998, angle: 82.89999999999998 },\n { amplitude: -7.999999999999998, angle: 83.19999999999999 },\n { amplitude: -7.999999999999998, angle: 83.39999999999998 },\n { amplitude: -7.999999999999998, angle: 83.60000000000002 },\n { amplitude: -7.999999999999998, angle: 83.89999999999998 },\n { amplitude: -7.999999999999998, angle: 84.19999999999999 },\n { amplitude: -8.399999999999999, angle: 84.69999999999999 },\n { amplitude: -8.399999999999999, angle: 84.89999999999998 },\n { amplitude: -8.399999999999999, angle: 85.19999999999999 },\n { amplitude: -8.399999999999999, angle: 85.5 },\n { amplitude: -8.399999999999999, angle: 86 },\n { amplitude: -8.399999999999999, angle: 86.19999999999999 },\n { amplitude: -8.399999999999999, angle: 86.5 },\n { amplitude: -8.399999999999999, angle: 86.80000000000001 },\n { amplitude: -8.799999999999999, angle: 87.19999999999999 },\n { amplitude: -8.799999999999999, angle: 87.5 },\n { amplitude: -8.799999999999999, angle: 87.80000000000001 },\n { amplitude: -8.799999999999999, angle: 88.19999999999999 },\n { amplitude: -9.2, angle: 88.69999999999999 },\n { amplitude: -9.2, angle: 88.80000000000001 },\n { amplitude: -9.2, angle: 89.39999999999998 },\n { amplitude: -9.2, angle: 89.5 },\n { amplitude: -9.6, angle: 89.89999999999998 },\n { amplitude: -9.6, angle: 90.19999999999999 },\n { amplitude: -9.6, angle: 90.69999999999999 },\n { amplitude: -9.6, angle: 90.89999999999998 },\n { amplitude: -10, angle: 91.39999999999998 },\n { amplitude: -10, angle: 92 },\n { amplitude: -10, angle: 92.19999999999999 },\n { amplitude: -10.4, angle: 92.69999999999999 },\n { amplitude: -10.4, angle: 92.89999999999998 },\n { amplitude: -10.4, angle: 93.10000000000002 },\n { amplitude: -10.4, angle: 93.39999999999998 },\n { amplitude: -10.4, angle: 93.60000000000002 },\n { amplitude: -10.4, angle: 93.80000000000001 },\n { amplitude: -10.4, angle: 94.19999999999999 },\n { amplitude: -10.4, angle: 94.30000000000001 },\n { amplitude: -10.4, angle: 94.5 },\n { amplitude: -10.4, angle: 94.89999999999998 },\n { amplitude: -10.8, angle: 95.10000000000002 },\n { amplitude: -10.8, angle: 95.30000000000001 },\n { amplitude: -10.8, angle: 95.69999999999999 },\n { amplitude: -11.200000000000001, angle: 96.10000000000002 },\n { amplitude: -11.200000000000001, angle: 96.39999999999998 },\n { amplitude: -11.200000000000001, angle: 96.80000000000001 },\n { amplitude: -11.600000000000001, angle: 97.60000000000002 },\n { amplitude: -11.600000000000001, angle: 98 },\n { amplitude: -11.600000000000001, angle: 98.30000000000001 },\n { amplitude: -11.600000000000001, angle: 98.5 },\n { amplitude: -11.600000000000001, angle: 98.80000000000001 },\n { amplitude: -11.600000000000001, angle: 99.19999999999999 },\n { amplitude: -12.000000000000002, angle: 99.69999999999999 },\n { amplitude: -12.000000000000002, angle: 100.10000000000002 },\n { amplitude: -12.000000000000002, angle: 100.60000000000002 },\n { amplitude: -12.400000000000002, angle: 100.80000000000001 },\n { amplitude: -12.400000000000002, angle: 101 },\n { amplitude: -12.400000000000002, angle: 101.69999999999999 },\n { amplitude: -12.799999999999997, angle: 101.80000000000001 },\n { amplitude: -12.799999999999997, angle: 102 },\n { amplitude: -12.799999999999997, angle: 102.39999999999998 },\n { amplitude: -12.799999999999997, angle: 102.60000000000002 },\n { amplitude: -12.799999999999997, angle: 103.19999999999999 },\n { amplitude: -13.2, angle: 103.30000000000001 },\n { amplitude: -13.2, angle: 103.5 },\n { amplitude: -13.2, angle: 103.69999999999999 },\n { amplitude: -13.2, angle: 104.19999999999999 },\n { amplitude: -13.2, angle: 104.4 },\n { amplitude: -13.599999999999998, angle: 104.69999999999999 },\n { amplitude: -13.599999999999998, angle: 105.19999999999999 },\n { amplitude: -13.599999999999998, angle: 105.5 },\n { amplitude: -13.599999999999998, angle: 105.69999999999999 },\n { amplitude: -14, angle: 106.19999999999999 },\n { amplitude: -14, angle: 106.5 },\n { amplitude: -14, angle: 106.80000000000001 },\n { amplitude: -14.399999999999999, angle: 107.5 },\n { amplitude: -14.399999999999999, angle: 108.30000000000001 },\n { amplitude: -14.8, angle: 108.9 },\n { amplitude: -14.8, angle: 109.6 },\n { amplitude: -14.8, angle: 110 },\n { amplitude: -14.8, angle: 110.1 },\n { amplitude: -15.2, angle: 110.69999999999999 },\n { amplitude: -15.2, angle: 110.9 },\n { amplitude: -15.2, angle: 111.19999999999999 },\n { amplitude: -15.600000000000001, angle: 111.9 },\n { amplitude: -15.600000000000001, angle: 112.5 },\n { amplitude: -15.600000000000001, angle: 112.6 },\n { amplitude: -16, angle: 113.5 },\n { amplitude: -16, angle: 113.6 },\n { amplitude: -16, angle: 113.80000000000001 },\n { amplitude: -16.400000000000002, angle: 114.6 },\n { amplitude: -16.400000000000002, angle: 114.80000000000001 },\n { amplitude: -16.8, angle: 115.6 },\n { amplitude: -16.8, angle: 115.69999999999999 },\n { amplitude: -16.8, angle: 116.69999999999999 },\n { amplitude: -17.200000000000003, angle: 117 },\n { amplitude: -17.200000000000003, angle: 117.4 },\n { amplitude: -17.599999999999998, angle: 118.1 },\n { amplitude: -17.599999999999998, angle: 118.69999999999999 },\n { amplitude: -17.599999999999998, angle: 118.80000000000001 },\n { amplitude: -18, angle: 118.9 },\n { amplitude: -18, angle: 119.4 },\n { amplitude: -18, angle: 119.5 },\n { amplitude: -18, angle: 119.6 },\n { amplitude: -18.4, angle: 120.69999999999999 },\n { amplitude: -18.4, angle: 120.9 },\n { amplitude: -18.799999999999997, angle: 121 },\n { amplitude: -18.799999999999997, angle: 121.30000000000001 },\n { amplitude: -18.799999999999997, angle: 121.4 },\n { amplitude: -19.2, angle: 122.1 },\n { amplitude: -19.2, angle: 122.5 },\n { amplitude: -19.6, angle: 122.80000000000001 },\n { amplitude: -19.6, angle: 123.1 },\n { amplitude: -19.6, angle: 123.19999999999999 },\n { amplitude: -20, angle: 123.4 },\n { amplitude: -20, angle: 123.69999999999999 },\n { amplitude: -20, angle: 123.80000000000001 },\n { amplitude: -20.4, angle: 124.30000000000001 },\n { amplitude: -20.8, angle: 124.9 },\n { amplitude: -20.8, angle: 125.19999999999999 },\n { amplitude: -20.8, angle: 125.5 },\n { amplitude: -21.200000000000003, angle: 125.80000000000001 },\n { amplitude: -21.200000000000003, angle: 126.19999999999999 },\n { amplitude: -21.200000000000003, angle: 126.5 },\n { amplitude: -21.6, angle: 127 },\n { amplitude: -21.6, angle: 127.19999999999999 },\n { amplitude: -21.6, angle: 127.5 },\n { amplitude: -22, angle: 127.69999999999999 },\n { amplitude: -22, angle: 127.9 },\n { amplitude: -22, angle: 128.3 },\n { amplitude: -22, angle: 128.4 },\n { amplitude: -22.400000000000002, angle: 128.6 },\n { amplitude: -22.400000000000002, angle: 129 },\n { amplitude: -22.400000000000002, angle: 129.2 },\n { amplitude: -22.400000000000002, angle: 129.4 },\n { amplitude: -22.800000000000004, angle: 129.8 },\n { amplitude: -22.800000000000004, angle: 130.2 },\n { amplitude: -22.800000000000004, angle: 130.6 },\n { amplitude: -23.200000000000003, angle: 131.2 },\n { amplitude: -23.6, angle: 131.6 },\n { amplitude: -23.6, angle: 132 },\n { amplitude: -24, angle: 132.1 },\n { amplitude: -24.4, angle: 133 },\n { amplitude: -24.8, angle: 133.2 },\n { amplitude: -24.8, angle: 133.5 },\n { amplitude: -25.2, angle: 133.9 },\n { amplitude: -25.6, angle: 134.2 },\n { amplitude: -25.6, angle: 134.7 },\n { amplitude: -26, angle: 136.3 },\n { amplitude: -26.4, angle: 136.9 },\n { amplitude: -26.4, angle: 137.2 },\n { amplitude: -26.799999999999997, angle: 137.5 },\n { amplitude: -27.199999999999996, angle: 137.8 },\n { amplitude: -27.199999999999996, angle: 138.2 },\n { amplitude: -27.599999999999998, angle: 138.9 },\n { amplitude: -28, angle: 139.6 },\n { amplitude: -28.4, angle: 139.7 },\n { amplitude: -28.4, angle: 140.1 },\n { amplitude: -28.4, angle: 140.2 },\n { amplitude: -28.799999999999997, angle: 140.5 },\n { amplitude: -28.799999999999997, angle: 141.3 },\n { amplitude: -28.799999999999997, angle: 142 },\n { amplitude: -29.2, angle: 142.5 },\n { amplitude: -29.2, angle: 142.9 },\n { amplitude: -29.2, angle: 143.4 },\n { amplitude: -29.6, angle: 143.5 },\n { amplitude: -29.6, angle: 144.8 },\n { amplitude: -29.6, angle: 145.2 },\n { amplitude: -30, angle: 145.6 },\n { amplitude: -30, angle: 146 },\n { amplitude: -30.4, angle: 146.5 },\n { amplitude: -30.4, angle: 147.4 },\n { amplitude: -30.4, angle: 147.6 },\n { amplitude: -30.8, angle: 148.4 },\n { amplitude: -30.8, angle: 148.6 },\n { amplitude: -31.200000000000003, angle: 148.8 },\n { amplitude: -31.200000000000003, angle: 149.2 },\n { amplitude: -31.200000000000003, angle: 149.4 },\n { amplitude: -31.6, angle: 149.9 },\n { amplitude: -32, angle: 150.6 },\n { amplitude: -32, angle: 152.1 },\n { amplitude: -32, angle: 152.6 },\n { amplitude: -32, angle: 152.9 },\n { amplitude: -32.400000000000006, angle: 154.1 },\n { amplitude: -32.400000000000006, angle: 154.2 },\n { amplitude: -32.400000000000006, angle: 154.8 },\n { amplitude: -32.800000000000004, angle: 155.8 },\n { amplitude: -32.800000000000004, angle: 156.5 },\n { amplitude: -32.800000000000004, angle: 156.8 },\n { amplitude: -33.199999999999996, angle: 157.7 },\n { amplitude: -33.199999999999996, angle: 158.4 },\n { amplitude: -33.199999999999996, angle: 158.8 },\n { amplitude: -33.199999999999996, angle: 160.3 },\n { amplitude: -33.199999999999996, angle: 161 },\n { amplitude: -33.6, angle: 161.5 },\n { amplitude: -33.6, angle: 162.6 },\n { amplitude: -33.6, angle: 163.4 },\n { amplitude: -34, angle: 165.4 },\n { amplitude: -34, angle: 166.2 },\n { amplitude: -34, angle: 166.7 },\n { amplitude: -34.4, angle: 168.5 },\n { amplitude: -34.4, angle: 169.4 },\n { amplitude: -34.4, angle: 170.1 },\n { amplitude: -34.4, angle: 172 },\n { amplitude: -34.4, angle: 173.7 },\n { amplitude: -34.4, angle: 175.6 },\n { amplitude: -34.4, angle: 176.6 },\n { amplitude: -34.4, angle: 177.5 },\n { amplitude: -34.4, angle: 179.5 },\n { amplitude: -34.8, angle: 181.4 },\n { amplitude: -34.8, angle: 178.6 },\n { amplitude: -34.4, angle: 180.5 },\n { amplitude: -34.4, angle: 182.5 },\n { amplitude: -34.4, angle: 183.4 },\n { amplitude: -34.4, angle: 184.4 },\n { amplitude: -34.4, angle: 186.3 },\n { amplitude: -34.4, angle: 188 },\n { amplitude: -34.4, angle: 189.9 },\n { amplitude: -34.4, angle: 190.6 },\n { amplitude: -34.4, angle: 191.5 },\n { amplitude: -34, angle: 193.3 },\n { amplitude: -34, angle: 193.8 },\n { amplitude: -34, angle: 194.6 },\n { amplitude: -33.6, angle: 196.6 },\n { amplitude: -33.6, angle: 197.4 },\n { amplitude: -33.6, angle: 198.5 },\n { amplitude: -33.199999999999996, angle: 199 },\n { amplitude: -33.199999999999996, angle: 199.7 },\n { amplitude: -33.199999999999996, angle: 201.2 },\n { amplitude: -33.199999999999996, angle: 201.6 },\n { amplitude: -33.199999999999996, angle: 202.3 },\n { amplitude: -32.800000000000004, angle: 203.2 },\n { amplitude: -32.800000000000004, angle: 203.5 },\n { amplitude: -32.800000000000004, angle: 204.2 },\n { amplitude: -32.400000000000006, angle: 205.2 },\n { amplitude: -32.400000000000006, angle: 205.8 },\n { amplitude: -32.400000000000006, angle: 205.9 },\n { amplitude: -32, angle: 207.1 },\n { amplitude: -32, angle: 207.4 },\n { amplitude: -32, angle: 207.9 },\n { amplitude: -32, angle: 209.4 },\n { amplitude: -31.6, angle: 210.1 },\n { amplitude: -31.200000000000003, angle: 210.6 },\n { amplitude: -31.200000000000003, angle: 210.8 },\n { amplitude: -31.200000000000003, angle: 211.2 },\n { amplitude: -30.8, angle: 211.4 },\n { amplitude: -30.8, angle: 211.6 },\n { amplitude: -30.4, angle: 212.4 },\n { amplitude: -30.4, angle: 212.6 },\n { amplitude: -30.4, angle: 213.5 },\n { amplitude: -30, angle: 214 },\n { amplitude: -30, angle: 214.4 },\n { amplitude: -29.6, angle: 214.8 },\n { amplitude: -29.6, angle: 215.2 },\n { amplitude: -29.6, angle: 216.5 },\n { amplitude: -29.2, angle: 216.6 },\n { amplitude: -29.2, angle: 217.1 },\n { amplitude: -29.2, angle: 217.5 },\n { amplitude: -28.799999999999997, angle: 218 },\n { amplitude: -28.799999999999997, angle: 218.7 },\n { amplitude: -28.799999999999997, angle: 219.5 },\n { amplitude: -28.4, angle: 219.8 },\n { amplitude: -28.4, angle: 219.9 },\n { amplitude: -28.4, angle: 220.3 },\n { amplitude: -28, angle: 220.4 },\n { amplitude: -27.599999999999998, angle: 221.1 },\n { amplitude: -27.199999999999996, angle: 221.8 },\n { amplitude: -27.199999999999996, angle: 222.2 },\n { amplitude: -26.799999999999997, angle: 222.5 },\n { amplitude: -26.4, angle: 222.8 },\n { amplitude: -26.4, angle: 223.1 },\n { amplitude: -26, angle: 223.7 },\n { amplitude: -25.6, angle: 225.3 },\n { amplitude: -25.6, angle: 225.8 },\n { amplitude: -25.2, angle: 226.1 },\n { amplitude: -24.8, angle: 226.5 },\n { amplitude: -24.8, angle: 226.8 },\n { amplitude: -24.4, angle: 227 },\n { amplitude: -24, angle: 227.9 },\n { amplitude: -23.6, angle: 228 },\n { amplitude: -23.6, angle: 228.4 },\n { amplitude: -23.200000000000003, angle: 228.8 },\n { amplitude: -22.800000000000004, angle: 229.4 },\n { amplitude: -22.800000000000004, angle: 229.8 },\n { amplitude: -22.800000000000004, angle: 230.2 },\n { amplitude: -22.400000000000002, angle: 230.6 },\n { amplitude: -22.400000000000002, angle: 230.8 },\n { amplitude: -22.400000000000002, angle: 231 },\n { amplitude: -22.400000000000002, angle: 231.4 },\n { amplitude: -22, angle: 231.6 },\n { amplitude: -22, angle: 231.7 },\n { amplitude: -22, angle: 232.1 },\n { amplitude: -22, angle: 232.3 },\n { amplitude: -21.6, angle: 232.5 },\n { amplitude: -21.6, angle: 232.8 },\n { amplitude: -21.6, angle: 233 },\n { amplitude: -21.200000000000003, angle: 233.5 },\n { amplitude: -21.200000000000003, angle: 233.8 },\n { amplitude: -21.200000000000003, angle: 234.2 },\n { amplitude: -20.8, angle: 234.5 },\n { amplitude: -20.8, angle: 234.8 },\n { amplitude: -20.8, angle: 235.1 },\n { amplitude: -20.4, angle: 235.7 },\n { amplitude: -20, angle: 236.2 },\n { amplitude: -20, angle: 236.3 },\n { amplitude: -20, angle: 236.6 },\n { amplitude: -19.6, angle: 236.8 },\n { amplitude: -19.6, angle: 236.9 },\n { amplitude: -19.6, angle: 237.2 },\n { amplitude: -19.2, angle: 237.5 },\n { amplitude: -19.2, angle: 237.9 },\n { amplitude: -18.799999999999997, angle: 238.6 },\n { amplitude: -18.799999999999997, angle: 238.7 },\n { amplitude: -18.799999999999997, angle: 239 },\n { amplitude: -18.4, angle: 239.1 },\n { amplitude: -18.4, angle: 239.3 },\n { amplitude: -18, angle: 240.4 },\n { amplitude: -18, angle: 240.5 },\n { amplitude: -18, angle: 240.6 },\n { amplitude: -18, angle: 241.1 },\n { amplitude: -17.599999999999998, angle: 241.2 },\n { amplitude: -17.599999999999998, angle: 241.3 },\n { amplitude: -17.599999999999998, angle: 241.9 },\n { amplitude: -17.200000000000003, angle: 242.6 },\n { amplitude: -17.200000000000003, angle: 243 },\n { amplitude: -16.8, angle: 243.3 },\n { amplitude: -16.8, angle: 244.3 },\n { amplitude: -16.8, angle: 244.4 },\n { amplitude: -16.400000000000002, angle: 245.2 },\n { amplitude: -16.400000000000002, angle: 245.4 },\n { amplitude: -16, angle: 246.2 },\n { amplitude: -16, angle: 246.4 },\n { amplitude: -16, angle: 246.5 },\n { amplitude: -15.600000000000001, angle: 247.4 },\n { amplitude: -15.600000000000001, angle: 247.5 },\n { amplitude: -15.600000000000001, angle: 248.1 },\n { amplitude: -15.2, angle: 248.8 },\n { amplitude: -15.2, angle: 249.1 },\n { amplitude: -15.2, angle: 249.3 },\n { amplitude: -14.8, angle: 249.9 },\n { amplitude: -14.8, angle: 250 },\n { amplitude: -14.8, angle: 250.4 },\n { amplitude: -14.8, angle: 251.1 },\n { amplitude: -14.399999999999999, angle: 251.7 },\n { amplitude: -14.399999999999999, angle: 252.5 },\n { amplitude: -14, angle: 253.2 },\n { amplitude: -14, angle: 253.5 },\n { amplitude: -14, angle: 253.8 },\n { amplitude: -13.599999999999998, angle: 254.3 },\n { amplitude: -13.599999999999998, angle: 254.5 },\n { amplitude: -13.599999999999998, angle: 254.8 },\n { amplitude: -13.599999999999998, angle: 255.3 },\n { amplitude: -13.2, angle: 255.6 },\n { amplitude: -13.2, angle: 255.8 },\n { amplitude: -13.2, angle: 256.3 },\n { amplitude: -13.2, angle: 256.5 },\n { amplitude: -13.2, angle: 256.7 },\n { amplitude: -12.799999999999997, angle: 256.8 },\n { amplitude: -12.799999999999997, angle: 257.4 },\n { amplitude: -12.799999999999997, angle: 257.6 },\n { amplitude: -12.799999999999997, angle: 258 },\n { amplitude: -12.799999999999997, angle: 258.2 },\n { amplitude: -12.400000000000002, angle: 258.3 },\n { amplitude: -12.400000000000002, angle: 259 },\n { amplitude: -12.400000000000002, angle: 259.2 },\n { amplitude: -12.000000000000002, angle: 259.4 },\n { amplitude: -12.000000000000002, angle: 259.9 },\n { amplitude: -12.000000000000002, angle: 260.3 },\n { amplitude: -11.600000000000001, angle: 260.8 },\n { amplitude: -11.600000000000001, angle: 261.2 },\n { amplitude: -11.600000000000001, angle: 261.5 },\n { amplitude: -11.600000000000001, angle: 261.7 },\n { amplitude: -11.600000000000001, angle: 262 },\n { amplitude: -11.600000000000001, angle: 262.4 },\n { amplitude: -11.200000000000001, angle: 263.2 },\n { amplitude: -11.200000000000001, angle: 263.6 },\n { amplitude: -11.200000000000001, angle: 263.9 },\n { amplitude: -10.8, angle: 264.3 },\n { amplitude: -10.8, angle: 264.7 },\n { amplitude: -10.8, angle: 264.9 },\n { amplitude: -10.4, angle: 265.1 },\n { amplitude: -10.4, angle: 265.5 },\n { amplitude: -10.4, angle: 265.7 },\n { amplitude: -10.4, angle: 265.8 },\n { amplitude: -10.4, angle: 266.2 },\n { amplitude: -10.4, angle: 266.4 },\n { amplitude: -10.4, angle: 266.6 },\n { amplitude: -10.4, angle: 266.9 },\n { amplitude: -10.4, angle: 267.1 },\n { amplitude: -10.4, angle: 267.3 },\n { amplitude: -10, angle: 267.8 },\n { amplitude: -10, angle: 268 },\n { amplitude: -10, angle: 268.6 },\n { amplitude: -9.6, angle: 269.1 },\n { amplitude: -9.6, angle: 269.3 },\n { amplitude: -9.6, angle: 269.8 },\n { amplitude: -9.6, angle: 270.1 },\n { amplitude: -9.2, angle: 270.5 },\n { amplitude: -9.2, angle: 270.6 },\n { amplitude: -9.2, angle: 271.2 },\n { amplitude: -9.2, angle: 271.3 },\n { amplitude: -8.799999999999999, angle: 271.8 },\n { amplitude: -8.799999999999999, angle: 272.2 },\n { amplitude: -8.799999999999999, angle: 272.5 },\n { amplitude: -8.799999999999999, angle: 272.8 },\n { amplitude: -8.399999999999999, angle: 273.2 },\n { amplitude: -8.399999999999999, angle: 273.5 },\n { amplitude: -8.399999999999999, angle: 273.8 },\n { amplitude: -8.399999999999999, angle: 274 },\n { amplitude: -8.399999999999999, angle: 274.5 },\n { amplitude: -8.399999999999999, angle: 274.8 },\n { amplitude: -8.399999999999999, angle: 275.1 },\n { amplitude: -8.399999999999999, angle: 275.3 },\n { amplitude: -7.999999999999998, angle: 275.8 },\n { amplitude: -7.999999999999998, angle: 276.1 },\n { amplitude: -7.999999999999998, angle: 276.4 },\n { amplitude: -7.999999999999998, angle: 276.6 },\n { amplitude: -7.999999999999998, angle: 276.8 },\n { amplitude: -7.999999999999998, angle: 277.1 },\n { amplitude: -7.999999999999998, angle: 277.4 },\n { amplitude: -7.999999999999998, angle: 277.8 },\n { amplitude: -7.999999999999998, angle: 278.1 },\n { amplitude: -7.999999999999998, angle: 278.4 },\n { amplitude: -7.999999999999998, angle: 278.6 },\n { amplitude: -7.999999999999998, angle: 278.7 },\n { amplitude: -7.999999999999998, angle: 279.1 },\n { amplitude: -7.999999999999998, angle: 279.4 },\n { amplitude: -7.999999999999998, angle: 279.7 },\n { amplitude: -7.999999999999998, angle: 279.9 },\n { amplitude: -7.999999999999998, angle: 280.4 },\n { amplitude: -7.999999999999998, angle: 280.5 },\n { amplitude: -7.599999999999998, angle: 280.7 },\n { amplitude: -7.599999999999998, angle: 281.2 },\n { amplitude: -7.599999999999998, angle: 281.3 },\n { amplitude: -7.599999999999998, angle: 281.6 },\n { amplitude: -7.599999999999998, angle: 281.8 },\n { amplitude: -7.599999999999998, angle: 282 },\n { amplitude: -7.599999999999998, angle: 282.4 },\n { amplitude: -7.599999999999998, angle: 282.6 },\n { amplitude: -7.599999999999998, angle: 283.1 },\n { amplitude: -7.599999999999998, angle: 283.2 },\n { amplitude: -7.599999999999998, angle: 283.6 },\n { amplitude: -7.599999999999998, angle: 283.7 },\n { amplitude: -7.599999999999998, angle: 283.9 },\n { amplitude: -7.599999999999998, angle: 284.2 },\n { amplitude: -7.599999999999998, angle: 284.4 },\n { amplitude: -7.200000000000002, angle: 284.5 },\n { amplitude: -7.200000000000002, angle: 285 },\n { amplitude: -7.200000000000002, angle: 285.2 },\n { amplitude: -7.200000000000002, angle: 285.9 },\n { amplitude: -7.200000000000002, angle: 286.2 },\n { amplitude: -7.200000000000002, angle: 286.8 },\n { amplitude: -7.200000000000002, angle: 287.4 },\n { amplitude: -7.200000000000002, angle: 287.7 },\n { amplitude: -7.200000000000002, angle: 288 },\n { amplitude: -6.800000000000002, angle: 288.2 },\n { amplitude: -6.800000000000002, angle: 288.3 },\n { amplitude: -6.800000000000002, angle: 288.6 },\n { amplitude: -6.800000000000002, angle: 288.8 },\n { amplitude: -6.800000000000002, angle: 288.9 },\n { amplitude: -6.800000000000002, angle: 289.2 },\n { amplitude: -6.800000000000002, angle: 289.4 },\n { amplitude: -6.800000000000002, angle: 290 },\n { amplitude: -6.400000000000001, angle: 290.4 },\n { amplitude: -6.400000000000001, angle: 290.6 },\n { amplitude: -6.400000000000001, angle: 291.2 },\n { amplitude: -6.400000000000001, angle: 291.7 },\n { amplitude: -6.400000000000001, angle: 292 },\n { amplitude: -6.000000000000001, angle: 292.5 },\n { amplitude: -6.000000000000001, angle: 292.8 },\n { amplitude: -6.000000000000001, angle: 293 },\n { amplitude: -6.000000000000001, angle: 293.1 },\n { amplitude: -6.000000000000001, angle: 293.6 },\n { amplitude: -6.000000000000001, angle: 293.7 },\n { amplitude: -6.000000000000001, angle: 294 },\n { amplitude: -6.000000000000001, angle: 294.3 },\n { amplitude: -6.000000000000001, angle: 294.4 },\n { amplitude: -6.000000000000001, angle: 294.8 },\n { amplitude: -6.000000000000001, angle: 294.9 },\n { amplitude: -6.000000000000001, angle: 295.1 },\n { amplitude: -6.000000000000001, angle: 295.3 },\n { amplitude: -5.6000000000000005, angle: 295.5 },\n { amplitude: -6.000000000000001, angle: 295.7 },\n { amplitude: -5.6000000000000005, angle: 296 },\n { amplitude: -6.000000000000001, angle: 296.1 },\n { amplitude: -6.000000000000001, angle: 296.4 },\n { amplitude: -5.6000000000000005, angle: 296.8 },\n { amplitude: -5.6000000000000005, angle: 296.9 },\n { amplitude: -5.6000000000000005, angle: 297.4 },\n { amplitude: -5.6000000000000005, angle: 297.5 },\n { amplitude: -5.6000000000000005, angle: 297.8 },\n { amplitude: -5.2, angle: 298.1 },\n { amplitude: -5.2, angle: 298.4 },\n { amplitude: -5.2, angle: 298.7 },\n { amplitude: -5.2, angle: 299.1 },\n { amplitude: -5.2, angle: 299.4 },\n { amplitude: -5.2, angle: 299.6 },\n { amplitude: -5.2, angle: 299.8 },\n { amplitude: -5.2, angle: 299.9 },\n { amplitude: -5.2, angle: 300.2 },\n { amplitude: -4.8, angle: 300.5 },\n { amplitude: -4.8, angle: 300.8 },\n { amplitude: -4.8, angle: 301.1 },\n { amplitude: -4.8, angle: 301.5 },\n { amplitude: -4.8, angle: 302.1 },\n { amplitude: -4.8, angle: 302.2 },\n { amplitude: -4.8, angle: 302.3 },\n { amplitude: -4.8, angle: 303.1 },\n { amplitude: -4.8, angle: 303.6 },\n { amplitude: -4.8, angle: 304 },\n { amplitude: -4.8, angle: 304.3 },\n { amplitude: -4.8, angle: 304.8 },\n { amplitude: -4.8, angle: 305 },\n { amplitude: -4.8, angle: 305.7 },\n { amplitude: -4.3999999999999995, angle: 306.2 },\n { amplitude: -4.8, angle: 306.5 },\n { amplitude: -4.8, angle: 306.7 },\n { amplitude: -4.8, angle: 307 },\n { amplitude: -4.3999999999999995, angle: 307.1 },\n { amplitude: -4.8, angle: 307.3 },\n { amplitude: -4.8, angle: 307.4 },\n { amplitude: -4.8, angle: 308 },\n { amplitude: -4.8, angle: 308.1 },\n { amplitude: -4.8, angle: 308.5 },\n { amplitude: -4.3999999999999995, angle: 308.8 },\n { amplitude: -4.3999999999999995, angle: 309.1 },\n { amplitude: -4.8, angle: 309.3 },\n { amplitude: -4.8, angle: 309.7 },\n { amplitude: -4.8, angle: 310 },\n { amplitude: -4.8, angle: 310.4 },\n { amplitude: -4.3999999999999995, angle: 310.8 },\n { amplitude: -4.3999999999999995, angle: 311.6 },\n { amplitude: -4.3999999999999995, angle: 311.8 },\n { amplitude: -4.3999999999999995, angle: 312.2 },\n { amplitude: -4.3999999999999995, angle: 312.6 },\n { amplitude: -4.3999999999999995, angle: 312.8 },\n { amplitude: -4.3999999999999995, angle: 313 },\n { amplitude: -4.3999999999999995, angle: 313.2 },\n { amplitude: -4.3999999999999995, angle: 313.7 },\n { amplitude: -4.3999999999999995, angle: 313.9 },\n { amplitude: -4.3999999999999995, angle: 314.2 },\n { amplitude: -4.3999999999999995, angle: 314.4 },\n { amplitude: -4.3999999999999995, angle: 314.7 },\n { amplitude: -3.999999999999999, angle: 314.9 },\n { amplitude: -3.999999999999999, angle: 315.3 },\n { amplitude: -3.999999999999999, angle: 315.8 },\n { amplitude: -3.999999999999999, angle: 316 },\n { amplitude: -3.999999999999999, angle: 316.3 },\n { amplitude: -3.999999999999999, angle: 316.4 },\n { amplitude: -3.999999999999999, angle: 316.5 },\n { amplitude: -3.5999999999999988, angle: 316.7 },\n { amplitude: -3.999999999999999, angle: 316.9 },\n { amplitude: -3.5999999999999988, angle: 317 },\n { amplitude: -3.5999999999999988, angle: 317.2 },\n { amplitude: -3.5999999999999988, angle: 317.4 },\n { amplitude: -3.5999999999999988, angle: 317.6 },\n { amplitude: -3.5999999999999988, angle: 317.9 },\n { amplitude: -3.5999999999999988, angle: 318.2 },\n { amplitude: -3.5999999999999988, angle: 318.7 },\n { amplitude: -3.5999999999999988, angle: 319.3 },\n { amplitude: -3.5999999999999988, angle: 319.9 },\n { amplitude: -3.5999999999999988, angle: 320.1 },\n { amplitude: -3.5999999999999988, angle: 320.4 },\n { amplitude: -3.5999999999999988, angle: 320.5 },\n { amplitude: -3.5999999999999988, angle: 320.7 },\n { amplitude: -3.5999999999999988, angle: 320.9 },\n { amplitude: -3.1999999999999984, angle: 321 },\n { amplitude: -3.1999999999999984, angle: 321.6 },\n { amplitude: -3.1999999999999984, angle: 321.8 },\n { amplitude: -3.1999999999999984, angle: 322.2 },\n { amplitude: -3.1999999999999984, angle: 322.4 },\n { amplitude: -3.1999999999999984, angle: 322.6 },\n { amplitude: -3.1999999999999984, angle: 322.8 },\n { amplitude: -3.1999999999999984, angle: 323.1 },\n { amplitude: -3.1999999999999984, angle: 323.3 },\n { amplitude: -2.799999999999998, angle: 323.7 },\n { amplitude: -2.799999999999998, angle: 324.1 },\n { amplitude: -2.799999999999998, angle: 324.2 },\n { amplitude: -2.799999999999998, angle: 324.4 },\n { amplitude: -2.799999999999998, angle: 324.9 },\n { amplitude: -2.799999999999998, angle: 325.2 },\n { amplitude: -2.400000000000002, angle: 325.5 },\n { amplitude: -2.400000000000002, angle: 325.6 },\n { amplitude: -2.400000000000002, angle: 325.9 },\n { amplitude: -2.400000000000002, angle: 326.2 },\n { amplitude: -2.400000000000002, angle: 326.8 },\n { amplitude: -2.400000000000002, angle: 327 },\n { amplitude: -2.0000000000000018, angle: 327.3 },\n { amplitude: -2.0000000000000018, angle: 327.7 },\n { amplitude: -2.0000000000000018, angle: 328.2 },\n { amplitude: -1.6000000000000014, angle: 328.6 },\n { amplitude: -1.6000000000000014, angle: 328.7 },\n { amplitude: -1.6000000000000014, angle: 328.9 },\n { amplitude: -1.6000000000000014, angle: 329 },\n { amplitude: -1.6000000000000014, angle: 329.2 },\n { amplitude: -1.200000000000001, angle: 329.8 },\n { amplitude: -1.200000000000001, angle: 330.3 },\n { amplitude: -1.200000000000001, angle: 330.4 },\n { amplitude: -1.200000000000001, angle: 330.6 },\n { amplitude: -1.200000000000001, angle: 331 },\n { amplitude: -0.8000000000000007, angle: 331.2 },\n { amplitude: -1.200000000000001, angle: 331.3 },\n { amplitude: -1.200000000000001, angle: 331.8 },\n { amplitude: -0.8000000000000007, angle: 331.9 },\n { amplitude: -0.8000000000000007, angle: 332 },\n { amplitude: -0.8000000000000007, angle: 332.2 },\n { amplitude: -0.8000000000000007, angle: 332.6 },\n { amplitude: -0.8000000000000007, angle: 332.7 },\n { amplitude: -0.8000000000000007, angle: 332.9 },\n { amplitude: -0.8000000000000007, angle: 333.2 },\n { amplitude: -0.8000000000000007, angle: 333.3 },\n { amplitude: -0.8000000000000007, angle: 333.8 },\n { amplitude: -0.8000000000000007, angle: 334 },\n { amplitude: -0.8000000000000007, angle: 334.8 },\n { amplitude: -0.8000000000000007, angle: 335.2 },\n { amplitude: -0.8000000000000007, angle: 335.6 },\n { amplitude: -0.8000000000000007, angle: 335.7 },\n { amplitude: -0.40000000000000036, angle: 336 },\n { amplitude: -0.40000000000000036, angle: 336.3 },\n { amplitude: -0.8000000000000007, angle: 336.4 },\n { amplitude: -0.40000000000000036, angle: 336.6 },\n { amplitude: -0.8000000000000007, angle: 336.8 },\n { amplitude: -0.40000000000000036, angle: 337.2 },\n { amplitude: -0.40000000000000036, angle: 337.5 },\n { amplitude: -0.40000000000000036, angle: 337.7 },\n { amplitude: -0.8000000000000007, angle: 338 },\n { amplitude: -0.8000000000000007, angle: 338.1 },\n { amplitude: -0.40000000000000036, angle: 338.7 },\n { amplitude: -0.40000000000000036, angle: 339.2 },\n { amplitude: -0.40000000000000036, angle: 339.3 },\n { amplitude: -0.40000000000000036, angle: 339.4 },\n { amplitude: -0.40000000000000036, angle: 339.8 },\n { amplitude: -0.40000000000000036, angle: 340 },\n { amplitude: -0.40000000000000036, angle: 340.3 },\n { amplitude: -0.40000000000000036, angle: 340.5 },\n { amplitude: -0.40000000000000036, angle: 340.9 },\n { amplitude: -0.40000000000000036, angle: 341 },\n { amplitude: -0.40000000000000036, angle: 341.2 },\n { amplitude: -0.40000000000000036, angle: 341.8 },\n { amplitude: -0.40000000000000036, angle: 342.3 },\n { amplitude: -0.40000000000000036, angle: 342.7 },\n { amplitude: -0.40000000000000036, angle: 342.9 },\n { amplitude: -0.40000000000000036, angle: 343.3 },\n { amplitude: -0.40000000000000036, angle: 343.4 },\n { amplitude: -0.40000000000000036, angle: 343.5 },\n { amplitude: -0.40000000000000036, angle: 343.9 },\n { amplitude: -0.40000000000000036, angle: 344 },\n { amplitude: -0.8000000000000007, angle: 344.4 },\n { amplitude: -0.8000000000000007, angle: 344.9 },\n { amplitude: -0.8000000000000007, angle: 345.3 },\n { amplitude: -0.8000000000000007, angle: 345.5 },\n { amplitude: -0.8000000000000007, angle: 345.8 },\n { amplitude: -0.8000000000000007, angle: 346.1 },\n { amplitude: -0.8000000000000007, angle: 346.5 },\n { amplitude: -0.8000000000000007, angle: 346.9 },\n { amplitude: -0.8000000000000007, angle: 347.2 },\n { amplitude: -0.8000000000000007, angle: 347.6 },\n { amplitude: -0.8000000000000007, angle: 348 },\n { amplitude: -0.8000000000000007, angle: 348.2 },\n { amplitude: -0.8000000000000007, angle: 348.3 },\n { amplitude: -0.8000000000000007, angle: 348.6 },\n { amplitude: -0.8000000000000007, angle: 348.7 },\n { amplitude: -0.8000000000000007, angle: 348.8 },\n { amplitude: -0.8000000000000007, angle: 349.2 },\n { amplitude: -0.8000000000000007, angle: 349.6 },\n { amplitude: -0.8000000000000007, angle: 350 },\n { amplitude: -0.8000000000000007, angle: 350.4 },\n { amplitude: -0.8000000000000007, angle: 350.8 },\n { amplitude: -0.8000000000000007, angle: 350.9 },\n { amplitude: -0.8000000000000007, angle: 351.1 },\n { amplitude: -0.8000000000000007, angle: 351.5 },\n { amplitude: -0.8000000000000007, angle: 351.6 },\n { amplitude: -0.8000000000000007, angle: 351.9 },\n { amplitude: -0.40000000000000036, angle: 352.1 },\n { amplitude: -0.8000000000000007, angle: 352.5 },\n { amplitude: -0.40000000000000036, angle: 352.6 },\n { amplitude: -0.40000000000000036, angle: 353 },\n { amplitude: -0.40000000000000036, angle: 353.6 },\n { amplitude: -0.40000000000000036, angle: 354.8 },\n { amplitude: -0.40000000000000036, angle: 355.3 },\n { amplitude: -0.40000000000000036, angle: 355.7 },\n { amplitude: -0.40000000000000036, angle: 356 },\n { amplitude: -0.40000000000000036, angle: 356.4 },\n { amplitude: 0, angle: 356.5 },\n { amplitude: 0, angle: 356.8 },\n { amplitude: 0, angle: 356.9 },\n { amplitude: 0, angle: 357.1 },\n { amplitude: 0, angle: 357.3 },\n { amplitude: 0, angle: 357.6 },\n { amplitude: -0.40000000000000036, angle: 358 },\n { amplitude: -0.40000000000000036, angle: 358.1 },\n { amplitude: -0.40000000000000036, angle: 358.5 },\n { amplitude: -0.40000000000000036, angle: 359.1 },\n { amplitude: -0.40000000000000036, angle: 360 },\n ],\n },\n {\n name: '4KHz',\n data: [\n { angle: 0, amplitude: 0 },\n { angle: 0.8, amplitude: 0 },\n { angle: 0.9, amplitude: 0 },\n { angle: 1.5, amplitude: 0 },\n { angle: 2, amplitude: 0 },\n { angle: 2.4, amplitude: 0 },\n { angle: 2.5, amplitude: 0 },\n { angle: 2.7, amplitude: 0 },\n { angle: 2.9, amplitude: -0.40000000000000036 },\n { angle: 3.1, amplitude: -0.40000000000000036 },\n { angle: 3.2, amplitude: -0.40000000000000036 },\n { angle: 3.5, amplitude: -0.40000000000000036 },\n { angle: 3.6, amplitude: -0.40000000000000036 },\n { angle: 4.2, amplitude: -0.40000000000000036 },\n { angle: 4.3, amplitude: -0.40000000000000036 },\n { angle: 4.7, amplitude: -0.40000000000000036 },\n { angle: 4.8, amplitude: -0.40000000000000036 },\n { angle: 5.2, amplitude: -0.40000000000000036 },\n { angle: 5.4, amplitude: -0.40000000000000036 },\n { angle: 5.8, amplitude: -0.8000000000000007 },\n { angle: 5.9, amplitude: -0.8000000000000007 },\n { angle: 6.3, amplitude: -0.8000000000000007 },\n { angle: 6.5, amplitude: -0.8000000000000007 },\n { angle: 6.9, amplitude: -0.8000000000000007 },\n { angle: 7, amplitude: -0.8000000000000007 },\n { angle: 7.4, amplitude: -0.8000000000000007 },\n { angle: 7.6, amplitude: -0.8000000000000007 },\n { angle: 8, amplitude: -0.8000000000000007 },\n { angle: 8.4, amplitude: -0.8000000000000007 },\n { angle: 8.6, amplitude: -0.8000000000000007 },\n { angle: 9, amplitude: -0.8000000000000007 },\n { angle: 9.3, amplitude: -1.200000000000001 },\n { angle: 9.6, amplitude: -1.200000000000001 },\n { angle: 9.8, amplitude: -1.200000000000001 },\n { angle: 10.1, amplitude: -1.200000000000001 },\n { angle: 10.2, amplitude: -0.8000000000000007 },\n { angle: 10.4, amplitude: -0.8000000000000007 },\n { angle: 10.8, amplitude: -0.8000000000000007 },\n { angle: 10.9, amplitude: -0.8000000000000007 },\n { angle: 11.3, amplitude: -0.8000000000000007 },\n { angle: 11.4, amplitude: -0.8000000000000007 },\n { angle: 11.7, amplitude: -0.8000000000000007 },\n { angle: 11.9, amplitude: -0.8000000000000007 },\n { angle: 12, amplitude: -0.8000000000000007 },\n { angle: 12.3, amplitude: -1.200000000000001 },\n { angle: 12.6, amplitude: -1.200000000000001 },\n { angle: 12.9, amplitude: -0.8000000000000007 },\n { angle: 13.1, amplitude: -1.200000000000001 },\n { angle: 13.5, amplitude: -0.8000000000000007 },\n { angle: 14, amplitude: -1.200000000000001 },\n { angle: 14.2, amplitude: -1.200000000000001 },\n { angle: 14.3, amplitude: -1.200000000000001 },\n { angle: 14.6, amplitude: -1.200000000000001 },\n { angle: 14.7, amplitude: -1.200000000000001 },\n { angle: 15.1, amplitude: -0.8000000000000007 },\n { angle: 15.2, amplitude: -0.8000000000000007 },\n { angle: 15.4, amplitude: -1.200000000000001 },\n { angle: 15.6, amplitude: -0.8000000000000007 },\n { angle: 15.8, amplitude: -0.8000000000000007 },\n { angle: 15.9, amplitude: -0.8000000000000007 },\n { angle: 16.2, amplitude: -0.8000000000000007 },\n { angle: 16.5, amplitude: -1.200000000000001 },\n { angle: 16.8, amplitude: -1.200000000000001 },\n { angle: 16.9, amplitude: -1.200000000000001 },\n { angle: 17.1, amplitude: -1.200000000000001 },\n { angle: 17.5, amplitude: -1.200000000000001 },\n { angle: 18, amplitude: -1.200000000000001 },\n { angle: 18.3, amplitude: -1.200000000000001 },\n { angle: 18.6, amplitude: -1.200000000000001 },\n { angle: 18.7, amplitude: -1.200000000000001 },\n { angle: 19.1, amplitude: -1.200000000000001 },\n { angle: 19.2, amplitude: -0.8000000000000007 },\n { angle: 19.6, amplitude: -0.8000000000000007 },\n { angle: 20.2, amplitude: -1.200000000000001 },\n { angle: 20.4, amplitude: -1.200000000000001 },\n { angle: 20.5, amplitude: -1.200000000000001 },\n { angle: 20.8, amplitude: -0.8000000000000007 },\n { angle: 20.9, amplitude: -0.8000000000000007 },\n { angle: 21.1, amplitude: -1.200000000000001 },\n { angle: 21.3, amplitude: -0.8000000000000007 },\n { angle: 21.6, amplitude: -1.200000000000001 },\n { angle: 21.7, amplitude: -1.200000000000001 },\n { angle: 22, amplitude: -1.200000000000001 },\n { angle: 22.1, amplitude: -1.200000000000001 },\n { angle: 22.3, amplitude: -1.200000000000001 },\n { angle: 22.8, amplitude: -1.200000000000001 },\n { angle: 23, amplitude: -1.200000000000001 },\n { angle: 23.2, amplitude: -1.200000000000001 },\n { angle: 23.6, amplitude: -1.200000000000001 },\n { angle: 23.9, amplitude: -1.200000000000001 },\n { angle: 24.2, amplitude: -1.200000000000001 },\n { angle: 24.5, amplitude: -1.200000000000001 },\n { angle: 25.1, amplitude: -1.200000000000001 },\n { angle: 25.3, amplitude: -1.200000000000001 },\n { angle: 25.9, amplitude: -1.200000000000001 },\n { angle: 26.5, amplitude: -1.200000000000001 },\n { angle: 26.7, amplitude: -1.200000000000001 },\n { angle: 27.2, amplitude: -1.200000000000001 },\n { angle: 27.3, amplitude: -1.200000000000001 },\n { angle: 27.6, amplitude: -1.200000000000001 },\n { angle: 27.7, amplitude: -1.200000000000001 },\n { angle: 27.8, amplitude: -1.200000000000001 },\n { angle: 28.3, amplitude: -1.200000000000001 },\n { angle: 28.7, amplitude: -1.200000000000001 },\n { angle: 29.1, amplitude: -1.200000000000001 },\n { angle: 29.5, amplitude: -1.200000000000001 },\n { angle: 29.8, amplitude: -1.200000000000001 },\n { angle: 30.2, amplitude: -1.200000000000001 },\n { angle: 30.5, amplitude: -1.6000000000000014 },\n { angle: 30.9, amplitude: -1.200000000000001 },\n { angle: 31.3, amplitude: -1.200000000000001 },\n { angle: 31.6, amplitude: -1.6000000000000014 },\n { angle: 32.1, amplitude: -1.6000000000000014 },\n { angle: 32.2, amplitude: -1.6000000000000014 },\n { angle: 32.4, amplitude: -1.6000000000000014 },\n { angle: 32.5, amplitude: -1.6000000000000014 },\n { angle: 33, amplitude: -1.6000000000000014 },\n { angle: 33.1, amplitude: -2.0000000000000018 },\n { angle: 33.7, amplitude: -2.400000000000002 },\n { angle: 33.8, amplitude: -2.400000000000002 },\n { angle: 34, amplitude: -2.400000000000002 },\n { angle: 34.1, amplitude: -2.400000000000002 },\n { angle: 34.4, amplitude: -2.400000000000002 },\n { angle: 34.5, amplitude: -2.400000000000002 },\n { angle: 34.8, amplitude: -2.799999999999998 },\n { angle: 34.9, amplitude: -2.799999999999998 },\n { angle: 35, amplitude: -2.799999999999998 },\n { angle: 35.3, amplitude: -2.799999999999998 },\n { angle: 35.6, amplitude: -2.799999999999998 },\n { angle: 35.9, amplitude: -3.1999999999999984 },\n { angle: 36, amplitude: -3.1999999999999984 },\n { angle: 36.1, amplitude: -3.1999999999999984 },\n { angle: 36.6, amplitude: -3.1999999999999984 },\n { angle: 36.7, amplitude: -3.1999999999999984 },\n { angle: 36.9, amplitude: -3.1999999999999984 },\n { angle: 37, amplitude: -3.1999999999999984 },\n { angle: 37.4, amplitude: -3.1999999999999984 },\n { angle: 37.5, amplitude: -3.1999999999999984 },\n { angle: 37.7, amplitude: -3.1999999999999984 },\n { angle: 37.9, amplitude: -3.5999999999999988 },\n { angle: 38, amplitude: -3.5999999999999988 },\n { angle: 38.1, amplitude: -3.5999999999999988 },\n { angle: 38.4, amplitude: -3.5999999999999988 },\n { angle: 38.7, amplitude: -3.5999999999999988 },\n { angle: 38.9, amplitude: -3.5999999999999988 },\n { angle: 39, amplitude: -3.5999999999999988 },\n { angle: 39.4, amplitude: -3.5999999999999988 },\n { angle: 39.5, amplitude: -3.5999999999999988 },\n { angle: 39.6, amplitude: -3.5999999999999988 },\n { angle: 40.2, amplitude: -3.5999999999999988 },\n { angle: 40.3, amplitude: -3.5999999999999988 },\n { angle: 40.4, amplitude: -3.5999999999999988 },\n { angle: 40.6, amplitude: -3.5999999999999988 },\n { angle: 40.8, amplitude: -3.999999999999999 },\n { angle: 41.3, amplitude: -3.999999999999999 },\n { angle: 41.6, amplitude: -3.999999999999999 },\n { angle: 42.1, amplitude: -3.999999999999999 },\n { angle: 42.2, amplitude: -3.999999999999999 },\n { angle: 42.4, amplitude: -3.999999999999999 },\n { angle: 42.5, amplitude: -3.999999999999999 },\n { angle: 42.7, amplitude: -3.999999999999999 },\n { angle: 42.9, amplitude: -3.999999999999999 },\n { angle: 43.1, amplitude: -3.999999999999999 },\n { angle: 43.3, amplitude: -3.999999999999999 },\n { angle: 43.5, amplitude: -3.999999999999999 },\n { angle: 43.9, amplitude: -3.999999999999999 },\n { angle: 44.1, amplitude: -3.999999999999999 },\n { angle: 44.3, amplitude: -3.999999999999999 },\n { angle: 44.7, amplitude: -3.999999999999999 },\n { angle: 44.8, amplitude: -3.999999999999999 },\n { angle: 45, amplitude: -3.999999999999999 },\n { angle: 45.2, amplitude: -3.999999999999999 },\n { angle: 45.7, amplitude: -3.999999999999999 },\n { angle: 45.8, amplitude: -3.999999999999999 },\n { angle: 46, amplitude: -3.999999999999999 },\n { angle: 46.5, amplitude: -3.999999999999999 },\n { angle: 46.8, amplitude: -3.999999999999999 },\n { angle: 47.2, amplitude: -3.999999999999999 },\n { angle: 47.3, amplitude: -3.999999999999999 },\n { angle: 47.4, amplitude: -3.999999999999999 },\n { angle: 47.7, amplitude: -3.999999999999999 },\n { angle: 48.1, amplitude: -3.999999999999999 },\n { angle: 48.3, amplitude: -3.999999999999999 },\n { angle: 48.4, amplitude: -3.999999999999999 },\n { angle: 48.7, amplitude: -3.999999999999999 },\n { angle: 48.8, amplitude: -4.3999999999999995 },\n { angle: 49.4, amplitude: -3.999999999999999 },\n { angle: 49.5, amplitude: -4.3999999999999995 },\n { angle: 49.8, amplitude: -4.3999999999999995 },\n { angle: 50.3, amplitude: -4.3999999999999995 },\n { angle: 50.4, amplitude: -3.999999999999999 },\n { angle: 50.7, amplitude: -4.3999999999999995 },\n { angle: 50.8, amplitude: -4.3999999999999995 },\n { angle: 50.9, amplitude: -4.3999999999999995 },\n { angle: 51.3, amplitude: -4.3999999999999995 },\n { angle: 51.5, amplitude: -4.3999999999999995 },\n { angle: 51.6, amplitude: -4.3999999999999995 },\n { angle: 51.7, amplitude: -4.3999999999999995 },\n { angle: 52.1, amplitude: -4.3999999999999995 },\n { angle: 52.4, amplitude: -4.3999999999999995 },\n { angle: 52.5, amplitude: -4.3999999999999995 },\n { angle: 53, amplitude: -4.3999999999999995 },\n { angle: 53.4, amplitude: -4.8 },\n { angle: 53.7, amplitude: -4.3999999999999995 },\n { angle: 53.9, amplitude: -4.3999999999999995 },\n { angle: 54.2, amplitude: -4.8 },\n { angle: 54.7, amplitude: -4.3999999999999995 },\n { angle: 55.1, amplitude: -4.3999999999999995 },\n { angle: 55.2, amplitude: -4.8 },\n { angle: 56, amplitude: -4.8 },\n { angle: 56.2, amplitude: -4.8 },\n { angle: 56.4, amplitude: -4.8 },\n { angle: 56.6, amplitude: -4.8 },\n { angle: 56.9, amplitude: -4.8 },\n { angle: 57, amplitude: -4.8 },\n { angle: 57.2, amplitude: -4.8 },\n { angle: 57.6, amplitude: -4.8 },\n { angle: 57.7, amplitude: -4.8 },\n { angle: 57.8, amplitude: -4.8 },\n { angle: 57.9, amplitude: -4.8 },\n { angle: 58.2, amplitude: -4.8 },\n { angle: 58.3, amplitude: -4.8 },\n { angle: 58.8, amplitude: -5.2 },\n { angle: 59.2, amplitude: -4.8 },\n { angle: 59.6, amplitude: -5.2 },\n { angle: 60.2, amplitude: -5.2 },\n { angle: 60.3, amplitude: -5.2 },\n { angle: 60.6, amplitude: -5.2 },\n { angle: 60.8, amplitude: -5.6000000000000005 },\n { angle: 61.2, amplitude: -5.6000000000000005 },\n { angle: 61.8, amplitude: -5.6000000000000005 },\n { angle: 62, amplitude: -5.6000000000000005 },\n { angle: 62.1, amplitude: -5.6000000000000005 },\n { angle: 62.5, amplitude: -5.6000000000000005 },\n { angle: 62.7, amplitude: -5.6000000000000005 },\n { angle: 63, amplitude: -5.6000000000000005 },\n { angle: 63.1, amplitude: -5.6000000000000005 },\n { angle: 63.4, amplitude: -5.6000000000000005 },\n { angle: 63.6, amplitude: -6.000000000000001 },\n { angle: 63.8, amplitude: -6.000000000000001 },\n { angle: 63.9, amplitude: -6.000000000000001 },\n { angle: 64.3, amplitude: -6.000000000000001 },\n { angle: 64.5, amplitude: -6.000000000000001 },\n { angle: 64.7, amplitude: -6.000000000000001 },\n { angle: 65.2, amplitude: -6.000000000000001 },\n { angle: 65.4, amplitude: -6.000000000000001 },\n { angle: 66.1, amplitude: -6.000000000000001 },\n { angle: 66.4, amplitude: -6.400000000000001 },\n { angle: 66.8, amplitude: -6.400000000000001 },\n { angle: 66.9, amplitude: -6.400000000000001 },\n { angle: 67.3, amplitude: -6.400000000000001 },\n { angle: 67.9, amplitude: -6.400000000000001 },\n { angle: 68.5, amplitude: -6.800000000000002 },\n { angle: 68.8, amplitude: -6.800000000000002 },\n { angle: 69.4, amplitude: -6.400000000000001 },\n { angle: 69.8, amplitude: -6.800000000000002 },\n { angle: 70.4, amplitude: -6.800000000000002 },\n { angle: 70.6, amplitude: -6.800000000000002 },\n { angle: 70.8, amplitude: -6.800000000000002 },\n { angle: 71.1, amplitude: -6.800000000000002 },\n { angle: 71.8, amplitude: -6.800000000000002 },\n { angle: 71.9, amplitude: -6.800000000000002 },\n { angle: 72.5, amplitude: -6.800000000000002 },\n { angle: 72.7, amplitude: -6.800000000000002 },\n { angle: 73.1, amplitude: -7.200000000000002 },\n { angle: 73.8, amplitude: -7.200000000000002 },\n { angle: 73.9, amplitude: -7.200000000000002 },\n { angle: 74.2, amplitude: -7.200000000000002 },\n { angle: 74.5, amplitude: -7.200000000000002 },\n { angle: 75, amplitude: -7.200000000000002 },\n { angle: 75.1, amplitude: -7.200000000000002 },\n { angle: 75.5, amplitude: -7.200000000000002 },\n { angle: 75.6, amplitude: -7.599999999999998 },\n { angle: 75.8, amplitude: -7.599999999999998 },\n { angle: 76.1, amplitude: -7.599999999999998 },\n { angle: 76.2, amplitude: -7.599999999999998 },\n { angle: 76.4, amplitude: -7.599999999999998 },\n { angle: 77, amplitude: -7.599999999999998 },\n { angle: 77.7, amplitude: -7.599999999999998 },\n { angle: 78.2, amplitude: -7.599999999999998 },\n { angle: 78.6, amplitude: -7.999999999999998 },\n { angle: 79.3, amplitude: -7.999999999999998 },\n { angle: 79.4, amplitude: -7.999999999999998 },\n { angle: 79.9, amplitude: -7.999999999999998 },\n { angle: 80.1, amplitude: -7.999999999999998 },\n { angle: 80.9, amplitude: -7.999999999999998 },\n { angle: 81.4, amplitude: -7.999999999999998 },\n { angle: 81.6, amplitude: -7.999999999999998 },\n { angle: 81.9, amplitude: -7.999999999999998 },\n { angle: 82.1, amplitude: -7.999999999999998 },\n { angle: 82.9, amplitude: -7.999999999999998 },\n { angle: 83.2, amplitude: -8.399999999999999 },\n { angle: 83.4, amplitude: -8.399999999999999 },\n { angle: 83.5, amplitude: -8.399999999999999 },\n { angle: 84.2, amplitude: -8.399999999999999 },\n { angle: 84.5, amplitude: -8.399999999999999 },\n { angle: 84.7, amplitude: -8.399999999999999 },\n { angle: 84.9, amplitude: -8.399999999999999 },\n { angle: 85.2, amplitude: -8.399999999999999 },\n { angle: 85.4, amplitude: -8.399999999999999 },\n { angle: 85.5, amplitude: -8.399999999999999 },\n { angle: 85.9, amplitude: -8.399999999999999 },\n { angle: 86, amplitude: -8.399999999999999 },\n { angle: 86.2, amplitude: -8.399999999999999 },\n { angle: 86.5, amplitude: -8.399999999999999 },\n { angle: 86.8, amplitude: -8.799999999999999 },\n { angle: 87.8, amplitude: -8.799999999999999 },\n { angle: 88, amplitude: -9.2 },\n { angle: 88.5, amplitude: -9.2 },\n { angle: 89.3, amplitude: -9.2 },\n { angle: 89.9, amplitude: -9.6 },\n { angle: 90, amplitude: -9.6 },\n { angle: 90.6, amplitude: -9.6 },\n { angle: 90.7, amplitude: -9.6 },\n { angle: 90.9, amplitude: -10 },\n { angle: 91.4, amplitude: -10 },\n { angle: 91.6, amplitude: -10 },\n { angle: 92, amplitude: -10 },\n { angle: 92.2, amplitude: -10 },\n { angle: 92.3, amplitude: -10 },\n { angle: 92.7, amplitude: -10.4 },\n { angle: 92.9, amplitude: -10.4 },\n { angle: 93.1, amplitude: -10.4 },\n { angle: 93.4, amplitude: -10.4 },\n { angle: 93.6, amplitude: -10.4 },\n { angle: 93.8, amplitude: -10.4 },\n { angle: 94.2, amplitude: -10.8 },\n { angle: 94.4, amplitude: -10.8 },\n { angle: 94.9, amplitude: -10.8 },\n { angle: 95.1, amplitude: -10.8 },\n { angle: 95.3, amplitude: -11.200000000000001 },\n { angle: 95.7, amplitude: -11.200000000000001 },\n { angle: 95.9, amplitude: -11.200000000000001 },\n { angle: 96.1, amplitude: -11.200000000000001 },\n { angle: 96.5, amplitude: -11.200000000000001 },\n { angle: 96.7, amplitude: -11.200000000000001 },\n { angle: 96.9, amplitude: -11.600000000000001 },\n { angle: 97.3, amplitude: -11.600000000000001 },\n { angle: 97.5, amplitude: -11.600000000000001 },\n { angle: 97.7, amplitude: -11.600000000000001 },\n { angle: 98.1, amplitude: -11.600000000000001 },\n { angle: 98.3, amplitude: -12.000000000000002 },\n { angle: 98.6, amplitude: -12.000000000000002 },\n { angle: 99, amplitude: -12.000000000000002 },\n { angle: 99.2, amplitude: -12.000000000000002 },\n { angle: 99.4, amplitude: -12.400000000000002 },\n { angle: 99.5, amplitude: -12.400000000000002 },\n { angle: 99.8, amplitude: -12.400000000000002 },\n { angle: 99.9, amplitude: -12.400000000000002 },\n { angle: 100.1, amplitude: -12.799999999999997 },\n { angle: 100.2, amplitude: -12.799999999999997 },\n { angle: 100.8, amplitude: -12.799999999999997 },\n { angle: 101, amplitude: -12.799999999999997 },\n { angle: 101.1, amplitude: -12.799999999999997 },\n { angle: 101.7, amplitude: -13.2 },\n { angle: 101.8, amplitude: -13.2 },\n { angle: 102, amplitude: -13.2 },\n { angle: 102.7, amplitude: -13.599999999999998 },\n { angle: 102.9, amplitude: -14 },\n { angle: 103.3, amplitude: -14 },\n { angle: 103.7, amplitude: -14 },\n { angle: 103.9, amplitude: -14 },\n { angle: 104.1, amplitude: -14 },\n { angle: 104.3, amplitude: -14 },\n { angle: 105.4, amplitude: -14.399999999999999 },\n { angle: 105.8, amplitude: -14.399999999999999 },\n { angle: 106.1, amplitude: -14.8 },\n { angle: 106.8, amplitude: -14.8 },\n { angle: 107, amplitude: -14.8 },\n { angle: 107.1, amplitude: -14.8 },\n { angle: 107.3, amplitude: -14.8 },\n { angle: 107.4, amplitude: -14.8 },\n { angle: 107.8, amplitude: -14.8 },\n { angle: 107.9, amplitude: -14.8 },\n { angle: 108.2, amplitude: -15.2 },\n { angle: 108.4, amplitude: -15.2 },\n { angle: 108.9, amplitude: -15.2 },\n { angle: 110.2, amplitude: -15.2 },\n { angle: 111.1, amplitude: -15.600000000000001 },\n { angle: 111.5, amplitude: -15.600000000000001 },\n { angle: 111.8, amplitude: -16 },\n { angle: 112.4, amplitude: -16 },\n { angle: 112.6, amplitude: -16 },\n { angle: 112.9, amplitude: -16 },\n { angle: 113, amplitude: -16 },\n { angle: 113.6, amplitude: -16.400000000000002 },\n { angle: 113.9, amplitude: -16.400000000000002 },\n { angle: 114.4, amplitude: -16.400000000000002 },\n { angle: 114.7, amplitude: -16.8 },\n { angle: 115.4, amplitude: -16.8 },\n { angle: 115.5, amplitude: -16.8 },\n { angle: 115.7, amplitude: -17.200000000000003 },\n { angle: 116.2, amplitude: -17.200000000000003 },\n { angle: 116.9, amplitude: -17.200000000000003 },\n { angle: 117.4, amplitude: -17.599999999999998 },\n { angle: 117.7, amplitude: -17.599999999999998 },\n { angle: 117.8, amplitude: -17.599999999999998 },\n { angle: 118.1, amplitude: -17.599999999999998 },\n { angle: 118.6, amplitude: -17.599999999999998 },\n { angle: 118.9, amplitude: -18 },\n { angle: 119.3, amplitude: -18 },\n { angle: 119.4, amplitude: -18 },\n { angle: 119.6, amplitude: -18 },\n { angle: 119.8, amplitude: -18.4 },\n { angle: 120.7, amplitude: -18.4 },\n { angle: 121, amplitude: -18.799999999999997 },\n { angle: 121.8, amplitude: -18.799999999999997 },\n { angle: 121.9, amplitude: -18.799999999999997 },\n { angle: 122.2, amplitude: -19.2 },\n { angle: 122.3, amplitude: -19.2 },\n { angle: 122.8, amplitude: -18.799999999999997 },\n { angle: 122.9, amplitude: -19.2 },\n { angle: 123.2, amplitude: -19.2 },\n { angle: 123.3, amplitude: -19.2 },\n { angle: 123.9, amplitude: -19.2 },\n { angle: 124.2, amplitude: -19.6 },\n { angle: 124.3, amplitude: -19.6 },\n { angle: 124.5, amplitude: -19.6 },\n { angle: 124.9, amplitude: -20 },\n { angle: 125.5, amplitude: -19.6 },\n { angle: 125.8, amplitude: -20 },\n { angle: 125.9, amplitude: -20 },\n { angle: 126.1, amplitude: -20 },\n { angle: 127, amplitude: -20.4 },\n { angle: 127.2, amplitude: -20.4 },\n { angle: 127.5, amplitude: -20.4 },\n { angle: 127.7, amplitude: -20.4 },\n { angle: 127.8, amplitude: -20.4 },\n { angle: 128.2, amplitude: -20.8 },\n { angle: 128.3, amplitude: -20.8 },\n { angle: 128.8, amplitude: -20.8 },\n { angle: 129.6, amplitude: -21.200000000000003 },\n { angle: 129.7, amplitude: -21.200000000000003 },\n { angle: 130.3, amplitude: -21.6 },\n { angle: 130.5, amplitude: -21.6 },\n { angle: 130.7, amplitude: -21.6 },\n { angle: 131, amplitude: -22 },\n { angle: 131.2, amplitude: -22 },\n { angle: 131.8, amplitude: -22 },\n { angle: 132, amplitude: -22 },\n { angle: 132.6, amplitude: -22.400000000000002 },\n { angle: 132.8, amplitude: -22.400000000000002 },\n { angle: 133.4, amplitude: -22.800000000000004 },\n { angle: 133.7, amplitude: -22.800000000000004 },\n { angle: 134.3, amplitude: -22.800000000000004 },\n { angle: 135.2, amplitude: -23.200000000000003 },\n { angle: 135.4, amplitude: -23.200000000000003 },\n { angle: 136.1, amplitude: -23.6 },\n { angle: 137, amplitude: -23.6 },\n { angle: 137.2, amplitude: -23.6 },\n { angle: 137.5, amplitude: -24 },\n { angle: 138, amplitude: -24 },\n { angle: 138.2, amplitude: -24 },\n { angle: 138.5, amplitude: -24 },\n { angle: 139, amplitude: -24 },\n { angle: 139.5, amplitude: -24.4 },\n { angle: 140, amplitude: -24.4 },\n { angle: 140.3, amplitude: -24.4 },\n { angle: 140.8, amplitude: -24.8 },\n { angle: 141.1, amplitude: -24.8 },\n { angle: 141.2, amplitude: -24.8 },\n { angle: 141.7, amplitude: -25.2 },\n { angle: 141.8, amplitude: -25.2 },\n { angle: 142.2, amplitude: -25.6 },\n { angle: 142.5, amplitude: -25.6 },\n { angle: 142.8, amplitude: -25.6 },\n { angle: 143.4, amplitude: -26 },\n { angle: 143.7, amplitude: -26.4 },\n { angle: 144, amplitude: -26.4 },\n { angle: 144.3, amplitude: -26.4 },\n { angle: 144.7, amplitude: -26.4 },\n { angle: 145, amplitude: -26.4 },\n { angle: 145.5, amplitude: -26.799999999999997 },\n { angle: 146.7, amplitude: -27.199999999999996 },\n { angle: 148.4, amplitude: -27.599999999999998 },\n { angle: 148.8, amplitude: -27.599999999999998 },\n { angle: 149.3, amplitude: -27.599999999999998 },\n { angle: 149.6, amplitude: -28 },\n { angle: 150.5, amplitude: -28 },\n { angle: 150.9, amplitude: -28 },\n { angle: 152.1, amplitude: -28.4 },\n { angle: 152.3, amplitude: -28.4 },\n { angle: 153.1, amplitude: -28.799999999999997 },\n { angle: 153.3, amplitude: -28.799999999999997 },\n { angle: 154.6, amplitude: -28.799999999999997 },\n { angle: 154.8, amplitude: -29.2 },\n { angle: 156.1, amplitude: -29.2 },\n { angle: 157.3, amplitude: -29.6 },\n { angle: 158.2, amplitude: -30 },\n { angle: 158.7, amplitude: -30 },\n { angle: 159, amplitude: -30 },\n { angle: 160, amplitude: -30 },\n { angle: 160.5, amplitude: -30 },\n { angle: 161, amplitude: -30.4 },\n { angle: 161.9, amplitude: -30.4 },\n { angle: 162, amplitude: -30.4 },\n { angle: 162.4, amplitude: -30.8 },\n { angle: 163.5, amplitude: -30.8 },\n { angle: 164, amplitude: -30.8 },\n { angle: 164.4, amplitude: -30.8 },\n { angle: 165.3, amplitude: -31.200000000000003 },\n { angle: 165.7, amplitude: -31.200000000000003 },\n { angle: 166.3, amplitude: -31.200000000000003 },\n { angle: 167.5, amplitude: -31.200000000000003 },\n { angle: 168, amplitude: -31.200000000000003 },\n { angle: 168.3, amplitude: -31.6 },\n { angle: 169.5, amplitude: -31.6 },\n { angle: 170, amplitude: -31.6 },\n { angle: 170.5, amplitude: -32 },\n { angle: 171.8, amplitude: -32 },\n { angle: 173.1, amplitude: -32 },\n { angle: 174.3, amplitude: -32 },\n { angle: 174.9, amplitude: -32 },\n { angle: 175.5, amplitude: -32.400000000000006 },\n { angle: 176.9, amplitude: -32.400000000000006 },\n { angle: 177.5, amplitude: -32.400000000000006 },\n { angle: 178.2, amplitude: -32.400000000000006 },\n { angle: 179.6, amplitude: -32.400000000000006 },\n { angle: 182.6, amplitude: -32.800000000000004 },\n { amplitude: -32.800000000000004, angle: 177.4 },\n { amplitude: -32.400000000000006, angle: 180.4 },\n { amplitude: -32.400000000000006, angle: 181.8 },\n { amplitude: -32.400000000000006, angle: 182.5 },\n { amplitude: -32.400000000000006, angle: 183.1 },\n { amplitude: -32.400000000000006, angle: 184.5 },\n { amplitude: -32, angle: 185.1 },\n { amplitude: -32, angle: 185.7 },\n { amplitude: -32, angle: 186.9 },\n { amplitude: -32, angle: 188.2 },\n { amplitude: -32, angle: 189.5 },\n { amplitude: -31.6, angle: 190 },\n { amplitude: -31.6, angle: 190.5 },\n { amplitude: -31.6, angle: 191.7 },\n { amplitude: -31.200000000000003, angle: 192 },\n { amplitude: -31.200000000000003, angle: 192.5 },\n { amplitude: -31.200000000000003, angle: 193.7 },\n { amplitude: -31.200000000000003, angle: 194.3 },\n { amplitude: -31.200000000000003, angle: 194.7 },\n { amplitude: -30.8, angle: 195.6 },\n { amplitude: -30.8, angle: 196 },\n { amplitude: -30.8, angle: 196.5 },\n { amplitude: -30.8, angle: 197.6 },\n { amplitude: -30.4, angle: 198 },\n { amplitude: -30.4, angle: 198.1 },\n { amplitude: -30.4, angle: 199 },\n { amplitude: -30, angle: 199.5 },\n { amplitude: -30, angle: 200 },\n { amplitude: -30, angle: 201 },\n { amplitude: -30, angle: 201.3 },\n { amplitude: -30, angle: 201.8 },\n { amplitude: -29.6, angle: 202.7 },\n { amplitude: -29.2, angle: 203.9 },\n { amplitude: -29.2, angle: 205.2 },\n { amplitude: -28.799999999999997, angle: 205.4 },\n { amplitude: -28.799999999999997, angle: 206.7 },\n { amplitude: -28.799999999999997, angle: 206.9 },\n { amplitude: -28.4, angle: 207.7 },\n { amplitude: -28.4, angle: 207.9 },\n { amplitude: -28, angle: 209.1 },\n { amplitude: -28, angle: 209.5 },\n { amplitude: -28, angle: 210.4 },\n { amplitude: -27.599999999999998, angle: 210.7 },\n { amplitude: -27.599999999999998, angle: 211.2 },\n { amplitude: -27.599999999999998, angle: 211.6 },\n { amplitude: -27.199999999999996, angle: 213.3 },\n { amplitude: -26.799999999999997, angle: 214.5 },\n { amplitude: -26.4, angle: 215 },\n { amplitude: -26.4, angle: 215.3 },\n { amplitude: -26.4, angle: 215.7 },\n { amplitude: -26.4, angle: 216 },\n { amplitude: -26.4, angle: 216.3 },\n { amplitude: -26, angle: 216.6 },\n { amplitude: -25.6, angle: 217.2 },\n { amplitude: -25.6, angle: 217.5 },\n { amplitude: -25.6, angle: 217.8 },\n { amplitude: -25.2, angle: 218.2 },\n { amplitude: -25.2, angle: 218.3 },\n { amplitude: -24.8, angle: 218.8 },\n { amplitude: -24.8, angle: 218.9 },\n { amplitude: -24.8, angle: 219.2 },\n { amplitude: -24.4, angle: 219.7 },\n { amplitude: -24.4, angle: 220 },\n { amplitude: -24.4, angle: 220.5 },\n { amplitude: -24, angle: 221 },\n { amplitude: -24, angle: 221.5 },\n { amplitude: -24, angle: 221.8 },\n { amplitude: -24, angle: 222 },\n { amplitude: -24, angle: 222.5 },\n { amplitude: -23.6, angle: 222.8 },\n { amplitude: -23.6, angle: 223 },\n { amplitude: -23.6, angle: 223.9 },\n { amplitude: -23.200000000000003, angle: 224.6 },\n { amplitude: -23.200000000000003, angle: 224.8 },\n { amplitude: -22.800000000000004, angle: 225.7 },\n { amplitude: -22.800000000000004, angle: 226.3 },\n { amplitude: -22.800000000000004, angle: 226.6 },\n { amplitude: -22.400000000000002, angle: 227.2 },\n { amplitude: -22.400000000000002, angle: 227.4 },\n { amplitude: -22, angle: 228 },\n { amplitude: -22, angle: 228.2 },\n { amplitude: -22, angle: 228.8 },\n { amplitude: -22, angle: 229 },\n { amplitude: -21.6, angle: 229.3 },\n { amplitude: -21.6, angle: 229.5 },\n { amplitude: -21.6, angle: 229.7 },\n { amplitude: -21.200000000000003, angle: 230.3 },\n { amplitude: -21.200000000000003, angle: 230.4 },\n { amplitude: -20.8, angle: 231.2 },\n { amplitude: -20.8, angle: 231.7 },\n { amplitude: -20.8, angle: 231.8 },\n { amplitude: -20.4, angle: 232.2 },\n { amplitude: -20.4, angle: 232.3 },\n { amplitude: -20.4, angle: 232.5 },\n { amplitude: -20.4, angle: 232.8 },\n { amplitude: -20.4, angle: 233 },\n { amplitude: -20, angle: 233.9 },\n { amplitude: -20, angle: 234.1 },\n { amplitude: -20, angle: 234.2 },\n { amplitude: -19.6, angle: 234.5 },\n { amplitude: -20, angle: 235.1 },\n { amplitude: -19.6, angle: 235.5 },\n { amplitude: -19.6, angle: 235.7 },\n { amplitude: -19.6, angle: 235.8 },\n { amplitude: -19.2, angle: 236.1 },\n { amplitude: -19.2, angle: 236.7 },\n { amplitude: -19.2, angle: 236.8 },\n { amplitude: -19.2, angle: 237.1 },\n { amplitude: -18.799999999999997, angle: 237.2 },\n { amplitude: -19.2, angle: 237.7 },\n { amplitude: -19.2, angle: 237.8 },\n { amplitude: -18.799999999999997, angle: 238.1 },\n { amplitude: -18.799999999999997, angle: 238.2 },\n { amplitude: -18.799999999999997, angle: 239 },\n { amplitude: -18.4, angle: 239.3 },\n { amplitude: -18.4, angle: 240.2 },\n { amplitude: -18, angle: 240.4 },\n { amplitude: -18, angle: 240.6 },\n { amplitude: -18, angle: 240.7 },\n { amplitude: -18, angle: 241.1 },\n { amplitude: -17.599999999999998, angle: 241.4 },\n { amplitude: -17.599999999999998, angle: 241.9 },\n { amplitude: -17.599999999999998, angle: 242.2 },\n { amplitude: -17.599999999999998, angle: 242.3 },\n { amplitude: -17.599999999999998, angle: 242.6 },\n { amplitude: -17.200000000000003, angle: 243.1 },\n { amplitude: -17.200000000000003, angle: 243.8 },\n { amplitude: -17.200000000000003, angle: 244.3 },\n { amplitude: -16.8, angle: 244.5 },\n { amplitude: -16.8, angle: 244.6 },\n { amplitude: -16.8, angle: 245.3 },\n { amplitude: -16.400000000000002, angle: 245.6 },\n { amplitude: -16.400000000000002, angle: 246.1 },\n { amplitude: -16.400000000000002, angle: 246.4 },\n { amplitude: -16, angle: 247 },\n { amplitude: -16, angle: 247.1 },\n { amplitude: -16, angle: 247.4 },\n { amplitude: -16, angle: 247.6 },\n { amplitude: -16, angle: 248.2 },\n { amplitude: -15.600000000000001, angle: 248.5 },\n { amplitude: -15.600000000000001, angle: 248.9 },\n { amplitude: -15.2, angle: 249.8 },\n { amplitude: -15.2, angle: 251.1 },\n { amplitude: -15.2, angle: 251.6 },\n { amplitude: -15.2, angle: 251.8 },\n { amplitude: -14.8, angle: 252.1 },\n { amplitude: -14.8, angle: 252.2 },\n { amplitude: -14.8, angle: 252.6 },\n { amplitude: -14.8, angle: 252.7 },\n { amplitude: -14.8, angle: 252.9 },\n { amplitude: -14.8, angle: 253 },\n { amplitude: -14.8, angle: 253.2 },\n { amplitude: -14.8, angle: 253.9 },\n { amplitude: -14.399999999999999, angle: 254.2 },\n { amplitude: -14.399999999999999, angle: 254.6 },\n { amplitude: -14, angle: 255.7 },\n { amplitude: -14, angle: 255.9 },\n { amplitude: -14, angle: 256.1 },\n { amplitude: -14, angle: 256.3 },\n { amplitude: -14, angle: 256.7 },\n { amplitude: -14, angle: 257.1 },\n { amplitude: -13.599999999999998, angle: 257.3 },\n { amplitude: -13.2, angle: 258 },\n { amplitude: -13.2, angle: 258.2 },\n { amplitude: -13.2, angle: 258.3 },\n { amplitude: -12.799999999999997, angle: 258.9 },\n { amplitude: -12.799999999999997, angle: 259 },\n { amplitude: -12.799999999999997, angle: 259.2 },\n { amplitude: -12.799999999999997, angle: 259.8 },\n { amplitude: -12.799999999999997, angle: 259.9 },\n { amplitude: -12.400000000000002, angle: 260.1 },\n { amplitude: -12.400000000000002, angle: 260.2 },\n { amplitude: -12.400000000000002, angle: 260.5 },\n { amplitude: -12.400000000000002, angle: 260.6 },\n { amplitude: -12.000000000000002, angle: 260.8 },\n { amplitude: -12.000000000000002, angle: 261 },\n { amplitude: -12.000000000000002, angle: 261.4 },\n { amplitude: -12.000000000000002, angle: 261.7 },\n { amplitude: -11.600000000000001, angle: 261.9 },\n { amplitude: -11.600000000000001, angle: 262.3 },\n { amplitude: -11.600000000000001, angle: 262.5 },\n { amplitude: -11.600000000000001, angle: 262.7 },\n { amplitude: -11.600000000000001, angle: 263.1 },\n { amplitude: -11.200000000000001, angle: 263.3 },\n { amplitude: -11.200000000000001, angle: 263.5 },\n { amplitude: -11.200000000000001, angle: 263.9 },\n { amplitude: -11.200000000000001, angle: 264.1 },\n { amplitude: -11.200000000000001, angle: 264.3 },\n { amplitude: -11.200000000000001, angle: 264.7 },\n { amplitude: -10.8, angle: 264.9 },\n { amplitude: -10.8, angle: 265.1 },\n { amplitude: -10.8, angle: 265.6 },\n { amplitude: -10.8, angle: 265.8 },\n { amplitude: -10.4, angle: 266.2 },\n { amplitude: -10.4, angle: 266.4 },\n { amplitude: -10.4, angle: 266.6 },\n { amplitude: -10.4, angle: 266.9 },\n { amplitude: -10.4, angle: 267.1 },\n { amplitude: -10.4, angle: 267.3 },\n { amplitude: -10, angle: 267.7 },\n { amplitude: -10, angle: 267.8 },\n { amplitude: -10, angle: 268 },\n { amplitude: -10, angle: 268.4 },\n { amplitude: -10, angle: 268.6 },\n { amplitude: -10, angle: 269.1 },\n { amplitude: -9.6, angle: 269.3 },\n { amplitude: -9.6, angle: 269.4 },\n { amplitude: -9.6, angle: 270 },\n { amplitude: -9.6, angle: 270.1 },\n { amplitude: -9.2, angle: 270.7 },\n { amplitude: -9.2, angle: 271.5 },\n { amplitude: -9.2, angle: 272 },\n { amplitude: -8.799999999999999, angle: 272.2 },\n { amplitude: -8.799999999999999, angle: 273.2 },\n { amplitude: -8.399999999999999, angle: 273.5 },\n { amplitude: -8.399999999999999, angle: 273.8 },\n { amplitude: -8.399999999999999, angle: 274 },\n { amplitude: -8.399999999999999, angle: 274.1 },\n { amplitude: -8.399999999999999, angle: 274.5 },\n { amplitude: -8.399999999999999, angle: 274.6 },\n { amplitude: -8.399999999999999, angle: 274.8 },\n { amplitude: -8.399999999999999, angle: 275.1 },\n { amplitude: -8.399999999999999, angle: 275.3 },\n { amplitude: -8.399999999999999, angle: 275.5 },\n { amplitude: -8.399999999999999, angle: 275.8 },\n { amplitude: -8.399999999999999, angle: 276.5 },\n { amplitude: -8.399999999999999, angle: 276.6 },\n { amplitude: -8.399999999999999, angle: 276.8 },\n { amplitude: -7.999999999999998, angle: 277.1 },\n { amplitude: -7.999999999999998, angle: 277.9 },\n { amplitude: -7.999999999999998, angle: 278.1 },\n { amplitude: -7.999999999999998, angle: 278.4 },\n { amplitude: -7.999999999999998, angle: 278.6 },\n { amplitude: -7.999999999999998, angle: 279.1 },\n { amplitude: -7.999999999999998, angle: 279.9 },\n { amplitude: -7.999999999999998, angle: 280.1 },\n { amplitude: -7.999999999999998, angle: 280.6 },\n { amplitude: -7.999999999999998, angle: 280.7 },\n { amplitude: -7.999999999999998, angle: 281.4 },\n { amplitude: -7.599999999999998, angle: 281.8 },\n { amplitude: -7.599999999999998, angle: 282.3 },\n { amplitude: -7.599999999999998, angle: 283 },\n { amplitude: -7.599999999999998, angle: 283.6 },\n { amplitude: -7.599999999999998, angle: 283.8 },\n { amplitude: -7.599999999999998, angle: 283.9 },\n { amplitude: -7.599999999999998, angle: 284.2 },\n { amplitude: -7.599999999999998, angle: 284.4 },\n { amplitude: -7.200000000000002, angle: 284.5 },\n { amplitude: -7.200000000000002, angle: 284.9 },\n { amplitude: -7.200000000000002, angle: 285 },\n { amplitude: -7.200000000000002, angle: 285.5 },\n { amplitude: -7.200000000000002, angle: 285.8 },\n { amplitude: -7.200000000000002, angle: 286.1 },\n { amplitude: -7.200000000000002, angle: 286.2 },\n { amplitude: -7.200000000000002, angle: 286.9 },\n { amplitude: -6.800000000000002, angle: 287.3 },\n { amplitude: -6.800000000000002, angle: 287.5 },\n { amplitude: -6.800000000000002, angle: 288.1 },\n { amplitude: -6.800000000000002, angle: 288.2 },\n { amplitude: -6.800000000000002, angle: 288.9 },\n { amplitude: -6.800000000000002, angle: 289.2 },\n { amplitude: -6.800000000000002, angle: 289.4 },\n { amplitude: -6.800000000000002, angle: 289.6 },\n { amplitude: -6.800000000000002, angle: 290.2 },\n { amplitude: -6.400000000000001, angle: 290.6 },\n { amplitude: -6.800000000000002, angle: 291.2 },\n { amplitude: -6.800000000000002, angle: 291.5 },\n { amplitude: -6.400000000000001, angle: 292.1 },\n { amplitude: -6.400000000000001, angle: 292.7 },\n { amplitude: -6.400000000000001, angle: 293.1 },\n { amplitude: -6.400000000000001, angle: 293.2 },\n { amplitude: -6.400000000000001, angle: 293.6 },\n { amplitude: -6.000000000000001, angle: 293.9 },\n { amplitude: -6.000000000000001, angle: 294.6 },\n { amplitude: -6.000000000000001, angle: 294.8 },\n { amplitude: -6.000000000000001, angle: 295.3 },\n { amplitude: -6.000000000000001, angle: 295.5 },\n { amplitude: -6.000000000000001, angle: 295.7 },\n { amplitude: -6.000000000000001, angle: 296.1 },\n { amplitude: -6.000000000000001, angle: 296.2 },\n { amplitude: -6.000000000000001, angle: 296.4 },\n { amplitude: -5.6000000000000005, angle: 296.6 },\n { amplitude: -5.6000000000000005, angle: 296.9 },\n { amplitude: -5.6000000000000005, angle: 297 },\n { amplitude: -5.6000000000000005, angle: 297.3 },\n { amplitude: -5.6000000000000005, angle: 297.5 },\n { amplitude: -5.6000000000000005, angle: 297.9 },\n { amplitude: -5.6000000000000005, angle: 298 },\n { amplitude: -5.6000000000000005, angle: 298.2 },\n { amplitude: -5.6000000000000005, angle: 298.8 },\n { amplitude: -5.6000000000000005, angle: 299.2 },\n { amplitude: -5.2, angle: 299.4 },\n { amplitude: -5.2, angle: 299.7 },\n { amplitude: -5.2, angle: 299.8 },\n { amplitude: -5.2, angle: 300.4 },\n { amplitude: -4.8, angle: 300.8 },\n { amplitude: -5.2, angle: 301.2 },\n { amplitude: -4.8, angle: 301.7 },\n { amplitude: -4.8, angle: 301.8 },\n { amplitude: -4.8, angle: 302.1 },\n { amplitude: -4.8, angle: 302.2 },\n { amplitude: -4.8, angle: 302.3 },\n { amplitude: -4.8, angle: 302.4 },\n { amplitude: -4.8, angle: 302.8 },\n { amplitude: -4.8, angle: 303 },\n { amplitude: -4.8, angle: 303.1 },\n { amplitude: -4.8, angle: 303.4 },\n { amplitude: -4.8, angle: 303.6 },\n { amplitude: -4.8, angle: 303.8 },\n { amplitude: -4.8, angle: 304 },\n { amplitude: -4.8, angle: 304.8 },\n { amplitude: -4.3999999999999995, angle: 304.9 },\n { amplitude: -4.3999999999999995, angle: 305.3 },\n { amplitude: -4.8, angle: 305.8 },\n { amplitude: -4.3999999999999995, angle: 306.1 },\n { amplitude: -4.3999999999999995, angle: 306.3 },\n { amplitude: -4.8, angle: 306.6 },\n { amplitude: -4.3999999999999995, angle: 307 },\n { amplitude: -4.3999999999999995, angle: 307.5 },\n { amplitude: -4.3999999999999995, angle: 307.6 },\n { amplitude: -4.3999999999999995, angle: 307.9 },\n { amplitude: -4.3999999999999995, angle: 308.3 },\n { amplitude: -4.3999999999999995, angle: 308.4 },\n { amplitude: -4.3999999999999995, angle: 308.5 },\n { amplitude: -4.3999999999999995, angle: 308.7 },\n { amplitude: -4.3999999999999995, angle: 309.1 },\n { amplitude: -4.3999999999999995, angle: 309.2 },\n { amplitude: -4.3999999999999995, angle: 309.3 },\n { amplitude: -3.999999999999999, angle: 309.6 },\n { amplitude: -4.3999999999999995, angle: 309.7 },\n { amplitude: -4.3999999999999995, angle: 310.2 },\n { amplitude: -4.3999999999999995, angle: 310.5 },\n { amplitude: -3.999999999999999, angle: 310.6 },\n { amplitude: -4.3999999999999995, angle: 311.2 },\n { amplitude: -3.999999999999999, angle: 311.3 },\n { amplitude: -3.999999999999999, angle: 311.6 },\n { amplitude: -3.999999999999999, angle: 311.7 },\n { amplitude: -3.999999999999999, angle: 311.9 },\n { amplitude: -3.999999999999999, angle: 312.3 },\n { amplitude: -3.999999999999999, angle: 312.6 },\n { amplitude: -3.999999999999999, angle: 312.7 },\n { amplitude: -3.999999999999999, angle: 312.8 },\n { amplitude: -3.999999999999999, angle: 313.2 },\n { amplitude: -3.999999999999999, angle: 313.5 },\n { amplitude: -3.999999999999999, angle: 314 },\n { amplitude: -3.999999999999999, angle: 314.2 },\n { amplitude: -3.999999999999999, angle: 314.3 },\n { amplitude: -3.999999999999999, angle: 314.8 },\n { amplitude: -3.999999999999999, angle: 315 },\n { amplitude: -3.999999999999999, angle: 315.2 },\n { amplitude: -3.999999999999999, angle: 315.3 },\n { amplitude: -3.999999999999999, angle: 315.7 },\n { amplitude: -3.999999999999999, angle: 315.9 },\n { amplitude: -3.999999999999999, angle: 316.1 },\n { amplitude: -3.999999999999999, angle: 316.5 },\n { amplitude: -3.999999999999999, angle: 316.7 },\n { amplitude: -3.999999999999999, angle: 316.9 },\n { amplitude: -3.999999999999999, angle: 317.1 },\n { amplitude: -3.999999999999999, angle: 317.3 },\n { amplitude: -3.999999999999999, angle: 317.5 },\n { amplitude: -3.999999999999999, angle: 317.6 },\n { amplitude: -3.999999999999999, angle: 317.8 },\n { amplitude: -3.999999999999999, angle: 317.9 },\n { amplitude: -3.999999999999999, angle: 318.4 },\n { amplitude: -3.999999999999999, angle: 318.7 },\n { amplitude: -3.999999999999999, angle: 319.2 },\n { amplitude: -3.5999999999999988, angle: 319.4 },\n { amplitude: -3.5999999999999988, angle: 319.6 },\n { amplitude: -3.5999999999999988, angle: 319.7 },\n { amplitude: -3.5999999999999988, angle: 319.8 },\n { amplitude: -3.5999999999999988, angle: 320.4 },\n { amplitude: -3.5999999999999988, angle: 320.5 },\n { amplitude: -3.5999999999999988, angle: 320.6 },\n { amplitude: -3.5999999999999988, angle: 321 },\n { amplitude: -3.5999999999999988, angle: 321.1 },\n { amplitude: -3.5999999999999988, angle: 321.3 },\n { amplitude: -3.5999999999999988, angle: 321.6 },\n { amplitude: -3.5999999999999988, angle: 321.9 },\n { amplitude: -3.5999999999999988, angle: 322 },\n { amplitude: -3.5999999999999988, angle: 322.1 },\n { amplitude: -3.1999999999999984, angle: 322.3 },\n { amplitude: -3.1999999999999984, angle: 322.5 },\n { amplitude: -3.1999999999999984, angle: 322.6 },\n { amplitude: -3.1999999999999984, angle: 323 },\n { amplitude: -3.1999999999999984, angle: 323.1 },\n { amplitude: -3.1999999999999984, angle: 323.3 },\n { amplitude: -3.1999999999999984, angle: 323.4 },\n { amplitude: -3.1999999999999984, angle: 323.9 },\n { amplitude: -3.1999999999999984, angle: 324 },\n { amplitude: -3.1999999999999984, angle: 324.1 },\n { amplitude: -2.799999999999998, angle: 324.4 },\n { amplitude: -2.799999999999998, angle: 324.7 },\n { amplitude: -2.799999999999998, angle: 325 },\n { amplitude: -2.799999999999998, angle: 325.1 },\n { amplitude: -2.799999999999998, angle: 325.2 },\n { amplitude: -2.400000000000002, angle: 325.5 },\n { amplitude: -2.400000000000002, angle: 325.6 },\n { amplitude: -2.400000000000002, angle: 325.9 },\n { amplitude: -2.400000000000002, angle: 326 },\n { amplitude: -2.400000000000002, angle: 326.2 },\n { amplitude: -2.400000000000002, angle: 326.3 },\n { amplitude: -2.0000000000000018, angle: 326.9 },\n { amplitude: -1.6000000000000014, angle: 327 },\n { amplitude: -1.6000000000000014, angle: 327.5 },\n { amplitude: -1.6000000000000014, angle: 327.6 },\n { amplitude: -1.6000000000000014, angle: 327.8 },\n { amplitude: -1.6000000000000014, angle: 327.9 },\n { amplitude: -1.6000000000000014, angle: 328.4 },\n { amplitude: -1.200000000000001, angle: 328.7 },\n { amplitude: -1.200000000000001, angle: 329.1 },\n { amplitude: -1.6000000000000014, angle: 329.5 },\n { amplitude: -1.200000000000001, angle: 329.8 },\n { amplitude: -1.200000000000001, angle: 330.2 },\n { amplitude: -1.200000000000001, angle: 330.5 },\n { amplitude: -1.200000000000001, angle: 330.9 },\n { amplitude: -1.200000000000001, angle: 331.3 },\n { amplitude: -1.200000000000001, angle: 331.7 },\n { amplitude: -1.200000000000001, angle: 332.2 },\n { amplitude: -1.200000000000001, angle: 332.3 },\n { amplitude: -1.200000000000001, angle: 332.4 },\n { amplitude: -1.200000000000001, angle: 332.7 },\n { amplitude: -1.200000000000001, angle: 332.8 },\n { amplitude: -1.200000000000001, angle: 333.3 },\n { amplitude: -1.200000000000001, angle: 333.5 },\n { amplitude: -1.200000000000001, angle: 334.1 },\n { amplitude: -1.200000000000001, angle: 334.7 },\n { amplitude: -1.200000000000001, angle: 334.9 },\n { amplitude: -1.200000000000001, angle: 335.5 },\n { amplitude: -1.200000000000001, angle: 335.8 },\n { amplitude: -1.200000000000001, angle: 336.1 },\n { amplitude: -1.200000000000001, angle: 336.4 },\n { amplitude: -1.200000000000001, angle: 336.8 },\n { amplitude: -1.200000000000001, angle: 337 },\n { amplitude: -1.200000000000001, angle: 337.2 },\n { amplitude: -1.200000000000001, angle: 337.7 },\n { amplitude: -1.200000000000001, angle: 337.9 },\n { amplitude: -1.200000000000001, angle: 338 },\n { amplitude: -1.200000000000001, angle: 338.3 },\n { amplitude: -1.200000000000001, angle: 338.4 },\n { amplitude: -0.8000000000000007, angle: 338.7 },\n { amplitude: -1.200000000000001, angle: 338.9 },\n { amplitude: -0.8000000000000007, angle: 339.1 },\n { amplitude: -0.8000000000000007, angle: 339.2 },\n { amplitude: -1.200000000000001, angle: 339.5 },\n { amplitude: -1.200000000000001, angle: 339.6 },\n { amplitude: -1.200000000000001, angle: 339.8 },\n { amplitude: -0.8000000000000007, angle: 340.4 },\n { amplitude: -0.8000000000000007, angle: 340.8 },\n { amplitude: -1.200000000000001, angle: 340.9 },\n { amplitude: -1.200000000000001, angle: 341.3 },\n { amplitude: -1.200000000000001, angle: 341.4 },\n { amplitude: -1.200000000000001, angle: 341.7 },\n { amplitude: -1.200000000000001, angle: 342 },\n { amplitude: -1.200000000000001, angle: 342.5 },\n { amplitude: -1.200000000000001, angle: 342.9 },\n { amplitude: -1.200000000000001, angle: 343.1 },\n { amplitude: -1.200000000000001, angle: 343.2 },\n { amplitude: -1.200000000000001, angle: 343.5 },\n { amplitude: -0.8000000000000007, angle: 343.8 },\n { amplitude: -0.8000000000000007, angle: 344.1 },\n { amplitude: -0.8000000000000007, angle: 344.2 },\n { amplitude: -0.8000000000000007, angle: 344.4 },\n { amplitude: -1.200000000000001, angle: 344.6 },\n { amplitude: -0.8000000000000007, angle: 344.8 },\n { amplitude: -0.8000000000000007, angle: 344.9 },\n { amplitude: -1.200000000000001, angle: 345.3 },\n { amplitude: -1.200000000000001, angle: 345.4 },\n { amplitude: -1.200000000000001, angle: 345.7 },\n { amplitude: -1.200000000000001, angle: 345.8 },\n { amplitude: -1.200000000000001, angle: 346 },\n { amplitude: -0.8000000000000007, angle: 346.5 },\n { amplitude: -1.200000000000001, angle: 346.9 },\n { amplitude: -0.8000000000000007, angle: 347.1 },\n { amplitude: -1.200000000000001, angle: 347.4 },\n { amplitude: -1.200000000000001, angle: 347.7 },\n { amplitude: -0.8000000000000007, angle: 348 },\n { amplitude: -0.8000000000000007, angle: 348.1 },\n { amplitude: -0.8000000000000007, angle: 348.3 },\n { amplitude: -0.8000000000000007, angle: 348.6 },\n { amplitude: -0.8000000000000007, angle: 348.7 },\n { amplitude: -0.8000000000000007, angle: 349.1 },\n { amplitude: -0.8000000000000007, angle: 349.2 },\n { amplitude: -0.8000000000000007, angle: 349.6 },\n { amplitude: -0.8000000000000007, angle: 349.8 },\n { amplitude: -1.200000000000001, angle: 349.9 },\n { amplitude: -1.200000000000001, angle: 350.2 },\n { amplitude: -1.200000000000001, angle: 350.4 },\n { amplitude: -1.200000000000001, angle: 350.7 },\n { amplitude: -0.8000000000000007, angle: 351 },\n { amplitude: -0.8000000000000007, angle: 351.4 },\n { amplitude: -0.8000000000000007, angle: 351.6 },\n { amplitude: -0.8000000000000007, angle: 352 },\n { amplitude: -0.8000000000000007, angle: 352.4 },\n { amplitude: -0.8000000000000007, angle: 352.6 },\n { amplitude: -0.8000000000000007, angle: 353 },\n { amplitude: -0.8000000000000007, angle: 353.1 },\n { amplitude: -0.8000000000000007, angle: 353.5 },\n { amplitude: -0.8000000000000007, angle: 353.7 },\n { amplitude: -0.8000000000000007, angle: 354.1 },\n { amplitude: -0.8000000000000007, angle: 354.2 },\n { amplitude: -0.40000000000000036, angle: 354.6 },\n { amplitude: -0.40000000000000036, angle: 354.8 },\n { amplitude: -0.40000000000000036, angle: 355.2 },\n { amplitude: -0.40000000000000036, angle: 355.3 },\n { amplitude: -0.40000000000000036, angle: 355.7 },\n { amplitude: -0.40000000000000036, angle: 355.8 },\n { amplitude: -0.40000000000000036, angle: 356.4 },\n { amplitude: -0.40000000000000036, angle: 356.5 },\n { amplitude: -0.40000000000000036, angle: 356.8 },\n { amplitude: -0.40000000000000036, angle: 356.9 },\n { amplitude: -0.40000000000000036, angle: 357.1 },\n { amplitude: 0, angle: 357.3 },\n { amplitude: 0, angle: 357.5 },\n { amplitude: 0, angle: 357.6 },\n { amplitude: 0, angle: 358 },\n { amplitude: 0, angle: 358.5 },\n { amplitude: 0, angle: 359.1 },\n { amplitude: 0, angle: 359.2 },\n { amplitude: 0, angle: 360 },\n ],\n },\n {\n name: '6KHz',\n data: [\n { angle: 0, amplitude: -0.40000000000000036 },\n { angle: 0.4, amplitude: -0.40000000000000036 },\n { angle: 0.5, amplitude: -0.40000000000000036 },\n { angle: 0.8, amplitude: -0.40000000000000036 },\n { angle: 1.3, amplitude: -0.40000000000000036 },\n { angle: 2.4, amplitude: -0.40000000000000036 },\n { angle: 2.6, amplitude: -0.40000000000000036 },\n { angle: 3.1, amplitude: -0.8000000000000007 },\n { angle: 3.5, amplitude: -0.8000000000000007 },\n { angle: 4.1, amplitude: -0.8000000000000007 },\n { angle: 4.3, amplitude: -0.8000000000000007 },\n { angle: 4.6, amplitude: -0.8000000000000007 },\n { angle: 4.7, amplitude: -0.8000000000000007 },\n { angle: 5.2, amplitude: -0.8000000000000007 },\n { angle: 5.9, amplitude: -1.200000000000001 },\n { angle: 6.4, amplitude: -1.200000000000001 },\n { angle: 7, amplitude: -1.200000000000001 },\n { angle: 7.5, amplitude: -1.200000000000001 },\n { angle: 7.9, amplitude: -1.200000000000001 },\n { angle: 8.1, amplitude: -1.200000000000001 },\n { angle: 8.2, amplitude: -1.200000000000001 },\n { angle: 8.7, amplitude: -1.200000000000001 },\n { angle: 9.1, amplitude: -1.6000000000000014 },\n { angle: 10.2, amplitude: -1.6000000000000014 },\n { angle: 10.4, amplitude: -1.6000000000000014 },\n { angle: 10.6, amplitude: -1.6000000000000014 },\n { angle: 11, amplitude: -1.6000000000000014 },\n { angle: 11.4, amplitude: -1.6000000000000014 },\n { angle: 11.6, amplitude: -1.6000000000000014 },\n { angle: 12, amplitude: -2.0000000000000018 },\n { angle: 12.2, amplitude: -2.0000000000000018 },\n { angle: 12.6, amplitude: -1.6000000000000014 },\n { angle: 12.8, amplitude: -2.0000000000000018 },\n { angle: 13.2, amplitude: -2.0000000000000018 },\n { angle: 13.3, amplitude: -2.0000000000000018 },\n { angle: 13.9, amplitude: -2.0000000000000018 },\n { angle: 14.3, amplitude: -2.0000000000000018 },\n { angle: 14.4, amplitude: -2.0000000000000018 },\n { angle: 14.8, amplitude: -2.0000000000000018 },\n { angle: 15.6, amplitude: -2.0000000000000018 },\n { angle: 15.7, amplitude: -2.0000000000000018 },\n { angle: 16, amplitude: -1.6000000000000014 },\n { angle: 16.1, amplitude: -1.6000000000000014 },\n { angle: 16.8, amplitude: -2.0000000000000018 },\n { angle: 17.4, amplitude: -2.0000000000000018 },\n { angle: 17.9, amplitude: -2.0000000000000018 },\n { angle: 18.5, amplitude: -2.0000000000000018 },\n { angle: 18.8, amplitude: -2.0000000000000018 },\n { angle: 19.2, amplitude: -2.0000000000000018 },\n { angle: 19.3, amplitude: -2.0000000000000018 },\n { angle: 19.7, amplitude: -2.0000000000000018 },\n { angle: 20.2, amplitude: -2.0000000000000018 },\n { angle: 20.9, amplitude: -2.0000000000000018 },\n { angle: 21.1, amplitude: -2.0000000000000018 },\n { angle: 21.3, amplitude: -2.0000000000000018 },\n { angle: 22.1, amplitude: -2.0000000000000018 },\n { angle: 22.6, amplitude: -2.0000000000000018 },\n { angle: 22.8, amplitude: -2.0000000000000018 },\n { angle: 24.1, amplitude: -2.0000000000000018 },\n { angle: 24.9, amplitude: -1.6000000000000014 },\n { angle: 25.6, amplitude: -1.6000000000000014 },\n { angle: 25.7, amplitude: -1.6000000000000014 },\n { angle: 26.4, amplitude: -1.6000000000000014 },\n { angle: 28.5, amplitude: -1.6000000000000014 },\n { angle: 29.2, amplitude: -1.6000000000000014 },\n { angle: 29.7, amplitude: -1.6000000000000014 },\n { angle: 30, amplitude: -1.6000000000000014 },\n { angle: 30.3, amplitude: -1.6000000000000014 },\n { angle: 30.6, amplitude: -1.6000000000000014 },\n { angle: 31.5, amplitude: -1.6000000000000014 },\n { angle: 31.8, amplitude: -1.6000000000000014 },\n { angle: 32.1, amplitude: -1.6000000000000014 },\n { angle: 32.7, amplitude: -1.6000000000000014 },\n { angle: 33.4, amplitude: -1.6000000000000014 },\n { angle: 33.5, amplitude: -1.6000000000000014 },\n { angle: 33.8, amplitude: -1.6000000000000014 },\n { angle: 34.3, amplitude: -1.6000000000000014 },\n { angle: 35.2, amplitude: -1.6000000000000014 },\n { angle: 35.9, amplitude: -1.6000000000000014 },\n { angle: 36, amplitude: -2.0000000000000018 },\n { angle: 36.1, amplitude: -2.0000000000000018 },\n { angle: 36.6, amplitude: -2.0000000000000018 },\n { angle: 36.9, amplitude: -2.0000000000000018 },\n { angle: 37.6, amplitude: -2.400000000000002 },\n { angle: 38.2, amplitude: -2.0000000000000018 },\n { angle: 38.7, amplitude: -2.400000000000002 },\n { angle: 38.8, amplitude: -2.400000000000002 },\n { angle: 39.6, amplitude: -2.400000000000002 },\n { angle: 40.2, amplitude: -2.400000000000002 },\n { angle: 40.9, amplitude: -2.400000000000002 },\n { angle: 41.4, amplitude: -2.400000000000002 },\n { angle: 42.2, amplitude: -2.799999999999998 },\n { angle: 42.8, amplitude: -2.799999999999998 },\n { angle: 43.1, amplitude: -2.799999999999998 },\n { angle: 43.9, amplitude: -2.799999999999998 },\n { angle: 44.3, amplitude: -2.799999999999998 },\n { angle: 44.7, amplitude: -2.799999999999998 },\n { angle: 45.2, amplitude: -2.799999999999998 },\n { angle: 45.4, amplitude: -2.799999999999998 },\n { angle: 45.8, amplitude: -2.799999999999998 },\n { angle: 46.6, amplitude: -2.799999999999998 },\n { angle: 47.2, amplitude: -3.1999999999999984 },\n { angle: 47.4, amplitude: -2.799999999999998 },\n { angle: 47.8, amplitude: -2.799999999999998 },\n { angle: 48, amplitude: -2.799999999999998 },\n { angle: 48.7, amplitude: -3.1999999999999984 },\n { angle: 48.8, amplitude: -3.1999999999999984 },\n { angle: 49.2, amplitude: -3.1999999999999984 },\n { angle: 49.5, amplitude: -3.1999999999999984 },\n { angle: 49.8, amplitude: -3.1999999999999984 },\n { angle: 51, amplitude: -3.5999999999999988 },\n { angle: 51.1, amplitude: -3.5999999999999988 },\n { angle: 54.4, amplitude: -3.999999999999999 },\n { angle: 55.7, amplitude: -4.3999999999999995 },\n { angle: 56.2, amplitude: -4.3999999999999995 },\n { angle: 56.6, amplitude: -4.3999999999999995 },\n { angle: 56.7, amplitude: -4.3999999999999995 },\n { angle: 57.2, amplitude: -4.3999999999999995 },\n { angle: 57.7, amplitude: -4.8 },\n { angle: 58, amplitude: -4.3999999999999995 },\n { angle: 58.8, amplitude: -4.8 },\n { angle: 59.2, amplitude: -4.8 },\n { angle: 59.9, amplitude: -4.8 },\n { angle: 60.4, amplitude: -4.8 },\n { angle: 61.2, amplitude: -4.8 },\n { angle: 62.5, amplitude: -4.8 },\n { angle: 63, amplitude: -4.8 },\n { angle: 63.4, amplitude: -4.8 },\n { angle: 64.3, amplitude: -4.8 },\n { angle: 64.4, amplitude: -5.2 },\n { angle: 64.8, amplitude: -5.2 },\n { angle: 65.7, amplitude: -5.2 },\n { angle: 65.9, amplitude: -5.2 },\n { angle: 66.5, amplitude: -5.2 },\n { angle: 67.1, amplitude: -5.2 },\n { angle: 67.8, amplitude: -5.2 },\n { angle: 69, amplitude: -5.2 },\n { angle: 69.5, amplitude: -5.2 },\n { angle: 69.7, amplitude: -5.2 },\n { angle: 70.5, amplitude: -4.8 },\n { angle: 71.1, amplitude: -4.8 },\n { angle: 72.2, amplitude: -5.2 },\n { angle: 72.3, amplitude: -5.2 },\n { angle: 73.6, amplitude: -5.2 },\n { angle: 74.5, amplitude: -5.2 },\n { angle: 75.5, amplitude: -5.2 },\n { angle: 75.8, amplitude: -5.2 },\n { angle: 76.6, amplitude: -5.2 },\n { angle: 77, amplitude: -5.2 },\n { angle: 77.6, amplitude: -5.2 },\n { angle: 78.3, amplitude: -5.2 },\n { angle: 79, amplitude: -5.2 },\n { angle: 79.5, amplitude: -5.2 },\n { angle: 79.8, amplitude: -5.2 },\n { angle: 80.4, amplitude: -5.2 },\n { angle: 80.7, amplitude: -5.2 },\n { angle: 83.2, amplitude: -5.2 },\n { angle: 83.8, amplitude: -5.2 },\n { angle: 84.5, amplitude: -5.2 },\n { angle: 85.1, amplitude: -5.2 },\n { angle: 85.6, amplitude: -5.2 },\n { angle: 85.9, amplitude: -5.2 },\n { angle: 86.8, amplitude: -5.6000000000000005 },\n { angle: 87.1, amplitude: -5.6000000000000005 },\n { angle: 87.6, amplitude: -5.6000000000000005 },\n { angle: 88, amplitude: -5.6000000000000005 },\n { angle: 88.6, amplitude: -5.6000000000000005 },\n { angle: 89.3, amplitude: -6.000000000000001 },\n { angle: 90, amplitude: -6.000000000000001 },\n { angle: 90.2, amplitude: -6.000000000000001 },\n { angle: 90.7, amplitude: -6.000000000000001 },\n { angle: 90.8, amplitude: -6.400000000000001 },\n { angle: 91.4, amplitude: -6.400000000000001 },\n { angle: 92.1, amplitude: -6.400000000000001 },\n { angle: 92.5, amplitude: -6.400000000000001 },\n { angle: 92.7, amplitude: -6.400000000000001 },\n { angle: 93.2, amplitude: -6.400000000000001 },\n { angle: 93.3, amplitude: -6.400000000000001 },\n { angle: 94, amplitude: -6.800000000000002 },\n { angle: 95.1, amplitude: -6.800000000000002 },\n { angle: 95.8, amplitude: -6.800000000000002 },\n { angle: 96.4, amplitude: -6.800000000000002 },\n { angle: 97.1, amplitude: -6.800000000000002 },\n { angle: 97.7, amplitude: -6.800000000000002 },\n { angle: 98.5, amplitude: -6.800000000000002 },\n { angle: 99.5, amplitude: -7.200000000000002 },\n { angle: 99.9, amplitude: -7.200000000000002 },\n { angle: 100.3, amplitude: -7.200000000000002 },\n { angle: 100.5, amplitude: -7.200000000000002 },\n { angle: 101.5, amplitude: -7.200000000000002 },\n { angle: 101.6, amplitude: -7.200000000000002 },\n { angle: 102.2, amplitude: -7.200000000000002 },\n { angle: 102.5, amplitude: -7.200000000000002 },\n { angle: 103.3, amplitude: -7.599999999999998 },\n { angle: 104.1, amplitude: -7.599999999999998 },\n { angle: 104.4, amplitude: -7.599999999999998 },\n { angle: 104.7, amplitude: -7.999999999999998 },\n { angle: 105.2, amplitude: -7.999999999999998 },\n { angle: 106, amplitude: -8.399999999999999 },\n { angle: 106.5, amplitude: -8.399999999999999 },\n { angle: 106.9, amplitude: -8.399999999999999 },\n { angle: 107.4, amplitude: -8.799999999999999 },\n { angle: 107.8, amplitude: -8.799999999999999 },\n { angle: 107.9, amplitude: -9.2 },\n { angle: 108.8, amplitude: -9.2 },\n { angle: 109.3, amplitude: -9.6 },\n { angle: 110.3, amplitude: -10 },\n { angle: 110.8, amplitude: -10 },\n { angle: 111.3, amplitude: -10.4 },\n { angle: 112.4, amplitude: -10.8 },\n { angle: 113.4, amplitude: -11.200000000000001 },\n { angle: 114.2, amplitude: -11.600000000000001 },\n { angle: 114.9, amplitude: -11.600000000000001 },\n { angle: 115.5, amplitude: -12.000000000000002 },\n { angle: 116, amplitude: -12.000000000000002 },\n { angle: 116.2, amplitude: -12.000000000000002 },\n { angle: 117, amplitude: -12.400000000000002 },\n { angle: 117.1, amplitude: -12.400000000000002 },\n { angle: 117.9, amplitude: -12.799999999999997 },\n { angle: 118.3, amplitude: -12.799999999999997 },\n { angle: 119.4, amplitude: -13.2 },\n { angle: 119.9, amplitude: -13.2 },\n { angle: 120.3, amplitude: -13.599999999999998 },\n { angle: 120.8, amplitude: -13.599999999999998 },\n { angle: 121.3, amplitude: -13.599999999999998 },\n { angle: 122.2, amplitude: -14 },\n { angle: 122.4, amplitude: -14 },\n { angle: 123, amplitude: -14 },\n { angle: 123.4, amplitude: -14 },\n { angle: 124.1, amplitude: -14 },\n { angle: 124.9, amplitude: -14.399999999999999 },\n { angle: 125.1, amplitude: -14.399999999999999 },\n { angle: 126.8, amplitude: -14.8 },\n { angle: 127, amplitude: -14.8 },\n { angle: 127.4, amplitude: -15.2 },\n { angle: 128.4, amplitude: -15.600000000000001 },\n { angle: 129.5, amplitude: -16 },\n { angle: 130.1, amplitude: -16 },\n { angle: 130.7, amplitude: -16.400000000000002 },\n { angle: 131.1, amplitude: -16.400000000000002 },\n { angle: 131.7, amplitude: -16.8 },\n { angle: 132, amplitude: -16.8 },\n { angle: 132.4, amplitude: -16.8 },\n { angle: 132.5, amplitude: -17.200000000000003 },\n { angle: 133.1, amplitude: -17.200000000000003 },\n { angle: 133.3, amplitude: -17.200000000000003 },\n { angle: 133.8, amplitude: -17.599999999999998 },\n { angle: 133.9, amplitude: -17.599999999999998 },\n { angle: 134.4, amplitude: -18 },\n { angle: 135.1, amplitude: -18 },\n { angle: 135.6, amplitude: -18.4 },\n { angle: 136.5, amplitude: -18.799999999999997 },\n { angle: 137.4, amplitude: -18.799999999999997 },\n { angle: 138, amplitude: -19.2 },\n { angle: 138.2, amplitude: -19.2 },\n { angle: 139.5, amplitude: -19.6 },\n { angle: 140.1, amplitude: -19.6 },\n { angle: 140.3, amplitude: -20 },\n { angle: 140.5, amplitude: -20 },\n { angle: 141.2, amplitude: -20.4 },\n { angle: 141.8, amplitude: -20.4 },\n { angle: 142.7, amplitude: -20.4 },\n { angle: 143.3, amplitude: -20.8 },\n { angle: 143.5, amplitude: -20.8 },\n { angle: 144.2, amplitude: -20.8 },\n { angle: 144.8, amplitude: -21.200000000000003 },\n { angle: 145, amplitude: -21.200000000000003 },\n { angle: 146, amplitude: -21.6 },\n { angle: 146.8, amplitude: -22 },\n { angle: 148.6, amplitude: -22.400000000000002 },\n { angle: 149.2, amplitude: -22.800000000000004 },\n { angle: 150.3, amplitude: -22.800000000000004 },\n { angle: 151.5, amplitude: -23.200000000000003 },\n { angle: 152, amplitude: -23.200000000000003 },\n { angle: 152.6, amplitude: -23.6 },\n { angle: 152.9, amplitude: -23.6 },\n { angle: 153.2, amplitude: -23.6 },\n { angle: 153.3, amplitude: -24 },\n { angle: 153.8, amplitude: -24 },\n { angle: 154.1, amplitude: -24 },\n { angle: 154.7, amplitude: -24.4 },\n { angle: 155.3, amplitude: -24.4 },\n { angle: 155.6, amplitude: -24.8 },\n { angle: 155.9, amplitude: -24.8 },\n { angle: 156.8, amplitude: -25.2 },\n { angle: 157.6, amplitude: -25.2 },\n { angle: 158, amplitude: -25.2 },\n { angle: 158.8, amplitude: -26 },\n { angle: 159.2, amplitude: -26 },\n { angle: 159.8, amplitude: -26.4 },\n { angle: 160, amplitude: -26.4 },\n { angle: 160.8, amplitude: -26.799999999999997 },\n { angle: 161.5, amplitude: -27.199999999999996 },\n { angle: 162.3, amplitude: -27.199999999999996 },\n { angle: 163, amplitude: -27.199999999999996 },\n { angle: 163.3, amplitude: -27.199999999999996 },\n { angle: 163.4, amplitude: -27.599999999999998 },\n { angle: 164.4, amplitude: -28 },\n { angle: 164.8, amplitude: -28 },\n { angle: 165.4, amplitude: -28 },\n { angle: 168.8, amplitude: -28.799999999999997 },\n { angle: 169.1, amplitude: -28.799999999999997 },\n { angle: 170.7, amplitude: -29.6 },\n { angle: 172.1, amplitude: -29.6 },\n { angle: 172.4, amplitude: -30 },\n { angle: 173.4, amplitude: -30 },\n { angle: 174.4, amplitude: -30 },\n { angle: 175.7, amplitude: -30.8 },\n { angle: 176.2, amplitude: -30.8 },\n { angle: 177.3, amplitude: -31.200000000000003 },\n { angle: 177.9, amplitude: -31.200000000000003 },\n { angle: 178.4, amplitude: -31.200000000000003 },\n { angle: 180.3, amplitude: -31.6 },\n { amplitude: -31.6, angle: 179.7 },\n { amplitude: -31.200000000000003, angle: 181.6 },\n { amplitude: -31.200000000000003, angle: 182.1 },\n { amplitude: -31.200000000000003, angle: 182.7 },\n { amplitude: -30.8, angle: 183.8 },\n { amplitude: -30.8, angle: 184.3 },\n { amplitude: -30, angle: 185.6 },\n { amplitude: -30, angle: 186.6 },\n { amplitude: -30, angle: 187.6 },\n { amplitude: -29.6, angle: 187.9 },\n { amplitude: -29.6, angle: 189.3 },\n { amplitude: -28.799999999999997, angle: 190.9 },\n { amplitude: -28.799999999999997, angle: 191.2 },\n { amplitude: -28, angle: 194.6 },\n { amplitude: -28, angle: 195.2 },\n { amplitude: -28, angle: 195.6 },\n { amplitude: -27.599999999999998, angle: 196.6 },\n { amplitude: -27.199999999999996, angle: 196.7 },\n { amplitude: -27.199999999999996, angle: 197 },\n { amplitude: -27.199999999999996, angle: 197.7 },\n { amplitude: -27.199999999999996, angle: 198.5 },\n { amplitude: -26.799999999999997, angle: 199.2 },\n { amplitude: -26.4, angle: 200 },\n { amplitude: -26.4, angle: 200.2 },\n { amplitude: -26, angle: 200.8 },\n { amplitude: -26, angle: 201.2 },\n { amplitude: -25.2, angle: 202 },\n { amplitude: -25.2, angle: 202.4 },\n { amplitude: -25.2, angle: 203.2 },\n { amplitude: -24.8, angle: 204.1 },\n { amplitude: -24.8, angle: 204.4 },\n { amplitude: -24.4, angle: 204.7 },\n { amplitude: -24.4, angle: 205.3 },\n { amplitude: -24, angle: 205.9 },\n { amplitude: -24, angle: 206.2 },\n { amplitude: -24, angle: 206.7 },\n { amplitude: -23.6, angle: 206.8 },\n { amplitude: -23.6, angle: 207.1 },\n { amplitude: -23.6, angle: 207.4 },\n { amplitude: -23.200000000000003, angle: 208 },\n { amplitude: -23.200000000000003, angle: 208.5 },\n { amplitude: -22.800000000000004, angle: 209.7 },\n { amplitude: -22.800000000000004, angle: 210.8 },\n { amplitude: -22.400000000000002, angle: 211.4 },\n { amplitude: -22, angle: 213.2 },\n { amplitude: -21.6, angle: 214 },\n { amplitude: -21.200000000000003, angle: 215 },\n { amplitude: -21.200000000000003, angle: 215.2 },\n { amplitude: -20.8, angle: 215.8 },\n { amplitude: -20.8, angle: 216.5 },\n { amplitude: -20.8, angle: 216.7 },\n { amplitude: -20.4, angle: 217.3 },\n { amplitude: -20.4, angle: 218.2 },\n { amplitude: -20.4, angle: 218.8 },\n { amplitude: -20, angle: 219.5 },\n { amplitude: -20, angle: 219.7 },\n { amplitude: -19.6, angle: 219.9 },\n { amplitude: -19.6, angle: 220.5 },\n { amplitude: -19.2, angle: 221.8 },\n { amplitude: -19.2, angle: 222 },\n { amplitude: -18.799999999999997, angle: 222.6 },\n { amplitude: -18.799999999999997, angle: 223.5 },\n { amplitude: -18.4, angle: 224.4 },\n { amplitude: -18, angle: 224.9 },\n { amplitude: -18, angle: 225.6 },\n { amplitude: -17.599999999999998, angle: 226.1 },\n { amplitude: -17.599999999999998, angle: 226.2 },\n { amplitude: -17.200000000000003, angle: 226.7 },\n { amplitude: -17.200000000000003, angle: 226.9 },\n { amplitude: -17.200000000000003, angle: 227.5 },\n { amplitude: -16.8, angle: 227.6 },\n { amplitude: -16.8, angle: 228 },\n { amplitude: -16.8, angle: 228.3 },\n { amplitude: -16.400000000000002, angle: 228.9 },\n { amplitude: -16.400000000000002, angle: 229.3 },\n { amplitude: -16, angle: 229.9 },\n { amplitude: -16, angle: 230.5 },\n { amplitude: -15.600000000000001, angle: 231.6 },\n { amplitude: -15.2, angle: 232.6 },\n { amplitude: -14.8, angle: 233 },\n { amplitude: -14.8, angle: 233.2 },\n { amplitude: -14.399999999999999, angle: 234.9 },\n { amplitude: -14.399999999999999, angle: 235.1 },\n { amplitude: -14, angle: 235.9 },\n { amplitude: -14, angle: 236.6 },\n { amplitude: -14, angle: 237 },\n { amplitude: -14, angle: 237.6 },\n { amplitude: -14, angle: 237.8 },\n { amplitude: -13.599999999999998, angle: 238.7 },\n { amplitude: -13.599999999999998, angle: 239.2 },\n { amplitude: -13.599999999999998, angle: 239.7 },\n { amplitude: -13.2, angle: 240.1 },\n { amplitude: -13.2, angle: 240.6 },\n { amplitude: -12.799999999999997, angle: 241.7 },\n { amplitude: -12.799999999999997, angle: 242.1 },\n { amplitude: -12.400000000000002, angle: 242.9 },\n { amplitude: -12.400000000000002, angle: 243 },\n { amplitude: -12.000000000000002, angle: 243.8 },\n { amplitude: -12.000000000000002, angle: 244 },\n { amplitude: -12.000000000000002, angle: 244.5 },\n { amplitude: -11.600000000000001, angle: 245.1 },\n { amplitude: -11.600000000000001, angle: 245.8 },\n { amplitude: -11.200000000000001, angle: 246.6 },\n { amplitude: -10.8, angle: 247.6 },\n { amplitude: -10.4, angle: 248.7 },\n { amplitude: -10, angle: 249.2 },\n { amplitude: -10, angle: 249.7 },\n { amplitude: -9.6, angle: 250.7 },\n { amplitude: -9.2, angle: 251.2 },\n { amplitude: -9.2, angle: 252.1 },\n { amplitude: -8.799999999999999, angle: 252.2 },\n { amplitude: -8.799999999999999, angle: 252.6 },\n { amplitude: -8.399999999999999, angle: 253.1 },\n { amplitude: -8.399999999999999, angle: 253.5 },\n { amplitude: -8.399999999999999, angle: 254 },\n { amplitude: -7.999999999999998, angle: 254.8 },\n { amplitude: -7.999999999999998, angle: 255.3 },\n { amplitude: -7.599999999999998, angle: 255.6 },\n { amplitude: -7.599999999999998, angle: 255.9 },\n { amplitude: -7.599999999999998, angle: 256.7 },\n { amplitude: -7.200000000000002, angle: 257.5 },\n { amplitude: -7.200000000000002, angle: 257.8 },\n { amplitude: -7.200000000000002, angle: 258.4 },\n { amplitude: -7.200000000000002, angle: 258.5 },\n { amplitude: -7.200000000000002, angle: 259.5 },\n { amplitude: -7.200000000000002, angle: 259.7 },\n { amplitude: -7.200000000000002, angle: 260.1 },\n { amplitude: -7.200000000000002, angle: 260.5 },\n { amplitude: -6.800000000000002, angle: 261.5 },\n { amplitude: -6.800000000000002, angle: 262.3 },\n { amplitude: -6.800000000000002, angle: 262.9 },\n { amplitude: -6.800000000000002, angle: 263.6 },\n { amplitude: -6.800000000000002, angle: 264.2 },\n { amplitude: -6.800000000000002, angle: 264.9 },\n { amplitude: -6.800000000000002, angle: 266 },\n { amplitude: -6.400000000000001, angle: 266.7 },\n { amplitude: -6.400000000000001, angle: 266.8 },\n { amplitude: -6.400000000000001, angle: 267.3 },\n { amplitude: -6.400000000000001, angle: 267.5 },\n { amplitude: -6.400000000000001, angle: 267.9 },\n { amplitude: -6.400000000000001, angle: 268.6 },\n { amplitude: -6.400000000000001, angle: 269.2 },\n { amplitude: -6.000000000000001, angle: 269.3 },\n { amplitude: -6.000000000000001, angle: 269.8 },\n { amplitude: -6.000000000000001, angle: 270 },\n { amplitude: -6.000000000000001, angle: 270.7 },\n { amplitude: -5.6000000000000005, angle: 271.4 },\n { amplitude: -5.6000000000000005, angle: 272 },\n { amplitude: -5.6000000000000005, angle: 272.4 },\n { amplitude: -5.6000000000000005, angle: 272.9 },\n { amplitude: -5.6000000000000005, angle: 273.2 },\n { amplitude: -5.2, angle: 274.1 },\n { amplitude: -5.2, angle: 274.4 },\n { amplitude: -5.2, angle: 274.9 },\n { amplitude: -5.2, angle: 275.5 },\n { amplitude: -5.2, angle: 276.2 },\n { amplitude: -5.2, angle: 276.8 },\n { amplitude: -5.2, angle: 279.3 },\n { amplitude: -5.2, angle: 279.6 },\n { amplitude: -5.2, angle: 280.2 },\n { amplitude: -5.2, angle: 280.5 },\n { amplitude: -5.2, angle: 281 },\n { amplitude: -5.2, angle: 281.7 },\n { amplitude: -5.2, angle: 282.4 },\n { amplitude: -5.2, angle: 283 },\n { amplitude: -5.2, angle: 283.4 },\n { amplitude: -5.2, angle: 284.2 },\n { amplitude: -5.2, angle: 284.5 },\n { amplitude: -5.2, angle: 285.5 },\n { amplitude: -5.2, angle: 286.4 },\n { amplitude: -5.2, angle: 287.7 },\n { amplitude: -5.2, angle: 287.8 },\n { amplitude: -4.8, angle: 288.9 },\n { amplitude: -4.8, angle: 289.5 },\n { amplitude: -5.2, angle: 290.3 },\n { amplitude: -5.2, angle: 290.5 },\n { amplitude: -5.2, angle: 291 },\n { amplitude: -5.2, angle: 292.2 },\n { amplitude: -5.2, angle: 292.9 },\n { amplitude: -5.2, angle: 293.5 },\n { amplitude: -5.2, angle: 294.1 },\n { amplitude: -5.2, angle: 294.3 },\n { amplitude: -5.2, angle: 295.2 },\n { amplitude: -5.2, angle: 295.6 },\n { amplitude: -4.8, angle: 295.7 },\n { amplitude: -4.8, angle: 296.6 },\n { amplitude: -4.8, angle: 297 },\n { amplitude: -4.8, angle: 297.5 },\n { amplitude: -4.8, angle: 298.8 },\n { amplitude: -4.8, angle: 299.6 },\n { amplitude: -4.8, angle: 300.1 },\n { amplitude: -4.8, angle: 300.8 },\n { amplitude: -4.8, angle: 301.2 },\n { amplitude: -4.3999999999999995, angle: 302 },\n { amplitude: -4.8, angle: 302.3 },\n { amplitude: -4.3999999999999995, angle: 302.8 },\n { amplitude: -4.3999999999999995, angle: 303.3 },\n { amplitude: -4.3999999999999995, angle: 303.4 },\n { amplitude: -4.3999999999999995, angle: 303.8 },\n { amplitude: -4.3999999999999995, angle: 304.3 },\n { amplitude: -3.999999999999999, angle: 305.6 },\n { amplitude: -3.5999999999999988, angle: 308.9 },\n { amplitude: -3.5999999999999988, angle: 309 },\n { amplitude: -3.1999999999999984, angle: 310.2 },\n { amplitude: -3.1999999999999984, angle: 310.5 },\n { amplitude: -3.1999999999999984, angle: 310.8 },\n { amplitude: -3.1999999999999984, angle: 311.2 },\n { amplitude: -3.1999999999999984, angle: 311.3 },\n { amplitude: -2.799999999999998, angle: 312 },\n { amplitude: -2.799999999999998, angle: 312.2 },\n { amplitude: -2.799999999999998, angle: 312.6 },\n { amplitude: -3.1999999999999984, angle: 312.8 },\n { amplitude: -2.799999999999998, angle: 313.4 },\n { amplitude: -2.799999999999998, angle: 314.2 },\n { amplitude: -2.799999999999998, angle: 314.6 },\n { amplitude: -2.799999999999998, angle: 314.8 },\n { amplitude: -2.799999999999998, angle: 315.3 },\n { amplitude: -2.799999999999998, angle: 315.7 },\n { amplitude: -2.799999999999998, angle: 316.1 },\n { amplitude: -2.799999999999998, angle: 316.9 },\n { amplitude: -2.799999999999998, angle: 317.2 },\n { amplitude: -2.799999999999998, angle: 317.8 },\n { amplitude: -2.400000000000002, angle: 318.6 },\n { amplitude: -2.400000000000002, angle: 319.1 },\n { amplitude: -2.400000000000002, angle: 319.8 },\n { amplitude: -2.400000000000002, angle: 320.4 },\n { amplitude: -2.400000000000002, angle: 321.2 },\n { amplitude: -2.400000000000002, angle: 321.3 },\n { amplitude: -2.0000000000000018, angle: 321.8 },\n { amplitude: -2.400000000000002, angle: 322.4 },\n { amplitude: -2.0000000000000018, angle: 323.1 },\n { amplitude: -2.0000000000000018, angle: 323.4 },\n { amplitude: -2.0000000000000018, angle: 323.9 },\n { amplitude: -2.0000000000000018, angle: 324 },\n { amplitude: -1.6000000000000014, angle: 324.1 },\n { amplitude: -1.6000000000000014, angle: 324.8 },\n { amplitude: -1.6000000000000014, angle: 325.7 },\n { amplitude: -1.6000000000000014, angle: 326.2 },\n { amplitude: -1.6000000000000014, angle: 326.5 },\n { amplitude: -1.6000000000000014, angle: 326.6 },\n { amplitude: -1.6000000000000014, angle: 327.3 },\n { amplitude: -1.6000000000000014, angle: 327.9 },\n { amplitude: -1.6000000000000014, angle: 328.2 },\n { amplitude: -1.6000000000000014, angle: 328.5 },\n { amplitude: -1.6000000000000014, angle: 329.4 },\n { amplitude: -1.6000000000000014, angle: 329.7 },\n { amplitude: -1.6000000000000014, angle: 330 },\n { amplitude: -1.6000000000000014, angle: 330.3 },\n { amplitude: -1.6000000000000014, angle: 330.8 },\n { amplitude: -1.6000000000000014, angle: 331.5 },\n { amplitude: -1.6000000000000014, angle: 333.6 },\n { amplitude: -1.6000000000000014, angle: 334.3 },\n { amplitude: -1.6000000000000014, angle: 334.4 },\n { amplitude: -1.6000000000000014, angle: 335.1 },\n { amplitude: -2.0000000000000018, angle: 335.9 },\n { amplitude: -2.0000000000000018, angle: 337.2 },\n { amplitude: -2.0000000000000018, angle: 337.4 },\n { amplitude: -2.0000000000000018, angle: 337.9 },\n { amplitude: -2.0000000000000018, angle: 338.7 },\n { amplitude: -2.0000000000000018, angle: 338.9 },\n { amplitude: -2.0000000000000018, angle: 339.1 },\n { amplitude: -2.0000000000000018, angle: 339.8 },\n { amplitude: -2.0000000000000018, angle: 340.3 },\n { amplitude: -2.0000000000000018, angle: 340.7 },\n { amplitude: -2.0000000000000018, angle: 340.8 },\n { amplitude: -2.0000000000000018, angle: 341.2 },\n { amplitude: -2.0000000000000018, angle: 341.5 },\n { amplitude: -2.0000000000000018, angle: 342.1 },\n { amplitude: -2.0000000000000018, angle: 342.6 },\n { amplitude: -2.0000000000000018, angle: 343.2 },\n { amplitude: -1.6000000000000014, angle: 343.9 },\n { amplitude: -1.6000000000000014, angle: 344 },\n { amplitude: -2.0000000000000018, angle: 344.3 },\n { amplitude: -2.0000000000000018, angle: 344.4 },\n { amplitude: -2.0000000000000018, angle: 345.2 },\n { amplitude: -2.0000000000000018, angle: 345.6 },\n { amplitude: -2.0000000000000018, angle: 345.7 },\n { amplitude: -2.0000000000000018, angle: 346.1 },\n { amplitude: -2.0000000000000018, angle: 346.7 },\n { amplitude: -2.0000000000000018, angle: 346.8 },\n { amplitude: -2.0000000000000018, angle: 347.2 },\n { amplitude: -1.6000000000000014, angle: 347.4 },\n { amplitude: -2.0000000000000018, angle: 347.8 },\n { amplitude: -2.0000000000000018, angle: 348 },\n { amplitude: -1.6000000000000014, angle: 348.4 },\n { amplitude: -1.6000000000000014, angle: 348.6 },\n { amplitude: -1.6000000000000014, angle: 349 },\n { amplitude: -1.6000000000000014, angle: 349.4 },\n { amplitude: -1.6000000000000014, angle: 349.6 },\n { amplitude: -1.6000000000000014, angle: 349.8 },\n { amplitude: -1.6000000000000014, angle: 350.9 },\n { amplitude: -1.200000000000001, angle: 351.3 },\n { amplitude: -1.200000000000001, angle: 351.8 },\n { amplitude: -1.200000000000001, angle: 351.9 },\n { amplitude: -1.200000000000001, angle: 352.1 },\n { amplitude: -1.200000000000001, angle: 352.5 },\n { amplitude: -1.200000000000001, angle: 353 },\n { amplitude: -1.200000000000001, angle: 353.6 },\n { amplitude: -1.200000000000001, angle: 354.1 },\n { amplitude: -0.8000000000000007, angle: 354.8 },\n { amplitude: -0.8000000000000007, angle: 355.3 },\n { amplitude: -0.8000000000000007, angle: 355.4 },\n { amplitude: -0.8000000000000007, angle: 355.7 },\n { amplitude: -0.8000000000000007, angle: 355.9 },\n { amplitude: -0.8000000000000007, angle: 356.5 },\n { amplitude: -0.8000000000000007, angle: 356.9 },\n { amplitude: -0.40000000000000036, angle: 357.4 },\n { amplitude: -0.40000000000000036, angle: 357.6 },\n { amplitude: -0.40000000000000036, angle: 358.7 },\n { amplitude: -0.40000000000000036, angle: 359.2 },\n { amplitude: -0.40000000000000036, angle: 359.5 },\n { amplitude: -0.40000000000000036, angle: 359.6 },\n { amplitude: -0.40000000000000036, angle: 360 },\n ],\n },\n {\n name: '8KHz',\n data: [\n { angle: 0, amplitude: -0.40000000000000036 },\n { angle: 0.3, amplitude: -0.40000000000000036 },\n { angle: 0.5, amplitude: -0.40000000000000036 },\n { angle: 0.8, amplitude: -0.40000000000000036 },\n { angle: 1.3, amplitude: -0.40000000000000036 },\n { angle: 1.4, amplitude: -0.40000000000000036 },\n { angle: 1.5, amplitude: -0.40000000000000036 },\n { angle: 1.6, amplitude: -0.40000000000000036 },\n { angle: 1.9, amplitude: -0.40000000000000036 },\n { angle: 2, amplitude: -0.40000000000000036 },\n { angle: 2.4, amplitude: -0.40000000000000036 },\n { angle: 2.7, amplitude: -0.8000000000000007 },\n { angle: 3.1, amplitude: -0.8000000000000007 },\n { angle: 3.3, amplitude: -0.8000000000000007 },\n { angle: 3.8, amplitude: -0.8000000000000007 },\n { angle: 4.1, amplitude: -0.8000000000000007 },\n { angle: 4.2, amplitude: -0.8000000000000007 },\n { angle: 4.3, amplitude: -0.8000000000000007 },\n { angle: 4.6, amplitude: -1.200000000000001 },\n { angle: 4.8, amplitude: -1.200000000000001 },\n { angle: 4.9, amplitude: -1.200000000000001 },\n { angle: 5.3, amplitude: -1.200000000000001 },\n { angle: 5.5, amplitude: -1.200000000000001 },\n { angle: 5.7, amplitude: -1.200000000000001 },\n { angle: 5.9, amplitude: -1.200000000000001 },\n { angle: 6.3, amplitude: -1.200000000000001 },\n { angle: 6.4, amplitude: -1.200000000000001 },\n { angle: 6.6, amplitude: -1.200000000000001 },\n { angle: 6.9, amplitude: -1.200000000000001 },\n { angle: 7, amplitude: -1.200000000000001 },\n { angle: 7.4, amplitude: -1.200000000000001 },\n { angle: 7.6, amplitude: -1.200000000000001 },\n { angle: 7.7, amplitude: -1.200000000000001 },\n { angle: 8.1, amplitude: -1.200000000000001 },\n { angle: 8.2, amplitude: -1.200000000000001 },\n { angle: 8.8, amplitude: -1.6000000000000014 },\n { angle: 9.1, amplitude: -1.6000000000000014 },\n { angle: 9.6, amplitude: -1.6000000000000014 },\n { angle: 9.8, amplitude: -1.6000000000000014 },\n { angle: 9.9, amplitude: -1.6000000000000014 },\n { angle: 10.2, amplitude: -1.6000000000000014 },\n { angle: 10.4, amplitude: -1.6000000000000014 },\n { angle: 10.5, amplitude: -1.6000000000000014 },\n { angle: 10.8, amplitude: -1.6000000000000014 },\n { angle: 10.9, amplitude: -1.6000000000000014 },\n { angle: 11, amplitude: -1.6000000000000014 },\n { angle: 11.4, amplitude: -1.6000000000000014 },\n { angle: 11.6, amplitude: -1.6000000000000014 },\n { angle: 12, amplitude: -1.6000000000000014 },\n { angle: 12.2, amplitude: -1.6000000000000014 },\n { angle: 12.5, amplitude: -1.6000000000000014 },\n { angle: 12.6, amplitude: -1.6000000000000014 },\n { angle: 13.2, amplitude: -1.6000000000000014 },\n { angle: 13.4, amplitude: -1.6000000000000014 },\n { angle: 13.6, amplitude: -1.6000000000000014 },\n { angle: 13.8, amplitude: -1.6000000000000014 },\n { angle: 13.9, amplitude: -1.6000000000000014 },\n { angle: 14.2, amplitude: -1.6000000000000014 },\n { angle: 14.7, amplitude: -1.6000000000000014 },\n { angle: 15, amplitude: -1.6000000000000014 },\n { angle: 15.3, amplitude: -1.6000000000000014 },\n { angle: 15.4, amplitude: -1.6000000000000014 },\n { angle: 15.8, amplitude: -1.200000000000001 },\n { angle: 16.1, amplitude: -1.200000000000001 },\n { angle: 16.3, amplitude: -1.200000000000001 },\n { angle: 16.6, amplitude: -1.6000000000000014 },\n { angle: 16.7, amplitude: -1.6000000000000014 },\n { angle: 17, amplitude: -1.200000000000001 },\n { angle: 17.1, amplitude: -1.200000000000001 },\n { angle: 17.2, amplitude: -1.200000000000001 },\n { angle: 17.6, amplitude: -1.200000000000001 },\n { angle: 17.7, amplitude: -1.200000000000001 },\n { angle: 18.3, amplitude: -1.200000000000001 },\n { angle: 18.6, amplitude: -1.200000000000001 },\n { angle: 18.7, amplitude: -1.200000000000001 },\n { angle: 19.1, amplitude: -1.200000000000001 },\n { angle: 19.2, amplitude: -1.200000000000001 },\n { angle: 21.1, amplitude: -1.200000000000001 },\n { angle: 21.6, amplitude: -1.200000000000001 },\n { angle: 21.9, amplitude: -0.8000000000000007 },\n { angle: 22.2, amplitude: -1.200000000000001 },\n { angle: 22.5, amplitude: -0.8000000000000007 },\n { angle: 22.7, amplitude: -0.8000000000000007 },\n { angle: 22.8, amplitude: -0.8000000000000007 },\n { angle: 23, amplitude: -0.8000000000000007 },\n { angle: 23.3, amplitude: -1.200000000000001 },\n { angle: 23.5, amplitude: -1.200000000000001 },\n { angle: 23.7, amplitude: -0.8000000000000007 },\n { angle: 23.9, amplitude: -0.8000000000000007 },\n { angle: 24.2, amplitude: -0.8000000000000007 },\n { angle: 24.6, amplitude: -1.200000000000001 },\n { angle: 24.9, amplitude: -1.200000000000001 },\n { angle: 25.6, amplitude: -0.8000000000000007 },\n { angle: 26.1, amplitude: -1.200000000000001 },\n { angle: 26.2, amplitude: -0.8000000000000007 },\n { angle: 26.4, amplitude: -0.8000000000000007 },\n { angle: 26.8, amplitude: -0.8000000000000007 },\n { angle: 26.9, amplitude: -0.8000000000000007 },\n { angle: 27.3, amplitude: -0.8000000000000007 },\n { angle: 27.5, amplitude: -0.8000000000000007 },\n { angle: 27.9, amplitude: -0.8000000000000007 },\n { angle: 28.3, amplitude: -1.200000000000001 },\n { angle: 28.7, amplitude: -1.200000000000001 },\n { angle: 29.2, amplitude: -0.8000000000000007 },\n { angle: 29.9, amplitude: -1.200000000000001 },\n { angle: 30.4, amplitude: -1.200000000000001 },\n { angle: 30.7, amplitude: -1.200000000000001 },\n { angle: 31.5, amplitude: -0.8000000000000007 },\n { angle: 31.9, amplitude: -0.8000000000000007 },\n { angle: 32.7, amplitude: -0.8000000000000007 },\n { angle: 32.8, amplitude: -0.8000000000000007 },\n { angle: 33.4, amplitude: -0.8000000000000007 },\n { angle: 33.5, amplitude: -0.8000000000000007 },\n { angle: 33.8, amplitude: -0.8000000000000007 },\n { angle: 34.4, amplitude: -0.8000000000000007 },\n { angle: 34.9, amplitude: -0.8000000000000007 },\n { angle: 35.4, amplitude: -0.8000000000000007 },\n { angle: 35.6, amplitude: -0.8000000000000007 },\n { angle: 36.3, amplitude: -1.200000000000001 },\n { angle: 36.4, amplitude: -1.200000000000001 },\n { angle: 37.2, amplitude: -1.200000000000001 },\n { angle: 37.5, amplitude: -1.200000000000001 },\n { angle: 38.3, amplitude: -1.6000000000000014 },\n { angle: 38.7, amplitude: -1.6000000000000014 },\n { angle: 39, amplitude: -1.6000000000000014 },\n { angle: 39.1, amplitude: -1.6000000000000014 },\n { angle: 39.2, amplitude: -1.6000000000000014 },\n { angle: 39.4, amplitude: -1.6000000000000014 },\n { angle: 39.9, amplitude: -1.6000000000000014 },\n { angle: 40.3, amplitude: -1.6000000000000014 },\n { angle: 40.6, amplitude: -1.6000000000000014 },\n { angle: 41, amplitude: -1.6000000000000014 },\n { angle: 41.1, amplitude: -2.0000000000000018 },\n { angle: 41.3, amplitude: -1.6000000000000014 },\n { angle: 41.5, amplitude: -1.6000000000000014 },\n { angle: 42.3, amplitude: -1.6000000000000014 },\n { angle: 42.4, amplitude: -1.6000000000000014 },\n { angle: 44, amplitude: -1.6000000000000014 },\n { angle: 44.6, amplitude: -1.6000000000000014 },\n { angle: 44.8, amplitude: -1.6000000000000014 },\n { angle: 45, amplitude: -1.6000000000000014 },\n { angle: 45.2, amplitude: -1.6000000000000014 },\n { angle: 45.4, amplitude: -1.6000000000000014 },\n { angle: 45.5, amplitude: -1.6000000000000014 },\n { angle: 46, amplitude: -2.0000000000000018 },\n { angle: 46.5, amplitude: -2.0000000000000018 },\n { angle: 46.9, amplitude: -2.0000000000000018 },\n { angle: 47.7, amplitude: -2.0000000000000018 },\n { angle: 47.8, amplitude: -2.0000000000000018 },\n { angle: 48.3, amplitude: -2.400000000000002 },\n { angle: 49.2, amplitude: -2.400000000000002 },\n { angle: 49.5, amplitude: -2.400000000000002 },\n { angle: 49.6, amplitude: -2.400000000000002 },\n { angle: 50.2, amplitude: -2.400000000000002 },\n { angle: 50.9, amplitude: -2.400000000000002 },\n { angle: 51.4, amplitude: -2.799999999999998 },\n { angle: 51.5, amplitude: -2.799999999999998 },\n { angle: 51.7, amplitude: -2.400000000000002 },\n { angle: 52.1, amplitude: -2.799999999999998 },\n { angle: 52.3, amplitude: -2.799999999999998 },\n { angle: 52.8, amplitude: -2.799999999999998 },\n { angle: 53, amplitude: -2.799999999999998 },\n { angle: 53.3, amplitude: -2.799999999999998 },\n { angle: 53.5, amplitude: -2.799999999999998 },\n { angle: 54.1, amplitude: -2.799999999999998 },\n { angle: 54.8, amplitude: -2.799999999999998 },\n { angle: 54.9, amplitude: -3.1999999999999984 },\n { angle: 55.1, amplitude: -2.799999999999998 },\n { angle: 55.3, amplitude: -2.799999999999998 },\n { angle: 55.6, amplitude: -2.799999999999998 },\n { angle: 56, amplitude: -3.1999999999999984 },\n { angle: 56.3, amplitude: -2.799999999999998 },\n { angle: 56.4, amplitude: -2.799999999999998 },\n { angle: 56.8, amplitude: -3.1999999999999984 },\n { angle: 57, amplitude: -3.1999999999999984 },\n { angle: 57.2, amplitude: -3.1999999999999984 },\n { angle: 57.5, amplitude: -3.1999999999999984 },\n { angle: 57.7, amplitude: -2.799999999999998 },\n { angle: 57.9, amplitude: -3.1999999999999984 },\n { angle: 58.1, amplitude: -3.1999999999999984 },\n { angle: 58.2, amplitude: -3.1999999999999984 },\n { angle: 58.6, amplitude: -3.1999999999999984 },\n { angle: 58.8, amplitude: -3.1999999999999984 },\n { angle: 59.5, amplitude: -2.799999999999998 },\n { angle: 59.7, amplitude: -2.799999999999998 },\n { angle: 60.9, amplitude: -2.799999999999998 },\n { angle: 61.1, amplitude: -2.799999999999998 },\n { angle: 61.8, amplitude: -2.799999999999998 },\n { angle: 62.1, amplitude: -2.799999999999998 },\n { angle: 62.3, amplitude: -2.799999999999998 },\n { angle: 62.7, amplitude: -2.799999999999998 },\n { angle: 63.1, amplitude: -2.799999999999998 },\n { angle: 63.4, amplitude: -2.799999999999998 },\n { angle: 63.5, amplitude: -2.799999999999998 },\n { angle: 63.6, amplitude: -2.799999999999998 },\n { angle: 64, amplitude: -2.799999999999998 },\n { angle: 64.3, amplitude: -2.799999999999998 },\n { angle: 64.8, amplitude: -2.799999999999998 },\n { angle: 65.1, amplitude: -2.799999999999998 },\n { angle: 65.3, amplitude: -3.1999999999999984 },\n { angle: 65.4, amplitude: -2.799999999999998 },\n { angle: 66.3, amplitude: -3.1999999999999984 },\n { angle: 66.6, amplitude: -3.1999999999999984 },\n { angle: 67, amplitude: -3.1999999999999984 },\n { angle: 67.7, amplitude: -3.1999999999999984 },\n { angle: 67.8, amplitude: -3.1999999999999984 },\n { angle: 68.2, amplitude: -3.1999999999999984 },\n { angle: 68.4, amplitude: -3.1999999999999984 },\n { angle: 68.7, amplitude: -3.1999999999999984 },\n { angle: 68.9, amplitude: -3.1999999999999984 },\n { angle: 69.6, amplitude: -3.1999999999999984 },\n { angle: 69.7, amplitude: -3.1999999999999984 },\n { angle: 69.9, amplitude: -3.1999999999999984 },\n { angle: 70.1, amplitude: -3.1999999999999984 },\n { angle: 70.6, amplitude: -3.5999999999999988 },\n { angle: 71.1, amplitude: -3.5999999999999988 },\n { angle: 71.4, amplitude: -3.1999999999999984 },\n { angle: 71.8, amplitude: -3.5999999999999988 },\n { angle: 72.3, amplitude: -3.1999999999999984 },\n { angle: 72.4, amplitude: -3.5999999999999988 },\n { angle: 72.6, amplitude: -3.5999999999999988 },\n { angle: 72.8, amplitude: -3.5999999999999988 },\n { angle: 73, amplitude: -3.5999999999999988 },\n { angle: 73.1, amplitude: -3.5999999999999988 },\n { angle: 73.4, amplitude: -3.5999999999999988 },\n { angle: 73.7, amplitude: -3.5999999999999988 },\n { angle: 74.1, amplitude: -3.5999999999999988 },\n { angle: 74.6, amplitude: -3.5999999999999988 },\n { angle: 74.7, amplitude: -3.5999999999999988 },\n { angle: 75.1, amplitude: -3.999999999999999 },\n { angle: 75.3, amplitude: -3.999999999999999 },\n { angle: 75.4, amplitude: -3.999999999999999 },\n { angle: 75.7, amplitude: -3.999999999999999 },\n { angle: 76, amplitude: -3.999999999999999 },\n { angle: 76.3, amplitude: -3.999999999999999 },\n { angle: 76.4, amplitude: -3.999999999999999 },\n { angle: 76.8, amplitude: -3.999999999999999 },\n { angle: 77.1, amplitude: -3.999999999999999 },\n { angle: 77.5, amplitude: -3.999999999999999 },\n { angle: 77.6, amplitude: -3.999999999999999 },\n { angle: 77.8, amplitude: -3.999999999999999 },\n { angle: 78.2, amplitude: -3.999999999999999 },\n { angle: 78.4, amplitude: -3.999999999999999 },\n { angle: 78.7, amplitude: -3.999999999999999 },\n { angle: 78.8, amplitude: -3.999999999999999 },\n { angle: 79, amplitude: -3.5999999999999988 },\n { angle: 79.3, amplitude: -3.5999999999999988 },\n { angle: 79.5, amplitude: -3.5999999999999988 },\n { angle: 79.6, amplitude: -3.5999999999999988 },\n { angle: 79.9, amplitude: -3.999999999999999 },\n { angle: 80, amplitude: -3.999999999999999 },\n { angle: 80.2, amplitude: -3.999999999999999 },\n { angle: 80.5, amplitude: -3.999999999999999 },\n { angle: 80.6, amplitude: -3.999999999999999 },\n { angle: 80.8, amplitude: -3.999999999999999 },\n { angle: 81.1, amplitude: -3.999999999999999 },\n { angle: 81.2, amplitude: -3.999999999999999 },\n { angle: 81.8, amplitude: -3.999999999999999 },\n { angle: 81.9, amplitude: -3.999999999999999 },\n { angle: 82.5, amplitude: -3.999999999999999 },\n { angle: 82.8, amplitude: -3.999999999999999 },\n { angle: 83.5, amplitude: -3.999999999999999 },\n { angle: 83.7, amplitude: -3.999999999999999 },\n { angle: 84.1, amplitude: -3.999999999999999 },\n { angle: 84.3, amplitude: -4.3999999999999995 },\n { angle: 84.7, amplitude: -4.3999999999999995 },\n { angle: 84.8, amplitude: -4.3999999999999995 },\n { angle: 85.1, amplitude: -4.3999999999999995 },\n { angle: 85.3, amplitude: -4.3999999999999995 },\n { angle: 85.4, amplitude: -4.3999999999999995 },\n { angle: 85.9, amplitude: -4.3999999999999995 },\n { angle: 86, amplitude: -4.3999999999999995 },\n { angle: 86.5, amplitude: -4.3999999999999995 },\n { angle: 86.6, amplitude: -4.3999999999999995 },\n { angle: 87, amplitude: -4.8 },\n { angle: 87.2, amplitude: -4.8 },\n { angle: 87.6, amplitude: -4.8 },\n { angle: 88.1, amplitude: -4.8 },\n { angle: 88.2, amplitude: -4.8 },\n { angle: 88.4, amplitude: -4.8 },\n { angle: 88.7, amplitude: -4.8 },\n { angle: 88.8, amplitude: -4.8 },\n { angle: 89.3, amplitude: -4.8 },\n { angle: 89.6, amplitude: -4.8 },\n { angle: 89.9, amplitude: -4.8 },\n { angle: 90, amplitude: -4.8 },\n { angle: 90.2, amplitude: -4.8 },\n { angle: 90.5, amplitude: -4.8 },\n { angle: 90.8, amplitude: -4.8 },\n { angle: 92, amplitude: -5.2 },\n { angle: 92.3, amplitude: -5.2 },\n { angle: 92.6, amplitude: -5.2 },\n { angle: 92.9, amplitude: -5.2 },\n { angle: 93.1, amplitude: -5.2 },\n { angle: 93.2, amplitude: -5.2 },\n { angle: 93.5, amplitude: -5.6000000000000005 },\n { angle: 93.7, amplitude: -5.6000000000000005 },\n { angle: 93.9, amplitude: -5.6000000000000005 },\n { angle: 94.2, amplitude: -5.6000000000000005 },\n { angle: 94.3, amplitude: -5.6000000000000005 },\n { angle: 94.8, amplitude: -5.6000000000000005 },\n { angle: 95, amplitude: -5.6000000000000005 },\n { angle: 95.5, amplitude: -6.000000000000001 },\n { angle: 95.8, amplitude: -6.000000000000001 },\n { angle: 96.2, amplitude: -6.000000000000001 },\n { angle: 96.7, amplitude: -6.000000000000001 },\n { angle: 97.1, amplitude: -6.000000000000001 },\n { angle: 97.4, amplitude: -6.000000000000001 },\n { angle: 97.7, amplitude: -6.000000000000001 },\n { angle: 98, amplitude: -6.000000000000001 },\n { angle: 98.2, amplitude: -6.400000000000001 },\n { angle: 98.3, amplitude: -6.400000000000001 },\n { angle: 98.7, amplitude: -6.400000000000001 },\n { angle: 98.9, amplitude: -6.400000000000001 },\n { angle: 99, amplitude: -6.400000000000001 },\n { angle: 99.3, amplitude: -6.400000000000001 },\n { angle: 100, amplitude: -6.400000000000001 },\n { angle: 100.3, amplitude: -6.400000000000001 },\n { angle: 100.6, amplitude: -6.400000000000001 },\n { angle: 100.7, amplitude: -6.400000000000001 },\n { angle: 101, amplitude: -6.400000000000001 },\n { angle: 101.3, amplitude: -6.400000000000001 },\n { angle: 101.7, amplitude: -6.800000000000002 },\n { angle: 102, amplitude: -6.400000000000001 },\n { angle: 102.2, amplitude: -6.800000000000002 },\n { angle: 102.4, amplitude: -6.800000000000002 },\n { angle: 103, amplitude: -6.800000000000002 },\n { angle: 103.1, amplitude: -7.200000000000002 },\n { angle: 103.5, amplitude: -7.200000000000002 },\n { angle: 103.6, amplitude: -7.200000000000002 },\n { angle: 104.1, amplitude: -7.200000000000002 },\n { angle: 104.4, amplitude: -7.200000000000002 },\n { angle: 104.6, amplitude: -7.200000000000002 },\n { angle: 104.9, amplitude: -7.200000000000002 },\n { angle: 105.1, amplitude: -7.599999999999998 },\n { angle: 105.3, amplitude: -7.599999999999998 },\n { angle: 105.7, amplitude: -7.599999999999998 },\n { angle: 106, amplitude: -7.599999999999998 },\n { angle: 106.5, amplitude: -7.599999999999998 },\n { angle: 106.7, amplitude: -7.999999999999998 },\n { angle: 106.8, amplitude: -7.999999999999998 },\n { angle: 107.3, amplitude: -7.999999999999998 },\n { angle: 107.5, amplitude: -7.999999999999998 },\n { angle: 107.6, amplitude: -8.399999999999999 },\n { angle: 108.1, amplitude: -8.399999999999999 },\n { angle: 108.4, amplitude: -8.399999999999999 },\n { angle: 108.6, amplitude: -8.399999999999999 },\n { angle: 109, amplitude: -8.399999999999999 },\n { angle: 109.2, amplitude: -8.399999999999999 },\n { angle: 109.5, amplitude: -8.799999999999999 },\n { angle: 109.8, amplitude: -8.799999999999999 },\n { angle: 110, amplitude: -8.799999999999999 },\n { angle: 110.1, amplitude: -8.799999999999999 },\n { angle: 110.6, amplitude: -8.799999999999999 },\n { angle: 110.9, amplitude: -8.799999999999999 },\n { angle: 111, amplitude: -8.799999999999999 },\n { angle: 111.5, amplitude: -8.799999999999999 },\n { angle: 111.7, amplitude: -8.799999999999999 },\n { angle: 112.2, amplitude: -8.799999999999999 },\n { angle: 112.4, amplitude: -9.2 },\n { angle: 112.6, amplitude: -9.2 },\n { angle: 112.7, amplitude: -9.2 },\n { angle: 113.5, amplitude: -9.2 },\n { angle: 113.7, amplitude: -9.6 },\n { angle: 114, amplitude: -9.2 },\n { angle: 114.2, amplitude: -9.6 },\n { angle: 114.4, amplitude: -9.6 },\n { angle: 114.9, amplitude: -9.6 },\n { angle: 115, amplitude: -9.6 },\n { angle: 115.3, amplitude: -9.6 },\n { angle: 115.4, amplitude: -10 },\n { angle: 115.8, amplitude: -10 },\n { angle: 116.3, amplitude: -10 },\n { angle: 116.4, amplitude: -10 },\n { angle: 117.1, amplitude: -10.4 },\n { angle: 117.3, amplitude: -10 },\n { angle: 117.5, amplitude: -10.4 },\n { angle: 117.8, amplitude: -10.4 },\n { angle: 118, amplitude: -10.8 },\n { angle: 118.3, amplitude: -10.8 },\n { angle: 118.4, amplitude: -10.8 },\n { angle: 118.8, amplitude: -10.8 },\n { angle: 119, amplitude: -10.8 },\n { angle: 119.4, amplitude: -10.8 },\n { angle: 119.6, amplitude: -10.8 },\n { angle: 119.8, amplitude: -11.200000000000001 },\n { angle: 120.5, amplitude: -11.200000000000001 },\n { angle: 120.7, amplitude: -11.200000000000001 },\n { angle: 120.9, amplitude: -11.200000000000001 },\n { angle: 121.4, amplitude: -11.600000000000001 },\n { angle: 121.8, amplitude: -11.600000000000001 },\n { angle: 121.9, amplitude: -11.600000000000001 },\n { angle: 122.1, amplitude: -11.600000000000001 },\n { angle: 122.3, amplitude: -11.600000000000001 },\n { angle: 122.8, amplitude: -12.000000000000002 },\n { angle: 123.3, amplitude: -12.000000000000002 },\n { angle: 123.7, amplitude: -12.000000000000002 },\n { angle: 124.5, amplitude: -12.799999999999997 },\n { angle: 124.9, amplitude: -12.799999999999997 },\n { angle: 125.7, amplitude: -12.799999999999997 },\n { angle: 126, amplitude: -13.2 },\n { angle: 126.1, amplitude: -13.2 },\n { angle: 126.5, amplitude: -13.599999999999998 },\n { angle: 126.8, amplitude: -13.599999999999998 },\n { angle: 127, amplitude: -13.599999999999998 },\n { angle: 127.1, amplitude: -13.599999999999998 },\n { angle: 127.4, amplitude: -13.599999999999998 },\n { angle: 127.9, amplitude: -14 },\n { angle: 128.1, amplitude: -14 },\n { angle: 129.1, amplitude: -14.399999999999999 },\n { angle: 129.8, amplitude: -14.399999999999999 },\n { angle: 130, amplitude: -14.399999999999999 },\n { angle: 130.4, amplitude: -14.8 },\n { angle: 130.5, amplitude: -14.8 },\n { angle: 130.9, amplitude: -15.2 },\n { angle: 131.4, amplitude: -14.8 },\n { angle: 131.5, amplitude: -15.2 },\n { angle: 132.1, amplitude: -15.2 },\n { angle: 132.5, amplitude: -15.600000000000001 },\n { angle: 133.9, amplitude: -15.600000000000001 },\n { angle: 134.2, amplitude: -15.600000000000001 },\n { angle: 135, amplitude: -16 },\n { angle: 135.1, amplitude: -16 },\n { angle: 136.1, amplitude: -16.400000000000002 },\n { angle: 136.4, amplitude: -16.400000000000002 },\n { angle: 136.7, amplitude: -16.400000000000002 },\n { angle: 137.7, amplitude: -16.8 },\n { angle: 138, amplitude: -16.8 },\n { angle: 138.2, amplitude: -16.8 },\n { angle: 138.7, amplitude: -17.200000000000003 },\n { angle: 138.9, amplitude: -17.200000000000003 },\n { angle: 139.3, amplitude: -16.8 },\n { angle: 139.7, amplitude: -17.200000000000003 },\n { angle: 139.9, amplitude: -17.200000000000003 },\n { angle: 140, amplitude: -17.200000000000003 },\n { angle: 140.9, amplitude: -17.200000000000003 },\n { angle: 141.1, amplitude: -17.200000000000003 },\n { angle: 141.4, amplitude: -17.599999999999998 },\n { angle: 141.6, amplitude: -17.599999999999998 },\n { angle: 141.8, amplitude: -17.599999999999998 },\n { angle: 142.2, amplitude: -17.599999999999998 },\n { angle: 142.3, amplitude: -17.599999999999998 },\n { angle: 142.5, amplitude: -17.599999999999998 },\n { angle: 143.1, amplitude: -18 },\n { angle: 143.4, amplitude: -18 },\n { angle: 144, amplitude: -18 },\n { angle: 144.2, amplitude: -18 },\n { angle: 144.4, amplitude: -18 },\n { angle: 144.7, amplitude: -18 },\n { angle: 144.9, amplitude: -18.4 },\n { angle: 145.1, amplitude: -18.4 },\n { angle: 145.8, amplitude: -18.4 },\n { angle: 146.6, amplitude: -18.799999999999997 },\n { angle: 147.7, amplitude: -18.799999999999997 },\n { angle: 147.9, amplitude: -18.799999999999997 },\n { angle: 148.9, amplitude: -18.799999999999997 },\n { angle: 149.5, amplitude: -18.799999999999997 },\n { angle: 149.8, amplitude: -18.799999999999997 },\n { angle: 150.5, amplitude: -19.2 },\n { angle: 150.7, amplitude: -19.2 },\n { angle: 151.4, amplitude: -19.2 },\n { angle: 151.6, amplitude: -19.2 },\n { angle: 152.1, amplitude: -19.6 },\n { angle: 152.3, amplitude: -19.6 },\n { angle: 153.2, amplitude: -19.6 },\n { angle: 153.9, amplitude: -19.6 },\n { angle: 154.9, amplitude: -20 },\n { angle: 155.1, amplitude: -20 },\n { angle: 155.3, amplitude: -20 },\n { angle: 155.8, amplitude: -20 },\n { angle: 156.1, amplitude: -20 },\n { angle: 156.3, amplitude: -20 },\n { angle: 156.8, amplitude: -20.4 },\n { angle: 157.3, amplitude: -20.4 },\n { angle: 157.8, amplitude: -20.4 },\n { angle: 158, amplitude: -20.4 },\n { angle: 158.3, amplitude: -20.4 },\n { angle: 158.8, amplitude: -20.4 },\n { angle: 159, amplitude: -20.4 },\n { angle: 159.8, amplitude: -20.8 },\n { angle: 160, amplitude: -20.8 },\n { angle: 161.1, amplitude: -20.8 },\n { angle: 161.3, amplitude: -20.8 },\n { angle: 162, amplitude: -20.8 },\n { angle: 163.3, amplitude: -21.200000000000003 },\n { angle: 163.7, amplitude: -21.6 },\n { angle: 163.9, amplitude: -21.6 },\n { angle: 164.7, amplitude: -21.6 },\n { angle: 165, amplitude: -21.6 },\n { angle: 165.8, amplitude: -21.6 },\n { angle: 166.1, amplitude: -21.6 },\n { angle: 166.7, amplitude: -22 },\n { angle: 167, amplitude: -22 },\n { angle: 167.3, amplitude: -22 },\n { angle: 167.8, amplitude: -22.400000000000002 },\n { angle: 168.1, amplitude: -22.400000000000002 },\n { angle: 168.4, amplitude: -22.400000000000002 },\n { angle: 169.2, amplitude: -22.400000000000002 },\n { angle: 169.4, amplitude: -22.800000000000004 },\n { angle: 170, amplitude: -22.800000000000004 },\n { angle: 170.3, amplitude: -22.800000000000004 },\n { angle: 170.6, amplitude: -22.800000000000004 },\n { angle: 171.1, amplitude: -22.800000000000004 },\n { angle: 171.3, amplitude: -23.200000000000003 },\n { angle: 171.6, amplitude: -23.200000000000003 },\n { angle: 173.5, amplitude: -23.200000000000003 },\n { angle: 173.7, amplitude: -23.6 },\n { angle: 174.6, amplitude: -23.6 },\n { angle: 175.3, amplitude: -23.6 },\n { angle: 175.9, amplitude: -23.6 },\n { angle: 176.2, amplitude: -23.6 },\n { angle: 176.5, amplitude: -23.6 },\n { angle: 177.1, amplitude: -24 },\n { angle: 177.5, amplitude: -24 },\n { angle: 177.8, amplitude: -24 },\n { angle: 178.5, amplitude: -24 },\n { angle: 178.8, amplitude: -24 },\n { angle: 179.1, amplitude: -24 },\n { angle: 179.8, amplitude: -24 },\n { angle: 180.1, amplitude: -24 },\n { amplitude: -24, angle: 179.9 },\n { amplitude: -24, angle: 180.2 },\n { amplitude: -24, angle: 180.9 },\n { amplitude: -24, angle: 181.2 },\n { amplitude: -24, angle: 181.5 },\n { amplitude: -24, angle: 182.2 },\n { amplitude: -24, angle: 182.5 },\n { amplitude: -24, angle: 182.9 },\n { amplitude: -23.6, angle: 183.5 },\n { amplitude: -23.6, angle: 183.8 },\n { amplitude: -23.6, angle: 184.1 },\n { amplitude: -23.6, angle: 184.7 },\n { amplitude: -23.6, angle: 185.4 },\n { amplitude: -23.6, angle: 186.3 },\n { amplitude: -23.200000000000003, angle: 186.5 },\n { amplitude: -23.200000000000003, angle: 188.4 },\n { amplitude: -23.200000000000003, angle: 188.7 },\n { amplitude: -22.800000000000004, angle: 188.9 },\n { amplitude: -22.800000000000004, angle: 189.4 },\n { amplitude: -22.800000000000004, angle: 189.7 },\n { amplitude: -22.800000000000004, angle: 190 },\n { amplitude: -22.800000000000004, angle: 190.6 },\n { amplitude: -22.400000000000002, angle: 190.8 },\n { amplitude: -22.400000000000002, angle: 191.6 },\n { amplitude: -22.400000000000002, angle: 191.9 },\n { amplitude: -22.400000000000002, angle: 192.2 },\n { amplitude: -22, angle: 192.7 },\n { amplitude: -22, angle: 193 },\n { amplitude: -22, angle: 193.3 },\n { amplitude: -21.6, angle: 193.9 },\n { amplitude: -21.6, angle: 194.2 },\n { amplitude: -21.6, angle: 195 },\n { amplitude: -21.6, angle: 195.3 },\n { amplitude: -21.6, angle: 196.1 },\n { amplitude: -21.6, angle: 196.3 },\n { amplitude: -21.200000000000003, angle: 196.7 },\n { amplitude: -20.8, angle: 198 },\n { amplitude: -20.8, angle: 198.7 },\n { amplitude: -20.8, angle: 198.9 },\n { amplitude: -20.8, angle: 200 },\n { amplitude: -20.8, angle: 200.2 },\n { amplitude: -20.4, angle: 201 },\n { amplitude: -20.4, angle: 201.2 },\n { amplitude: -20.4, angle: 201.7 },\n { amplitude: -20.4, angle: 202 },\n { amplitude: -20.4, angle: 202.2 },\n { amplitude: -20.4, angle: 202.7 },\n { amplitude: -20.4, angle: 203.2 },\n { amplitude: -20, angle: 203.7 },\n { amplitude: -20, angle: 203.9 },\n { amplitude: -20, angle: 204.2 },\n { amplitude: -20, angle: 204.7 },\n { amplitude: -20, angle: 204.9 },\n { amplitude: -20, angle: 205.1 },\n { amplitude: -19.6, angle: 206.1 },\n { amplitude: -19.6, angle: 206.8 },\n { amplitude: -19.6, angle: 207.7 },\n { amplitude: -19.6, angle: 207.9 },\n { amplitude: -19.2, angle: 208.4 },\n { amplitude: -19.2, angle: 208.6 },\n { amplitude: -19.2, angle: 209.3 },\n { amplitude: -19.2, angle: 209.5 },\n { amplitude: -18.799999999999997, angle: 210.2 },\n { amplitude: -18.799999999999997, angle: 210.5 },\n { amplitude: -18.799999999999997, angle: 211.1 },\n { amplitude: -18.799999999999997, angle: 212.1 },\n { amplitude: -18.799999999999997, angle: 212.3 },\n { amplitude: -18.799999999999997, angle: 213.4 },\n { amplitude: -18.4, angle: 214.2 },\n { amplitude: -18.4, angle: 214.9 },\n { amplitude: -18.4, angle: 215.1 },\n { amplitude: -18, angle: 215.3 },\n { amplitude: -18, angle: 215.6 },\n { amplitude: -18, angle: 215.8 },\n { amplitude: -18, angle: 216 },\n { amplitude: -18, angle: 216.6 },\n { amplitude: -18, angle: 216.9 },\n { amplitude: -17.599999999999998, angle: 217.5 },\n { amplitude: -17.599999999999998, angle: 217.7 },\n { amplitude: -17.599999999999998, angle: 217.8 },\n { amplitude: -17.599999999999998, angle: 218.2 },\n { amplitude: -17.599999999999998, angle: 218.4 },\n { amplitude: -17.599999999999998, angle: 218.6 },\n { amplitude: -17.200000000000003, angle: 218.9 },\n { amplitude: -17.200000000000003, angle: 219.1 },\n { amplitude: -17.200000000000003, angle: 220 },\n { amplitude: -17.200000000000003, angle: 220.1 },\n { amplitude: -17.200000000000003, angle: 220.3 },\n { amplitude: -16.8, angle: 220.7 },\n { amplitude: -17.200000000000003, angle: 221.1 },\n { amplitude: -17.200000000000003, angle: 221.3 },\n { amplitude: -16.8, angle: 221.8 },\n { amplitude: -16.8, angle: 222 },\n { amplitude: -16.8, angle: 222.3 },\n { amplitude: -16.400000000000002, angle: 223.3 },\n { amplitude: -16.400000000000002, angle: 223.6 },\n { amplitude: -16.400000000000002, angle: 223.9 },\n { amplitude: -16, angle: 224.9 },\n { amplitude: -16, angle: 225 },\n { amplitude: -15.600000000000001, angle: 225.8 },\n { amplitude: -15.600000000000001, angle: 226.1 },\n { amplitude: -15.600000000000001, angle: 227.5 },\n { amplitude: -15.2, angle: 227.9 },\n { amplitude: -15.2, angle: 228.5 },\n { amplitude: -14.8, angle: 228.6 },\n { amplitude: -15.2, angle: 229.1 },\n { amplitude: -14.8, angle: 229.5 },\n { amplitude: -14.8, angle: 229.6 },\n { amplitude: -14.399999999999999, angle: 230 },\n { amplitude: -14.399999999999999, angle: 230.2 },\n { amplitude: -14.399999999999999, angle: 230.9 },\n { amplitude: -14, angle: 231.9 },\n { amplitude: -14, angle: 232.1 },\n { amplitude: -13.599999999999998, angle: 232.6 },\n { amplitude: -13.599999999999998, angle: 232.9 },\n { amplitude: -13.599999999999998, angle: 233 },\n { amplitude: -13.599999999999998, angle: 233.2 },\n { amplitude: -13.599999999999998, angle: 233.5 },\n { amplitude: -13.2, angle: 233.9 },\n { amplitude: -13.2, angle: 234 },\n { amplitude: -12.799999999999997, angle: 234.3 },\n { amplitude: -12.799999999999997, angle: 235.1 },\n { amplitude: -12.799999999999997, angle: 235.5 },\n { amplitude: -12.000000000000002, angle: 236.3 },\n { amplitude: -12.000000000000002, angle: 236.7 },\n { amplitude: -12.000000000000002, angle: 237.2 },\n { amplitude: -11.600000000000001, angle: 237.7 },\n { amplitude: -11.600000000000001, angle: 237.9 },\n { amplitude: -11.600000000000001, angle: 238.1 },\n { amplitude: -11.600000000000001, angle: 238.2 },\n { amplitude: -11.600000000000001, angle: 238.6 },\n { amplitude: -11.200000000000001, angle: 239.1 },\n { amplitude: -11.200000000000001, angle: 239.3 },\n { amplitude: -11.200000000000001, angle: 239.5 },\n { amplitude: -11.200000000000001, angle: 240.2 },\n { amplitude: -10.8, angle: 240.4 },\n { amplitude: -10.8, angle: 240.6 },\n { amplitude: -10.8, angle: 241 },\n { amplitude: -10.8, angle: 241.2 },\n { amplitude: -10.8, angle: 241.6 },\n { amplitude: -10.8, angle: 241.7 },\n { amplitude: -10.8, angle: 242 },\n { amplitude: -10.4, angle: 242.2 },\n { amplitude: -10.4, angle: 242.5 },\n { amplitude: -10, angle: 242.7 },\n { amplitude: -10.4, angle: 242.9 },\n { amplitude: -10, angle: 243.6 },\n { amplitude: -10, angle: 243.7 },\n { amplitude: -10, angle: 244.2 },\n { amplitude: -10, angle: 244.6 },\n { amplitude: -9.6, angle: 244.7 },\n { amplitude: -9.6, angle: 245 },\n { amplitude: -9.6, angle: 245.1 },\n { amplitude: -9.6, angle: 245.6 },\n { amplitude: -9.6, angle: 245.8 },\n { amplitude: -9.2, angle: 246 },\n { amplitude: -9.6, angle: 246.3 },\n { amplitude: -9.2, angle: 246.5 },\n { amplitude: -9.2, angle: 247.3 },\n { amplitude: -9.2, angle: 247.4 },\n { amplitude: -9.2, angle: 247.6 },\n { amplitude: -8.799999999999999, angle: 247.8 },\n { amplitude: -8.799999999999999, angle: 248.3 },\n { amplitude: -8.799999999999999, angle: 248.5 },\n { amplitude: -8.799999999999999, angle: 249 },\n { amplitude: -8.799999999999999, angle: 249.1 },\n { amplitude: -8.799999999999999, angle: 249.4 },\n { amplitude: -8.799999999999999, angle: 249.9 },\n { amplitude: -8.799999999999999, angle: 250 },\n { amplitude: -8.799999999999999, angle: 250.2 },\n { amplitude: -8.799999999999999, angle: 250.5 },\n { amplitude: -8.399999999999999, angle: 250.8 },\n { amplitude: -8.399999999999999, angle: 251 },\n { amplitude: -8.399999999999999, angle: 251.4 },\n { amplitude: -8.399999999999999, angle: 251.6 },\n { amplitude: -8.399999999999999, angle: 251.9 },\n { amplitude: -8.399999999999999, angle: 252.4 },\n { amplitude: -7.999999999999998, angle: 252.5 },\n { amplitude: -7.999999999999998, angle: 252.7 },\n { amplitude: -7.999999999999998, angle: 253.2 },\n { amplitude: -7.999999999999998, angle: 253.3 },\n { amplitude: -7.599999999999998, angle: 253.5 },\n { amplitude: -7.599999999999998, angle: 254 },\n { amplitude: -7.599999999999998, angle: 254.3 },\n { amplitude: -7.599999999999998, angle: 254.7 },\n { amplitude: -7.599999999999998, angle: 254.9 },\n { amplitude: -7.200000000000002, angle: 255.1 },\n { amplitude: -7.200000000000002, angle: 255.4 },\n { amplitude: -7.200000000000002, angle: 255.6 },\n { amplitude: -7.200000000000002, angle: 255.9 },\n { amplitude: -7.200000000000002, angle: 256.4 },\n { amplitude: -7.200000000000002, angle: 256.5 },\n { amplitude: -7.200000000000002, angle: 256.9 },\n { amplitude: -6.800000000000002, angle: 257 },\n { amplitude: -6.800000000000002, angle: 257.6 },\n { amplitude: -6.800000000000002, angle: 257.8 },\n { amplitude: -6.400000000000001, angle: 258 },\n { amplitude: -6.800000000000002, angle: 258.3 },\n { amplitude: -6.400000000000001, angle: 258.7 },\n { amplitude: -6.400000000000001, angle: 259 },\n { amplitude: -6.400000000000001, angle: 259.3 },\n { amplitude: -6.400000000000001, angle: 259.4 },\n { amplitude: -6.400000000000001, angle: 259.7 },\n { amplitude: -6.400000000000001, angle: 260 },\n { amplitude: -6.400000000000001, angle: 260.7 },\n { amplitude: -6.400000000000001, angle: 261 },\n { amplitude: -6.400000000000001, angle: 261.1 },\n { amplitude: -6.400000000000001, angle: 261.3 },\n { amplitude: -6.400000000000001, angle: 261.7 },\n { amplitude: -6.400000000000001, angle: 261.8 },\n { amplitude: -6.000000000000001, angle: 262 },\n { amplitude: -6.000000000000001, angle: 262.3 },\n { amplitude: -6.000000000000001, angle: 262.6 },\n { amplitude: -6.000000000000001, angle: 262.9 },\n { amplitude: -6.000000000000001, angle: 263.3 },\n { amplitude: -6.000000000000001, angle: 263.8 },\n { amplitude: -6.000000000000001, angle: 264.2 },\n { amplitude: -6.000000000000001, angle: 264.5 },\n { amplitude: -5.6000000000000005, angle: 265 },\n { amplitude: -5.6000000000000005, angle: 265.2 },\n { amplitude: -5.6000000000000005, angle: 265.7 },\n { amplitude: -5.6000000000000005, angle: 265.8 },\n { amplitude: -5.6000000000000005, angle: 266.1 },\n { amplitude: -5.6000000000000005, angle: 266.3 },\n { amplitude: -5.6000000000000005, angle: 266.5 },\n { amplitude: -5.2, angle: 266.8 },\n { amplitude: -5.2, angle: 266.9 },\n { amplitude: -5.2, angle: 267.1 },\n { amplitude: -5.2, angle: 267.4 },\n { amplitude: -5.2, angle: 267.7 },\n { amplitude: -5.2, angle: 268 },\n { amplitude: -4.8, angle: 269.2 },\n { amplitude: -4.8, angle: 269.5 },\n { amplitude: -4.8, angle: 269.8 },\n { amplitude: -4.8, angle: 270 },\n { amplitude: -4.8, angle: 270.1 },\n { amplitude: -4.8, angle: 270.4 },\n { amplitude: -4.8, angle: 270.7 },\n { amplitude: -4.8, angle: 271.2 },\n { amplitude: -4.8, angle: 271.3 },\n { amplitude: -4.8, angle: 271.6 },\n { amplitude: -4.8, angle: 271.8 },\n { amplitude: -4.8, angle: 271.9 },\n { amplitude: -4.8, angle: 272.4 },\n { amplitude: -4.8, angle: 272.8 },\n { amplitude: -4.8, angle: 273 },\n { amplitude: -4.3999999999999995, angle: 273.4 },\n { amplitude: -4.3999999999999995, angle: 273.5 },\n { amplitude: -4.3999999999999995, angle: 274 },\n { amplitude: -4.3999999999999995, angle: 274.1 },\n { amplitude: -4.3999999999999995, angle: 274.6 },\n { amplitude: -4.3999999999999995, angle: 274.7 },\n { amplitude: -4.3999999999999995, angle: 274.9 },\n { amplitude: -4.3999999999999995, angle: 275.2 },\n { amplitude: -4.3999999999999995, angle: 275.3 },\n { amplitude: -4.3999999999999995, angle: 275.7 },\n { amplitude: -3.999999999999999, angle: 275.9 },\n { amplitude: -3.999999999999999, angle: 276.3 },\n { amplitude: -3.999999999999999, angle: 276.5 },\n { amplitude: -3.999999999999999, angle: 277.2 },\n { amplitude: -3.999999999999999, angle: 277.5 },\n { amplitude: -3.999999999999999, angle: 278.1 },\n { amplitude: -3.999999999999999, angle: 278.2 },\n { amplitude: -3.999999999999999, angle: 278.8 },\n { amplitude: -3.999999999999999, angle: 278.9 },\n { amplitude: -3.999999999999999, angle: 279.2 },\n { amplitude: -3.999999999999999, angle: 279.4 },\n { amplitude: -3.999999999999999, angle: 279.5 },\n { amplitude: -3.999999999999999, angle: 279.8 },\n { amplitude: -3.999999999999999, angle: 280 },\n { amplitude: -3.999999999999999, angle: 280.1 },\n { amplitude: -3.5999999999999988, angle: 280.4 },\n { amplitude: -3.5999999999999988, angle: 280.5 },\n { amplitude: -3.5999999999999988, angle: 280.7 },\n { amplitude: -3.5999999999999988, angle: 281 },\n { amplitude: -3.999999999999999, angle: 281.2 },\n { amplitude: -3.999999999999999, angle: 281.3 },\n { amplitude: -3.999999999999999, angle: 281.6 },\n { amplitude: -3.999999999999999, angle: 281.8 },\n { amplitude: -3.999999999999999, angle: 282.2 },\n { amplitude: -3.999999999999999, angle: 282.4 },\n { amplitude: -3.999999999999999, angle: 282.5 },\n { amplitude: -3.999999999999999, angle: 282.9 },\n { amplitude: -3.999999999999999, angle: 283.2 },\n { amplitude: -3.999999999999999, angle: 283.6 },\n { amplitude: -3.999999999999999, angle: 283.7 },\n { amplitude: -3.999999999999999, angle: 284 },\n { amplitude: -3.999999999999999, angle: 284.3 },\n { amplitude: -3.999999999999999, angle: 284.6 },\n { amplitude: -3.999999999999999, angle: 284.7 },\n { amplitude: -3.999999999999999, angle: 284.9 },\n { amplitude: -3.5999999999999988, angle: 285.3 },\n { amplitude: -3.5999999999999988, angle: 285.4 },\n { amplitude: -3.5999999999999988, angle: 285.9 },\n { amplitude: -3.5999999999999988, angle: 286.3 },\n { amplitude: -3.5999999999999988, angle: 286.6 },\n { amplitude: -3.5999999999999988, angle: 286.9 },\n { amplitude: -3.5999999999999988, angle: 287 },\n { amplitude: -3.5999999999999988, angle: 287.2 },\n { amplitude: -3.5999999999999988, angle: 287.4 },\n { amplitude: -3.5999999999999988, angle: 287.6 },\n { amplitude: -3.1999999999999984, angle: 287.7 },\n { amplitude: -3.5999999999999988, angle: 288.2 },\n { amplitude: -3.1999999999999984, angle: 288.6 },\n { amplitude: -3.5999999999999988, angle: 288.9 },\n { amplitude: -3.5999999999999988, angle: 289.4 },\n { amplitude: -3.1999999999999984, angle: 289.9 },\n { amplitude: -3.1999999999999984, angle: 290.1 },\n { amplitude: -3.1999999999999984, angle: 290.3 },\n { amplitude: -3.1999999999999984, angle: 290.4 },\n { amplitude: -3.1999999999999984, angle: 291.1 },\n { amplitude: -3.1999999999999984, angle: 291.3 },\n { amplitude: -3.1999999999999984, angle: 291.6 },\n { amplitude: -3.1999999999999984, angle: 291.8 },\n { amplitude: -3.1999999999999984, angle: 292.2 },\n { amplitude: -3.1999999999999984, angle: 292.3 },\n { amplitude: -3.1999999999999984, angle: 293 },\n { amplitude: -3.1999999999999984, angle: 293.4 },\n { amplitude: -3.1999999999999984, angle: 293.7 },\n { amplitude: -2.799999999999998, angle: 294.6 },\n { amplitude: -3.1999999999999984, angle: 294.7 },\n { amplitude: -2.799999999999998, angle: 294.9 },\n { amplitude: -2.799999999999998, angle: 295.2 },\n { amplitude: -2.799999999999998, angle: 295.7 },\n { amplitude: -2.799999999999998, angle: 296 },\n { amplitude: -2.799999999999998, angle: 296.4 },\n { amplitude: -2.799999999999998, angle: 296.5 },\n { amplitude: -2.799999999999998, angle: 296.6 },\n { amplitude: -2.799999999999998, angle: 296.9 },\n { amplitude: -2.799999999999998, angle: 297.3 },\n { amplitude: -2.799999999999998, angle: 297.7 },\n { amplitude: -2.799999999999998, angle: 297.9 },\n { amplitude: -2.799999999999998, angle: 298.2 },\n { amplitude: -2.799999999999998, angle: 298.9 },\n { amplitude: -2.799999999999998, angle: 299.1 },\n { amplitude: -2.799999999999998, angle: 300.3 },\n { amplitude: -2.799999999999998, angle: 300.5 },\n { amplitude: -3.1999999999999984, angle: 301.2 },\n { amplitude: -3.1999999999999984, angle: 301.4 },\n { amplitude: -3.1999999999999984, angle: 301.8 },\n { amplitude: -3.1999999999999984, angle: 301.9 },\n { amplitude: -3.1999999999999984, angle: 302.1 },\n { amplitude: -2.799999999999998, angle: 302.3 },\n { amplitude: -3.1999999999999984, angle: 302.5 },\n { amplitude: -3.1999999999999984, angle: 302.8 },\n { amplitude: -3.1999999999999984, angle: 303 },\n { amplitude: -3.1999999999999984, angle: 303.2 },\n { amplitude: -2.799999999999998, angle: 303.6 },\n { amplitude: -2.799999999999998, angle: 303.7 },\n { amplitude: -3.1999999999999984, angle: 304 },\n { amplitude: -2.799999999999998, angle: 304.4 },\n { amplitude: -2.799999999999998, angle: 304.7 },\n { amplitude: -2.799999999999998, angle: 304.9 },\n { amplitude: -3.1999999999999984, angle: 305.1 },\n { amplitude: -2.799999999999998, angle: 305.2 },\n { amplitude: -2.799999999999998, angle: 305.9 },\n { amplitude: -2.799999999999998, angle: 306.5 },\n { amplitude: -2.799999999999998, angle: 306.7 },\n { amplitude: -2.799999999999998, angle: 307 },\n { amplitude: -2.799999999999998, angle: 307.2 },\n { amplitude: -2.799999999999998, angle: 307.7 },\n { amplitude: -2.799999999999998, angle: 307.9 },\n { amplitude: -2.400000000000002, angle: 308.3 },\n { amplitude: -2.799999999999998, angle: 308.5 },\n { amplitude: -2.799999999999998, angle: 308.6 },\n { amplitude: -2.400000000000002, angle: 309.1 },\n { amplitude: -2.400000000000002, angle: 309.8 },\n { amplitude: -2.400000000000002, angle: 310.4 },\n { amplitude: -2.400000000000002, angle: 310.5 },\n { amplitude: -2.400000000000002, angle: 310.8 },\n { amplitude: -2.400000000000002, angle: 311.7 },\n { amplitude: -2.0000000000000018, angle: 312.2 },\n { amplitude: -2.0000000000000018, angle: 312.3 },\n { amplitude: -2.0000000000000018, angle: 313.1 },\n { amplitude: -2.0000000000000018, angle: 313.5 },\n { amplitude: -2.0000000000000018, angle: 314 },\n { amplitude: -1.6000000000000014, angle: 314.5 },\n { amplitude: -1.6000000000000014, angle: 314.6 },\n { amplitude: -1.6000000000000014, angle: 314.8 },\n { amplitude: -1.6000000000000014, angle: 315 },\n { amplitude: -1.6000000000000014, angle: 315.2 },\n { amplitude: -1.6000000000000014, angle: 315.4 },\n { amplitude: -1.6000000000000014, angle: 316 },\n { amplitude: -1.6000000000000014, angle: 317.6 },\n { amplitude: -1.6000000000000014, angle: 317.7 },\n { amplitude: -1.6000000000000014, angle: 318.5 },\n { amplitude: -1.6000000000000014, angle: 318.7 },\n { amplitude: -2.0000000000000018, angle: 318.9 },\n { amplitude: -1.6000000000000014, angle: 319 },\n { amplitude: -1.6000000000000014, angle: 319.4 },\n { amplitude: -1.6000000000000014, angle: 319.7 },\n { amplitude: -1.6000000000000014, angle: 320.1 },\n { amplitude: -1.6000000000000014, angle: 320.6 },\n { amplitude: -1.6000000000000014, angle: 320.8 },\n { amplitude: -1.6000000000000014, angle: 320.9 },\n { amplitude: -1.6000000000000014, angle: 321 },\n { amplitude: -1.6000000000000014, angle: 321.3 },\n { amplitude: -1.6000000000000014, angle: 321.7 },\n { amplitude: -1.200000000000001, angle: 322.5 },\n { amplitude: -1.200000000000001, angle: 322.8 },\n { amplitude: -1.200000000000001, angle: 323.6 },\n { amplitude: -1.200000000000001, angle: 323.7 },\n { amplitude: -0.8000000000000007, angle: 324.4 },\n { amplitude: -0.8000000000000007, angle: 324.6 },\n { amplitude: -0.8000000000000007, angle: 325.1 },\n { amplitude: -0.8000000000000007, angle: 325.6 },\n { amplitude: -0.8000000000000007, angle: 326.2 },\n { amplitude: -0.8000000000000007, angle: 326.5 },\n { amplitude: -0.8000000000000007, angle: 326.6 },\n { amplitude: -0.8000000000000007, angle: 327.2 },\n { amplitude: -0.8000000000000007, angle: 327.3 },\n { amplitude: -0.8000000000000007, angle: 328.1 },\n { amplitude: -0.8000000000000007, angle: 328.5 },\n { amplitude: -1.200000000000001, angle: 329.3 },\n { amplitude: -1.200000000000001, angle: 329.6 },\n { amplitude: -1.200000000000001, angle: 330.1 },\n { amplitude: -0.8000000000000007, angle: 330.8 },\n { amplitude: -1.200000000000001, angle: 331.3 },\n { amplitude: -1.200000000000001, angle: 331.7 },\n { amplitude: -0.8000000000000007, angle: 332.1 },\n { amplitude: -0.8000000000000007, angle: 332.5 },\n { amplitude: -0.8000000000000007, angle: 332.7 },\n { amplitude: -0.8000000000000007, angle: 333.1 },\n { amplitude: -0.8000000000000007, angle: 333.2 },\n { amplitude: -0.8000000000000007, angle: 333.6 },\n { amplitude: -0.8000000000000007, angle: 333.8 },\n { amplitude: -1.200000000000001, angle: 333.9 },\n { amplitude: -0.8000000000000007, angle: 334.4 },\n { amplitude: -1.200000000000001, angle: 335.1 },\n { amplitude: -1.200000000000001, angle: 335.4 },\n { amplitude: -0.8000000000000007, angle: 335.8 },\n { amplitude: -0.8000000000000007, angle: 336.1 },\n { amplitude: -0.8000000000000007, angle: 336.3 },\n { amplitude: -1.200000000000001, angle: 336.5 },\n { amplitude: -1.200000000000001, angle: 336.7 },\n { amplitude: -0.8000000000000007, angle: 337 },\n { amplitude: -0.8000000000000007, angle: 337.2 },\n { amplitude: -0.8000000000000007, angle: 337.3 },\n { amplitude: -0.8000000000000007, angle: 337.5 },\n { amplitude: -1.200000000000001, angle: 337.8 },\n { amplitude: -0.8000000000000007, angle: 338.1 },\n { amplitude: -1.200000000000001, angle: 338.4 },\n { amplitude: -1.200000000000001, angle: 338.9 },\n { amplitude: -1.200000000000001, angle: 340.8 },\n { amplitude: -1.200000000000001, angle: 340.9 },\n { amplitude: -1.200000000000001, angle: 341.3 },\n { amplitude: -1.200000000000001, angle: 341.4 },\n { amplitude: -1.200000000000001, angle: 341.7 },\n { amplitude: -1.200000000000001, angle: 342.3 },\n { amplitude: -1.200000000000001, angle: 342.4 },\n { amplitude: -1.200000000000001, angle: 342.8 },\n { amplitude: -1.200000000000001, angle: 342.9 },\n { amplitude: -1.200000000000001, angle: 343 },\n { amplitude: -1.6000000000000014, angle: 343.3 },\n { amplitude: -1.6000000000000014, angle: 343.4 },\n { amplitude: -1.200000000000001, angle: 343.7 },\n { amplitude: -1.200000000000001, angle: 343.9 },\n { amplitude: -1.200000000000001, angle: 344.2 },\n { amplitude: -1.6000000000000014, angle: 344.6 },\n { amplitude: -1.6000000000000014, angle: 344.7 },\n { amplitude: -1.6000000000000014, angle: 345 },\n { amplitude: -1.6000000000000014, angle: 345.3 },\n { amplitude: -1.6000000000000014, angle: 345.8 },\n { amplitude: -1.6000000000000014, angle: 346.1 },\n { amplitude: -1.6000000000000014, angle: 346.2 },\n { amplitude: -1.6000000000000014, angle: 346.4 },\n { amplitude: -1.6000000000000014, angle: 346.6 },\n { amplitude: -1.6000000000000014, angle: 346.8 },\n { amplitude: -1.6000000000000014, angle: 347.4 },\n { amplitude: -1.6000000000000014, angle: 347.5 },\n { amplitude: -1.6000000000000014, angle: 347.8 },\n { amplitude: -1.6000000000000014, angle: 348 },\n { amplitude: -1.6000000000000014, angle: 348.4 },\n { amplitude: -1.6000000000000014, angle: 348.6 },\n { amplitude: -1.6000000000000014, angle: 349 },\n { amplitude: -1.6000000000000014, angle: 349.1 },\n { amplitude: -1.6000000000000014, angle: 349.2 },\n { amplitude: -1.6000000000000014, angle: 349.5 },\n { amplitude: -1.6000000000000014, angle: 349.6 },\n { amplitude: -1.6000000000000014, angle: 349.8 },\n { amplitude: -1.6000000000000014, angle: 350.1 },\n { amplitude: -1.6000000000000014, angle: 350.2 },\n { amplitude: -1.6000000000000014, angle: 350.4 },\n { amplitude: -1.6000000000000014, angle: 350.9 },\n { amplitude: -1.6000000000000014, angle: 351.2 },\n { amplitude: -1.200000000000001, angle: 351.8 },\n { amplitude: -1.200000000000001, angle: 351.9 },\n { amplitude: -1.200000000000001, angle: 352.3 },\n { amplitude: -1.200000000000001, angle: 352.4 },\n { amplitude: -1.200000000000001, angle: 352.6 },\n { amplitude: -1.200000000000001, angle: 353 },\n { amplitude: -1.200000000000001, angle: 353.1 },\n { amplitude: -1.200000000000001, angle: 353.4 },\n { amplitude: -1.200000000000001, angle: 353.6 },\n { amplitude: -1.200000000000001, angle: 353.7 },\n { amplitude: -1.200000000000001, angle: 354.1 },\n { amplitude: -1.200000000000001, angle: 354.3 },\n { amplitude: -1.200000000000001, angle: 354.5 },\n { amplitude: -1.200000000000001, angle: 354.7 },\n { amplitude: -1.200000000000001, angle: 355.1 },\n { amplitude: -1.200000000000001, angle: 355.2 },\n { amplitude: -1.200000000000001, angle: 355.4 },\n { amplitude: -0.8000000000000007, angle: 355.7 },\n { amplitude: -0.8000000000000007, angle: 355.8 },\n { amplitude: -0.8000000000000007, angle: 355.9 },\n { amplitude: -0.8000000000000007, angle: 356.2 },\n { amplitude: -0.8000000000000007, angle: 356.7 },\n { amplitude: -0.8000000000000007, angle: 356.9 },\n { amplitude: -0.8000000000000007, angle: 357.3 },\n { amplitude: -0.40000000000000036, angle: 357.6 },\n { amplitude: -0.40000000000000036, angle: 358 },\n { amplitude: -0.40000000000000036, angle: 358.1 },\n { amplitude: -0.40000000000000036, angle: 358.4 },\n { amplitude: -0.40000000000000036, angle: 358.5 },\n { amplitude: -0.40000000000000036, angle: 358.6 },\n { amplitude: -0.40000000000000036, angle: 358.7 },\n { amplitude: -0.40000000000000036, angle: 359.2 },\n { amplitude: -0.40000000000000036, angle: 359.5 },\n { amplitude: -0.40000000000000036, angle: 359.7 },\n { amplitude: -0.40000000000000036, angle: 360 },\n ],\n },\n {\n name: '12.5KHz',\n data: [\n { angle: 0, amplitude: -0.40000000000000036 },\n { angle: 0.3, amplitude: -0.40000000000000036 },\n { angle: 0.5, amplitude: -0.40000000000000036 },\n { angle: 0.9, amplitude: -0.40000000000000036 },\n { angle: 1.5, amplitude: -0.40000000000000036 },\n { angle: 2.2, amplitude: -0.40000000000000036 },\n { angle: 2.6, amplitude: -0.40000000000000036 },\n { angle: 3.1, amplitude: -0.40000000000000036 },\n { angle: 3.6, amplitude: -0.8000000000000007 },\n { angle: 4.2, amplitude: -0.40000000000000036 },\n { angle: 4.6, amplitude: -0.8000000000000007 },\n { angle: 5.1, amplitude: -0.8000000000000007 },\n { angle: 5.4, amplitude: -0.8000000000000007 },\n { angle: 6, amplitude: -0.8000000000000007 },\n { angle: 7.1, amplitude: -1.200000000000001 },\n { angle: 7.5, amplitude: -0.8000000000000007 },\n { angle: 7.6, amplitude: -1.200000000000001 },\n { angle: 7.9, amplitude: -1.200000000000001 },\n { angle: 8, amplitude: -1.200000000000001 },\n { angle: 8.2, amplitude: -1.200000000000001 },\n { angle: 8.6, amplitude: -0.8000000000000007 },\n { angle: 9, amplitude: -0.8000000000000007 },\n { angle: 9.1, amplitude: -0.8000000000000007 },\n { angle: 9.2, amplitude: -0.8000000000000007 },\n { angle: 9.5, amplitude: -0.8000000000000007 },\n { angle: 9.8, amplitude: -0.8000000000000007 },\n { angle: 10.2, amplitude: -0.8000000000000007 },\n { angle: 10.3, amplitude: -0.8000000000000007 },\n { angle: 10.8, amplitude: -0.8000000000000007 },\n { angle: 11.2, amplitude: -0.8000000000000007 },\n { angle: 11.7, amplitude: -0.8000000000000007 },\n { angle: 11.8, amplitude: -0.8000000000000007 },\n { angle: 12, amplitude: -0.8000000000000007 },\n { angle: 12.4, amplitude: -0.8000000000000007 },\n { angle: 12.9, amplitude: -0.8000000000000007 },\n { angle: 13.4, amplitude: -0.8000000000000007 },\n { angle: 13.5, amplitude: -0.8000000000000007 },\n { angle: 14.2, amplitude: -0.8000000000000007 },\n { angle: 14.5, amplitude: -0.8000000000000007 },\n { angle: 15.4, amplitude: -1.200000000000001 },\n { angle: 15.8, amplitude: -1.200000000000001 },\n { angle: 15.9, amplitude: -1.200000000000001 },\n { angle: 16.4, amplitude: -1.200000000000001 },\n { angle: 16.5, amplitude: -1.200000000000001 },\n { angle: 17, amplitude: -1.200000000000001 },\n { angle: 17.1, amplitude: -1.200000000000001 },\n { angle: 17.6, amplitude: -1.200000000000001 },\n { angle: 17.8, amplitude: -1.200000000000001 },\n { angle: 18.3, amplitude: -1.6000000000000014 },\n { angle: 18.4, amplitude: -1.6000000000000014 },\n { angle: 19.4, amplitude: -1.6000000000000014 },\n { angle: 20.2, amplitude: -1.6000000000000014 },\n { angle: 20.6, amplitude: -1.6000000000000014 },\n { angle: 20.8, amplitude: -1.6000000000000014 },\n { angle: 21.1, amplitude: -1.6000000000000014 },\n { angle: 21.3, amplitude: -1.6000000000000014 },\n { angle: 21.4, amplitude: -1.6000000000000014 },\n { angle: 21.7, amplitude: -1.6000000000000014 },\n { angle: 21.9, amplitude: -1.6000000000000014 },\n { angle: 22.4, amplitude: -1.6000000000000014 },\n { angle: 22.9, amplitude: -1.6000000000000014 },\n { angle: 23, amplitude: -1.6000000000000014 },\n { angle: 23.1, amplitude: -1.6000000000000014 },\n { angle: 23.3, amplitude: -1.6000000000000014 },\n { angle: 23.9, amplitude: -1.6000000000000014 },\n { angle: 24.3, amplitude: -1.6000000000000014 },\n { angle: 24.5, amplitude: -1.6000000000000014 },\n { angle: 24.8, amplitude: -1.6000000000000014 },\n { angle: 25.4, amplitude: -1.6000000000000014 },\n { angle: 25.7, amplitude: -1.6000000000000014 },\n { angle: 26.2, amplitude: -2.0000000000000018 },\n { angle: 26.4, amplitude: -2.0000000000000018 },\n { angle: 26.7, amplitude: -1.6000000000000014 },\n { angle: 26.9, amplitude: -2.0000000000000018 },\n { angle: 27, amplitude: -2.0000000000000018 },\n { angle: 27.5, amplitude: -2.0000000000000018 },\n { angle: 27.7, amplitude: -2.0000000000000018 },\n { angle: 28, amplitude: -2.0000000000000018 },\n { angle: 28.3, amplitude: -2.0000000000000018 },\n { angle: 28.4, amplitude: -2.0000000000000018 },\n { angle: 28.8, amplitude: -2.0000000000000018 },\n { angle: 29.4, amplitude: -2.0000000000000018 },\n { angle: 29.7, amplitude: -2.0000000000000018 },\n { angle: 30.1, amplitude: -2.0000000000000018 },\n { angle: 30.3, amplitude: -2.0000000000000018 },\n { angle: 30.8, amplitude: -2.0000000000000018 },\n { angle: 31.2, amplitude: -2.400000000000002 },\n { angle: 31.4, amplitude: -2.0000000000000018 },\n { angle: 31.7, amplitude: -2.400000000000002 },\n { angle: 32.2, amplitude: -2.400000000000002 },\n { angle: 32.5, amplitude: -2.400000000000002 },\n { angle: 33, amplitude: -2.400000000000002 },\n { angle: 33.7, amplitude: -2.400000000000002 },\n { angle: 33.9, amplitude: -2.799999999999998 },\n { angle: 34, amplitude: -2.400000000000002 },\n { angle: 34.1, amplitude: -2.799999999999998 },\n { angle: 34.4, amplitude: -2.799999999999998 },\n { angle: 34.5, amplitude: -2.799999999999998 },\n { angle: 34.8, amplitude: -2.799999999999998 },\n { angle: 35, amplitude: -2.799999999999998 },\n { angle: 35.3, amplitude: -2.799999999999998 },\n { angle: 35.9, amplitude: -3.1999999999999984 },\n { angle: 36.7, amplitude: -3.1999999999999984 },\n { angle: 37.4, amplitude: -3.1999999999999984 },\n { angle: 37.6, amplitude: -3.1999999999999984 },\n { angle: 37.9, amplitude: -3.5999999999999988 },\n { angle: 38.3, amplitude: -3.1999999999999984 },\n { angle: 38.4, amplitude: -3.5999999999999988 },\n { angle: 38.5, amplitude: -3.5999999999999988 },\n { angle: 38.8, amplitude: -3.5999999999999988 },\n { angle: 38.9, amplitude: -3.5999999999999988 },\n { angle: 39.5, amplitude: -3.5999999999999988 },\n { angle: 39.7, amplitude: -3.5999999999999988 },\n { angle: 40, amplitude: -3.5999999999999988 },\n { angle: 40.5, amplitude: -3.5999999999999988 },\n { angle: 40.8, amplitude: -3.5999999999999988 },\n { angle: 41.1, amplitude: -3.5999999999999988 },\n { angle: 41.7, amplitude: -3.5999999999999988 },\n { angle: 42, amplitude: -3.5999999999999988 },\n { angle: 42.2, amplitude: -3.999999999999999 },\n { angle: 42.5, amplitude: -3.999999999999999 },\n { angle: 42.8, amplitude: -3.999999999999999 },\n { angle: 43, amplitude: -3.999999999999999 },\n { angle: 43.3, amplitude: -3.999999999999999 },\n { angle: 43.6, amplitude: -3.999999999999999 },\n { angle: 43.8, amplitude: -3.999999999999999 },\n { angle: 44, amplitude: -3.999999999999999 },\n { angle: 44.5, amplitude: -3.999999999999999 },\n { angle: 44.6, amplitude: -3.999999999999999 },\n { angle: 45.1, amplitude: -3.999999999999999 },\n { angle: 45.4, amplitude: -3.999999999999999 },\n { angle: 45.9, amplitude: -3.999999999999999 },\n { angle: 46.7, amplitude: -3.999999999999999 },\n { angle: 46.9, amplitude: -4.3999999999999995 },\n { angle: 47.5, amplitude: -3.999999999999999 },\n { angle: 47.8, amplitude: -4.3999999999999995 },\n { angle: 47.9, amplitude: -4.3999999999999995 },\n { angle: 48.5, amplitude: -4.3999999999999995 },\n { angle: 49.8, amplitude: -4.3999999999999995 },\n { angle: 49.9, amplitude: -4.3999999999999995 },\n { angle: 50.3, amplitude: -4.8 },\n { angle: 50.9, amplitude: -4.8 },\n { angle: 51.2, amplitude: -4.8 },\n { angle: 51.4, amplitude: -4.8 },\n { angle: 51.7, amplitude: -4.8 },\n { angle: 52.2, amplitude: -4.8 },\n { angle: 52.5, amplitude: -4.8 },\n { angle: 52.6, amplitude: -4.8 },\n { angle: 52.7, amplitude: -4.8 },\n { angle: 53, amplitude: -4.8 },\n { angle: 53.2, amplitude: -4.8 },\n { angle: 53.7, amplitude: -4.8 },\n { angle: 53.9, amplitude: -4.8 },\n { angle: 54.1, amplitude: -4.8 },\n { angle: 54.7, amplitude: -4.8 },\n { angle: 54.8, amplitude: -5.2 },\n { angle: 54.9, amplitude: -4.8 },\n { angle: 55.1, amplitude: -5.2 },\n { angle: 55.2, amplitude: -4.8 },\n { angle: 55.9, amplitude: -5.2 },\n { angle: 56, amplitude: -4.8 },\n { angle: 56.9, amplitude: -4.8 },\n { angle: 57.2, amplitude: -4.8 },\n { angle: 57.8, amplitude: -4.8 },\n { angle: 58.2, amplitude: -4.8 },\n { angle: 59.2, amplitude: -4.8 },\n { angle: 59.5, amplitude: -4.8 },\n { angle: 60.2, amplitude: -5.2 },\n { angle: 60.8, amplitude: -5.2 },\n { angle: 61, amplitude: -5.2 },\n { angle: 61.5, amplitude: -5.2 },\n { angle: 62, amplitude: -5.2 },\n { angle: 62.8, amplitude: -5.2 },\n { angle: 63.3, amplitude: -5.2 },\n { angle: 66.3, amplitude: -6.000000000000001 },\n { angle: 66.5, amplitude: -6.000000000000001 },\n { angle: 67.1, amplitude: -5.6000000000000005 },\n { angle: 67.8, amplitude: -6.000000000000001 },\n { angle: 68.4, amplitude: -6.000000000000001 },\n { angle: 68.6, amplitude: -6.000000000000001 },\n { angle: 69, amplitude: -6.000000000000001 },\n { angle: 69.1, amplitude: -6.000000000000001 },\n { angle: 69.8, amplitude: -6.000000000000001 },\n { angle: 70.3, amplitude: -6.000000000000001 },\n { angle: 70.5, amplitude: -6.000000000000001 },\n { angle: 71, amplitude: -6.000000000000001 },\n { angle: 71.1, amplitude: -6.000000000000001 },\n { angle: 71.4, amplitude: -6.400000000000001 },\n { angle: 71.6, amplitude: -6.400000000000001 },\n { angle: 72, amplitude: -6.400000000000001 },\n { angle: 72.2, amplitude: -6.400000000000001 },\n { angle: 72.7, amplitude: -6.400000000000001 },\n { angle: 73, amplitude: -6.400000000000001 },\n { angle: 73.5, amplitude: -6.400000000000001 },\n { angle: 73.7, amplitude: -6.400000000000001 },\n { angle: 74, amplitude: -6.400000000000001 },\n { angle: 74.1, amplitude: -6.400000000000001 },\n { angle: 74.6, amplitude: -6.400000000000001 },\n { angle: 74.8, amplitude: -6.400000000000001 },\n { angle: 74.9, amplitude: -6.400000000000001 },\n { angle: 75.5, amplitude: -6.400000000000001 },\n { angle: 75.8, amplitude: -6.400000000000001 },\n { angle: 76.1, amplitude: -6.800000000000002 },\n { angle: 76.4, amplitude: -6.800000000000002 },\n { angle: 76.7, amplitude: -6.800000000000002 },\n { angle: 77.4, amplitude: -6.800000000000002 },\n { angle: 77.7, amplitude: -6.800000000000002 },\n { angle: 78, amplitude: -6.800000000000002 },\n { angle: 78.3, amplitude: -6.800000000000002 },\n { angle: 78.6, amplitude: -6.800000000000002 },\n { angle: 79, amplitude: -6.800000000000002 },\n { angle: 79.3, amplitude: -6.800000000000002 },\n { angle: 79.9, amplitude: -7.200000000000002 },\n { angle: 80.5, amplitude: -7.200000000000002 },\n { angle: 81, amplitude: -7.200000000000002 },\n { angle: 82.3, amplitude: -7.200000000000002 },\n { angle: 82.8, amplitude: -7.200000000000002 },\n { angle: 83.4, amplitude: -7.200000000000002 },\n { angle: 83.7, amplitude: -7.200000000000002 },\n { angle: 84.2, amplitude: -7.200000000000002 },\n { angle: 85.5, amplitude: -7.599999999999998 },\n { angle: 85.7, amplitude: -7.599999999999998 },\n { angle: 86.3, amplitude: -7.599999999999998 },\n { angle: 86.8, amplitude: -7.599999999999998 },\n { angle: 86.9, amplitude: -7.599999999999998 },\n { angle: 87.3, amplitude: -7.599999999999998 },\n { angle: 87.4, amplitude: -7.599999999999998 },\n { angle: 87.6, amplitude: -7.599999999999998 },\n { angle: 87.9, amplitude: -7.599999999999998 },\n { angle: 88.1, amplitude: -7.599999999999998 },\n { angle: 88.6, amplitude: -7.599999999999998 },\n { angle: 88.9, amplitude: -7.599999999999998 },\n { angle: 89.4, amplitude: -7.599999999999998 },\n { angle: 90, amplitude: -7.599999999999998 },\n { angle: 91.2, amplitude: -7.999999999999998 },\n { angle: 91.8, amplitude: -7.999999999999998 },\n { angle: 92.2, amplitude: -7.999999999999998 },\n { angle: 92.5, amplitude: -8.399999999999999 },\n { angle: 92.9, amplitude: -8.399999999999999 },\n { angle: 93.2, amplitude: -8.399999999999999 },\n { angle: 93.4, amplitude: -8.399999999999999 },\n { angle: 93.5, amplitude: -8.399999999999999 },\n { angle: 93.9, amplitude: -8.399999999999999 },\n { angle: 94.6, amplitude: -8.399999999999999 },\n { angle: 94.7, amplitude: -8.399999999999999 },\n { angle: 94.9, amplitude: -8.799999999999999 },\n { angle: 95.3, amplitude: -8.799999999999999 },\n { angle: 95.5, amplitude: -8.799999999999999 },\n { angle: 95.6, amplitude: -8.799999999999999 },\n { angle: 96.2, amplitude: -8.799999999999999 },\n { angle: 96.3, amplitude: -8.799999999999999 },\n { angle: 96.9, amplitude: -9.2 },\n { angle: 97.1, amplitude: -9.2 },\n { angle: 97.6, amplitude: -9.2 },\n { angle: 98.1, amplitude: -9.2 },\n { angle: 98.3, amplitude: -9.2 },\n { angle: 98.9, amplitude: -9.2 },\n { angle: 99, amplitude: -9.2 },\n { angle: 99.2, amplitude: -9.6 },\n { angle: 99.6, amplitude: -9.2 },\n { angle: 99.8, amplitude: -9.6 },\n { angle: 100, amplitude: -9.6 },\n { angle: 100.5, amplitude: -9.6 },\n { angle: 101.1, amplitude: -9.6 },\n { angle: 101.2, amplitude: -9.6 },\n { angle: 101.4, amplitude: -9.6 },\n { angle: 102, amplitude: -9.6 },\n { angle: 102.2, amplitude: -10 },\n { angle: 103.5, amplitude: -10 },\n { angle: 103.8, amplitude: -10 },\n { angle: 104.4, amplitude: -10.4 },\n { angle: 104.7, amplitude: -10.4 },\n { angle: 105.1, amplitude: -10.4 },\n { angle: 105.4, amplitude: -10.8 },\n { angle: 105.6, amplitude: -10.8 },\n { angle: 106, amplitude: -10.8 },\n { angle: 106.1, amplitude: -10.8 },\n { angle: 106.4, amplitude: -11.200000000000001 },\n { angle: 106.5, amplitude: -11.200000000000001 },\n { angle: 107.2, amplitude: -11.200000000000001 },\n { angle: 107.3, amplitude: -11.200000000000001 },\n { angle: 107.5, amplitude: -11.200000000000001 },\n { angle: 108, amplitude: -11.200000000000001 },\n { angle: 108.1, amplitude: -11.600000000000001 },\n { angle: 108.3, amplitude: -11.600000000000001 },\n { angle: 108.4, amplitude: -11.600000000000001 },\n { angle: 109, amplitude: -11.600000000000001 },\n { angle: 109.2, amplitude: -11.600000000000001 },\n { angle: 109.3, amplitude: -12.000000000000002 },\n { angle: 109.9, amplitude: -12.000000000000002 },\n { angle: 110.1, amplitude: -11.600000000000001 },\n { angle: 110.2, amplitude: -12.000000000000002 },\n { angle: 110.6, amplitude: -12.000000000000002 },\n { angle: 111.1, amplitude: -12.000000000000002 },\n { angle: 111.6, amplitude: -12.000000000000002 },\n { angle: 111.9, amplitude: -12.400000000000002 },\n { angle: 112.1, amplitude: -12.400000000000002 },\n { angle: 112.8, amplitude: -12.400000000000002 },\n { angle: 113.1, amplitude: -12.799999999999997 },\n { angle: 113.8, amplitude: -12.799999999999997 },\n { angle: 113.9, amplitude: -12.799999999999997 },\n { angle: 114.5, amplitude: -13.2 },\n { angle: 115.2, amplitude: -13.2 },\n { angle: 115.4, amplitude: -13.2 },\n { angle: 115.5, amplitude: -13.2 },\n { angle: 116.2, amplitude: -13.2 },\n { angle: 116.6, amplitude: -13.2 },\n { angle: 116.7, amplitude: -13.599999999999998 },\n { angle: 117.1, amplitude: -13.599999999999998 },\n { angle: 118.9, amplitude: -14 },\n { angle: 119.3, amplitude: -14 },\n { angle: 120.2, amplitude: -14.399999999999999 },\n { angle: 121.3, amplitude: -14.399999999999999 },\n { angle: 122.1, amplitude: -14.8 },\n { angle: 123.4, amplitude: -14.8 },\n { angle: 124.2, amplitude: -15.2 },\n { angle: 124.4, amplitude: -15.2 },\n { angle: 124.7, amplitude: -15.2 },\n { angle: 125.4, amplitude: -15.600000000000001 },\n { angle: 125.9, amplitude: -15.600000000000001 },\n { angle: 126.3, amplitude: -16 },\n { angle: 126.6, amplitude: -16 },\n { angle: 127.3, amplitude: -16 },\n { angle: 127.6, amplitude: -16.400000000000002 },\n { angle: 128.5, amplitude: -16.400000000000002 },\n { angle: 128.6, amplitude: -16.400000000000002 },\n { angle: 128.7, amplitude: -16.400000000000002 },\n { angle: 129.3, amplitude: -16.8 },\n { angle: 129.5, amplitude: -16.8 },\n { angle: 130.6, amplitude: -16.8 },\n { angle: 131, amplitude: -17.200000000000003 },\n { angle: 131.2, amplitude: -17.200000000000003 },\n { angle: 131.7, amplitude: -17.200000000000003 },\n { angle: 132, amplitude: -17.200000000000003 },\n { angle: 132.3, amplitude: -17.599999999999998 },\n { angle: 132.6, amplitude: -17.599999999999998 },\n { angle: 132.9, amplitude: -17.599999999999998 },\n { angle: 133.8, amplitude: -18 },\n { angle: 134.4, amplitude: -18.4 },\n { angle: 137.1, amplitude: -18.799999999999997 },\n { angle: 137.2, amplitude: -18.799999999999997 },\n { angle: 138, amplitude: -19.2 },\n { angle: 138.6, amplitude: -19.2 },\n { angle: 138.9, amplitude: -19.6 },\n { angle: 139.7, amplitude: -19.6 },\n { angle: 141, amplitude: -19.6 },\n { angle: 141.6, amplitude: -20 },\n { angle: 142.4, amplitude: -20 },\n { angle: 142.8, amplitude: -20 },\n { angle: 143.3, amplitude: -20 },\n { angle: 144.3, amplitude: -20.4 },\n { angle: 144.8, amplitude: -20.4 },\n { angle: 145, amplitude: -20.4 },\n { angle: 146.1, amplitude: -20.4 },\n { angle: 146.5, amplitude: -20.4 },\n { angle: 147.1, amplitude: -20.4 },\n { angle: 147.6, amplitude: -20.8 },\n { angle: 147.9, amplitude: -20.4 },\n { angle: 148.5, amplitude: -20.4 },\n { angle: 148.9, amplitude: -20.4 },\n { angle: 149.1, amplitude: -20.4 },\n { angle: 149.5, amplitude: -20.8 },\n { angle: 150.7, amplitude: -20.4 },\n { angle: 151, amplitude: -20.4 },\n { angle: 151.5, amplitude: -20.4 },\n { angle: 152.4, amplitude: -20.4 },\n { angle: 152.8, amplitude: -20.4 },\n { angle: 153.2, amplitude: -20.4 },\n { angle: 154.2, amplitude: -20.4 },\n { angle: 154.3, amplitude: -20.4 },\n { angle: 154.5, amplitude: -20.4 },\n { angle: 154.9, amplitude: -20.4 },\n { angle: 155.4, amplitude: -20.4 },\n { angle: 155.8, amplitude: -20.4 },\n { angle: 155.9, amplitude: -20 },\n { angle: 156.2, amplitude: -20.4 },\n { angle: 156.8, amplitude: -20.4 },\n { angle: 157.5, amplitude: -20 },\n { angle: 158, amplitude: -20 },\n { angle: 158.7, amplitude: -20 },\n { angle: 159.8, amplitude: -20 },\n { angle: 160.7, amplitude: -20 },\n { angle: 161.7, amplitude: -20 },\n { angle: 162.2, amplitude: -20 },\n { angle: 162.8, amplitude: -20 },\n { angle: 163.8, amplitude: -20 },\n { angle: 165.2, amplitude: -20 },\n { angle: 165.5, amplitude: -20 },\n { angle: 166.3, amplitude: -20 },\n { angle: 167.2, amplitude: -20 },\n { angle: 168.4, amplitude: -20 },\n { angle: 169.3, amplitude: -19.6 },\n { angle: 169.4, amplitude: -19.6 },\n { angle: 169.9, amplitude: -19.6 },\n { angle: 170.4, amplitude: -19.6 },\n { angle: 170.6, amplitude: -19.6 },\n { angle: 170.9, amplitude: -19.6 },\n { angle: 171.7, amplitude: -19.6 },\n { angle: 172.7, amplitude: -19.6 },\n { angle: 173.9, amplitude: -19.6 },\n { angle: 174.7, amplitude: -19.2 },\n { angle: 175.2, amplitude: -19.2 },\n { angle: 176, amplitude: -19.2 },\n { angle: 176.3, amplitude: -19.2 },\n { angle: 177.1, amplitude: -19.2 },\n { angle: 177.8, amplitude: -19.2 },\n { angle: 178.1, amplitude: -18.799999999999997 },\n { angle: 178.3, amplitude: -18.799999999999997 },\n { angle: 178.8, amplitude: -18.799999999999997 },\n { angle: 179.3, amplitude: -18.799999999999997 },\n { angle: 179.8, amplitude: -18.799999999999997 },\n { angle: 180.3, amplitude: -18.799999999999997 },\n { amplitude: -18.799999999999997, angle: 179.7 },\n { amplitude: -18.799999999999997, angle: 180.2 },\n { amplitude: -18.799999999999997, angle: 180.7 },\n { amplitude: -18.799999999999997, angle: 181.2 },\n { amplitude: -18.799999999999997, angle: 181.7 },\n { amplitude: -18.799999999999997, angle: 181.9 },\n { amplitude: -19.2, angle: 182.2 },\n { amplitude: -19.2, angle: 182.9 },\n { amplitude: -19.2, angle: 183.7 },\n { amplitude: -19.2, angle: 184 },\n { amplitude: -19.2, angle: 184.8 },\n { amplitude: -19.2, angle: 185.3 },\n { amplitude: -19.6, angle: 186.1 },\n { amplitude: -19.6, angle: 187.3 },\n { amplitude: -19.6, angle: 188.3 },\n { amplitude: -19.6, angle: 189.1 },\n { amplitude: -19.6, angle: 189.4 },\n { amplitude: -19.6, angle: 189.6 },\n { amplitude: -19.6, angle: 190.1 },\n { amplitude: -19.6, angle: 190.6 },\n { amplitude: -19.6, angle: 190.7 },\n { amplitude: -20, angle: 191.6 },\n { amplitude: -20, angle: 192.8 },\n { amplitude: -20, angle: 193.7 },\n { amplitude: -20, angle: 194.5 },\n { amplitude: -20, angle: 194.8 },\n { amplitude: -20, angle: 196.2 },\n { amplitude: -20, angle: 197.2 },\n { amplitude: -20, angle: 197.8 },\n { amplitude: -20, angle: 198.3 },\n { amplitude: -20, angle: 199.3 },\n { amplitude: -20, angle: 200.2 },\n { amplitude: -20, angle: 201.3 },\n { amplitude: -20, angle: 202 },\n { amplitude: -20, angle: 202.5 },\n { amplitude: -20.4, angle: 203.2 },\n { amplitude: -20.4, angle: 203.8 },\n { amplitude: -20, angle: 204.1 },\n { amplitude: -20.4, angle: 204.2 },\n { amplitude: -20.4, angle: 204.6 },\n { amplitude: -20.4, angle: 205.1 },\n { amplitude: -20.4, angle: 205.5 },\n { amplitude: -20.4, angle: 205.7 },\n { amplitude: -20.4, angle: 205.8 },\n { amplitude: -20.4, angle: 206.8 },\n { amplitude: -20.4, angle: 207.2 },\n { amplitude: -20.4, angle: 207.6 },\n { amplitude: -20.4, angle: 208.5 },\n { amplitude: -20.4, angle: 209 },\n { amplitude: -20.4, angle: 209.3 },\n { amplitude: -20.8, angle: 210.5 },\n { amplitude: -20.4, angle: 210.9 },\n { amplitude: -20.4, angle: 211.1 },\n { amplitude: -20.4, angle: 211.5 },\n { amplitude: -20.4, angle: 212.1 },\n { amplitude: -20.8, angle: 212.4 },\n { amplitude: -20.4, angle: 212.9 },\n { amplitude: -20.4, angle: 213.5 },\n { amplitude: -20.4, angle: 213.9 },\n { amplitude: -20.4, angle: 215 },\n { amplitude: -20.4, angle: 215.2 },\n { amplitude: -20.4, angle: 215.7 },\n { amplitude: -20, angle: 216.7 },\n { amplitude: -20, angle: 217.2 },\n { amplitude: -20, angle: 217.6 },\n { amplitude: -20, angle: 218.4 },\n { amplitude: -19.6, angle: 219 },\n { amplitude: -19.6, angle: 220.3 },\n { amplitude: -19.6, angle: 221.1 },\n { amplitude: -19.2, angle: 221.4 },\n { amplitude: -19.2, angle: 222 },\n { amplitude: -18.799999999999997, angle: 222.8 },\n { amplitude: -18.799999999999997, angle: 222.9 },\n { amplitude: -18.4, angle: 225.6 },\n { amplitude: -18, angle: 226.2 },\n { amplitude: -17.599999999999998, angle: 227.1 },\n { amplitude: -17.599999999999998, angle: 227.4 },\n { amplitude: -17.599999999999998, angle: 227.7 },\n { amplitude: -17.200000000000003, angle: 228 },\n { amplitude: -17.200000000000003, angle: 228.3 },\n { amplitude: -17.200000000000003, angle: 228.8 },\n { amplitude: -17.200000000000003, angle: 229 },\n { amplitude: -16.8, angle: 229.4 },\n { amplitude: -16.8, angle: 230.5 },\n { amplitude: -16.8, angle: 230.7 },\n { amplitude: -16.400000000000002, angle: 231.3 },\n { amplitude: -16.400000000000002, angle: 231.4 },\n { amplitude: -16.400000000000002, angle: 231.5 },\n { amplitude: -16.400000000000002, angle: 232.4 },\n { amplitude: -16, angle: 232.7 },\n { amplitude: -16, angle: 233.4 },\n { amplitude: -16, angle: 233.7 },\n { amplitude: -15.600000000000001, angle: 234.1 },\n { amplitude: -15.600000000000001, angle: 234.6 },\n { amplitude: -15.2, angle: 235.3 },\n { amplitude: -15.2, angle: 235.6 },\n { amplitude: -15.2, angle: 235.8 },\n { amplitude: -14.8, angle: 236.6 },\n { amplitude: -14.8, angle: 237.9 },\n { amplitude: -14.399999999999999, angle: 238.7 },\n { amplitude: -14.399999999999999, angle: 239.8 },\n { amplitude: -14, angle: 240.7 },\n { amplitude: -14, angle: 241.1 },\n { amplitude: -13.599999999999998, angle: 242.9 },\n { amplitude: -13.599999999999998, angle: 243.3 },\n { amplitude: -13.2, angle: 243.4 },\n { amplitude: -13.2, angle: 243.8 },\n { amplitude: -13.2, angle: 244.5 },\n { amplitude: -13.2, angle: 244.6 },\n { amplitude: -13.2, angle: 244.8 },\n { amplitude: -13.2, angle: 245.5 },\n { amplitude: -12.799999999999997, angle: 246.1 },\n { amplitude: -12.799999999999997, angle: 246.2 },\n { amplitude: -12.799999999999997, angle: 246.9 },\n { amplitude: -12.400000000000002, angle: 247.2 },\n { amplitude: -12.400000000000002, angle: 247.9 },\n { amplitude: -12.400000000000002, angle: 248.1 },\n { amplitude: -12.000000000000002, angle: 248.4 },\n { amplitude: -12.000000000000002, angle: 248.9 },\n { amplitude: -12.000000000000002, angle: 249.4 },\n { amplitude: -12.000000000000002, angle: 249.8 },\n { amplitude: -11.600000000000001, angle: 249.9 },\n { amplitude: -12.000000000000002, angle: 250.1 },\n { amplitude: -12.000000000000002, angle: 250.7 },\n { amplitude: -11.600000000000001, angle: 250.8 },\n { amplitude: -11.600000000000001, angle: 251 },\n { amplitude: -11.600000000000001, angle: 251.6 },\n { amplitude: -11.600000000000001, angle: 251.7 },\n { amplitude: -11.600000000000001, angle: 251.9 },\n { amplitude: -11.200000000000001, angle: 252 },\n { amplitude: -11.200000000000001, angle: 252.5 },\n { amplitude: -11.200000000000001, angle: 252.7 },\n { amplitude: -11.200000000000001, angle: 252.8 },\n { amplitude: -11.200000000000001, angle: 253.5 },\n { amplitude: -11.200000000000001, angle: 253.6 },\n { amplitude: -10.8, angle: 253.9 },\n { amplitude: -10.8, angle: 254 },\n { amplitude: -10.8, angle: 254.4 },\n { amplitude: -10.8, angle: 254.6 },\n { amplitude: -10.4, angle: 254.9 },\n { amplitude: -10.4, angle: 255.3 },\n { amplitude: -10.4, angle: 255.6 },\n { amplitude: -10, angle: 256.2 },\n { amplitude: -10, angle: 256.5 },\n { amplitude: -10, angle: 257.8 },\n { amplitude: -9.6, angle: 258 },\n { amplitude: -9.6, angle: 258.6 },\n { amplitude: -9.6, angle: 258.8 },\n { amplitude: -9.6, angle: 258.9 },\n { amplitude: -9.6, angle: 259.5 },\n { amplitude: -9.6, angle: 260 },\n { amplitude: -9.6, angle: 260.2 },\n { amplitude: -9.2, angle: 260.4 },\n { amplitude: -9.6, angle: 260.8 },\n { amplitude: -9.2, angle: 261 },\n { amplitude: -9.2, angle: 261.1 },\n { amplitude: -9.2, angle: 261.7 },\n { amplitude: -9.2, angle: 261.9 },\n { amplitude: -9.2, angle: 262.4 },\n { amplitude: -9.2, angle: 262.9 },\n { amplitude: -9.2, angle: 263.1 },\n { amplitude: -8.799999999999999, angle: 263.7 },\n { amplitude: -8.799999999999999, angle: 263.8 },\n { amplitude: -8.799999999999999, angle: 264.4 },\n { amplitude: -8.799999999999999, angle: 264.5 },\n { amplitude: -8.799999999999999, angle: 264.7 },\n { amplitude: -8.799999999999999, angle: 265.1 },\n { amplitude: -8.399999999999999, angle: 265.3 },\n { amplitude: -8.399999999999999, angle: 265.4 },\n { amplitude: -8.399999999999999, angle: 266.1 },\n { amplitude: -8.399999999999999, angle: 266.5 },\n { amplitude: -8.399999999999999, angle: 266.6 },\n { amplitude: -8.399999999999999, angle: 266.8 },\n { amplitude: -8.399999999999999, angle: 267.1 },\n { amplitude: -8.399999999999999, angle: 267.5 },\n { amplitude: -7.999999999999998, angle: 267.8 },\n { amplitude: -7.999999999999998, angle: 268.2 },\n { amplitude: -7.999999999999998, angle: 268.8 },\n { amplitude: -7.599999999999998, angle: 270 },\n { amplitude: -7.599999999999998, angle: 270.6 },\n { amplitude: -7.599999999999998, angle: 271.1 },\n { amplitude: -7.599999999999998, angle: 271.4 },\n { amplitude: -7.599999999999998, angle: 271.9 },\n { amplitude: -7.599999999999998, angle: 272.1 },\n { amplitude: -7.599999999999998, angle: 272.4 },\n { amplitude: -7.599999999999998, angle: 272.6 },\n { amplitude: -7.599999999999998, angle: 272.7 },\n { amplitude: -7.599999999999998, angle: 273.1 },\n { amplitude: -7.599999999999998, angle: 273.2 },\n { amplitude: -7.599999999999998, angle: 273.7 },\n { amplitude: -7.599999999999998, angle: 274.3 },\n { amplitude: -7.599999999999998, angle: 274.5 },\n { amplitude: -7.200000000000002, angle: 275.8 },\n { amplitude: -7.200000000000002, angle: 276.3 },\n { amplitude: -7.200000000000002, angle: 276.6 },\n { amplitude: -7.200000000000002, angle: 277.2 },\n { amplitude: -7.200000000000002, angle: 277.7 },\n { amplitude: -7.200000000000002, angle: 279 },\n { amplitude: -7.200000000000002, angle: 279.5 },\n { amplitude: -7.200000000000002, angle: 280.1 },\n { amplitude: -6.800000000000002, angle: 280.7 },\n { amplitude: -6.800000000000002, angle: 281 },\n { amplitude: -6.800000000000002, angle: 281.4 },\n { amplitude: -6.800000000000002, angle: 281.7 },\n { amplitude: -6.800000000000002, angle: 282 },\n { amplitude: -6.800000000000002, angle: 282.3 },\n { amplitude: -6.800000000000002, angle: 282.6 },\n { amplitude: -6.800000000000002, angle: 283.3 },\n { amplitude: -6.800000000000002, angle: 283.6 },\n { amplitude: -6.800000000000002, angle: 283.9 },\n { amplitude: -6.400000000000001, angle: 284.2 },\n { amplitude: -6.400000000000001, angle: 284.5 },\n { amplitude: -6.400000000000001, angle: 285.1 },\n { amplitude: -6.400000000000001, angle: 285.2 },\n { amplitude: -6.400000000000001, angle: 285.4 },\n { amplitude: -6.400000000000001, angle: 285.9 },\n { amplitude: -6.400000000000001, angle: 286 },\n { amplitude: -6.400000000000001, angle: 286.3 },\n { amplitude: -6.400000000000001, angle: 286.5 },\n { amplitude: -6.400000000000001, angle: 287 },\n { amplitude: -6.400000000000001, angle: 287.3 },\n { amplitude: -6.400000000000001, angle: 287.8 },\n { amplitude: -6.400000000000001, angle: 288 },\n { amplitude: -6.400000000000001, angle: 288.4 },\n { amplitude: -6.400000000000001, angle: 288.6 },\n { amplitude: -6.000000000000001, angle: 288.9 },\n { amplitude: -6.000000000000001, angle: 289 },\n { amplitude: -6.000000000000001, angle: 289.5 },\n { amplitude: -6.000000000000001, angle: 289.7 },\n { amplitude: -6.000000000000001, angle: 290.2 },\n { amplitude: -6.000000000000001, angle: 290.9 },\n { amplitude: -6.000000000000001, angle: 291 },\n { amplitude: -6.000000000000001, angle: 291.4 },\n { amplitude: -6.000000000000001, angle: 291.6 },\n { amplitude: -6.000000000000001, angle: 292.2 },\n { amplitude: -5.6000000000000005, angle: 292.9 },\n { amplitude: -6.000000000000001, angle: 293.5 },\n { amplitude: -6.000000000000001, angle: 293.7 },\n { amplitude: -5.2, angle: 296.7 },\n { amplitude: -5.2, angle: 297.2 },\n { amplitude: -5.2, angle: 298 },\n { amplitude: -5.2, angle: 298.5 },\n { amplitude: -5.2, angle: 299 },\n { amplitude: -5.2, angle: 299.2 },\n { amplitude: -5.2, angle: 299.8 },\n { amplitude: -4.8, angle: 300.5 },\n { amplitude: -4.8, angle: 300.8 },\n { amplitude: -4.8, angle: 301.8 },\n { amplitude: -4.8, angle: 302.2 },\n { amplitude: -4.8, angle: 302.8 },\n { amplitude: -4.8, angle: 303.1 },\n { amplitude: -4.8, angle: 304 },\n { amplitude: -5.2, angle: 304.1 },\n { amplitude: -4.8, angle: 304.8 },\n { amplitude: -5.2, angle: 304.9 },\n { amplitude: -4.8, angle: 305.1 },\n { amplitude: -5.2, angle: 305.2 },\n { amplitude: -4.8, angle: 305.3 },\n { amplitude: -4.8, angle: 305.9 },\n { amplitude: -4.8, angle: 306.1 },\n { amplitude: -4.8, angle: 306.3 },\n { amplitude: -4.8, angle: 306.8 },\n { amplitude: -4.8, angle: 307 },\n { amplitude: -4.8, angle: 307.3 },\n { amplitude: -4.8, angle: 307.4 },\n { amplitude: -4.8, angle: 307.5 },\n { amplitude: -4.8, angle: 307.8 },\n { amplitude: -4.8, angle: 308.3 },\n { amplitude: -4.8, angle: 308.6 },\n { amplitude: -4.8, angle: 308.8 },\n { amplitude: -4.8, angle: 309.1 },\n { amplitude: -4.8, angle: 309.7 },\n { amplitude: -4.3999999999999995, angle: 310.1 },\n { amplitude: -4.3999999999999995, angle: 310.2 },\n { amplitude: -4.3999999999999995, angle: 311.5 },\n { amplitude: -4.3999999999999995, angle: 312.1 },\n { amplitude: -4.3999999999999995, angle: 312.2 },\n { amplitude: -3.999999999999999, angle: 312.5 },\n { amplitude: -4.3999999999999995, angle: 313.1 },\n { amplitude: -3.999999999999999, angle: 313.3 },\n { amplitude: -3.999999999999999, angle: 314.1 },\n { amplitude: -3.999999999999999, angle: 314.6 },\n { amplitude: -3.999999999999999, angle: 314.9 },\n { amplitude: -3.999999999999999, angle: 315.4 },\n { amplitude: -3.999999999999999, angle: 315.5 },\n { amplitude: -3.999999999999999, angle: 316 },\n { amplitude: -3.999999999999999, angle: 316.2 },\n { amplitude: -3.999999999999999, angle: 316.4 },\n { amplitude: -3.999999999999999, angle: 316.7 },\n { amplitude: -3.999999999999999, angle: 317 },\n { amplitude: -3.999999999999999, angle: 317.2 },\n { amplitude: -3.999999999999999, angle: 317.5 },\n { amplitude: -3.999999999999999, angle: 317.8 },\n { amplitude: -3.5999999999999988, angle: 318 },\n { amplitude: -3.5999999999999988, angle: 318.3 },\n { amplitude: -3.5999999999999988, angle: 318.9 },\n { amplitude: -3.5999999999999988, angle: 319.2 },\n { amplitude: -3.5999999999999988, angle: 319.5 },\n { amplitude: -3.5999999999999988, angle: 320 },\n { amplitude: -3.5999999999999988, angle: 320.3 },\n { amplitude: -3.5999999999999988, angle: 320.5 },\n { amplitude: -3.5999999999999988, angle: 321.1 },\n { amplitude: -3.5999999999999988, angle: 321.2 },\n { amplitude: -3.5999999999999988, angle: 321.5 },\n { amplitude: -3.5999999999999988, angle: 321.6 },\n { amplitude: -3.1999999999999984, angle: 321.7 },\n { amplitude: -3.5999999999999988, angle: 322.1 },\n { amplitude: -3.1999999999999984, angle: 322.4 },\n { amplitude: -3.1999999999999984, angle: 322.6 },\n { amplitude: -3.1999999999999984, angle: 323.3 },\n { amplitude: -3.1999999999999984, angle: 324.1 },\n { amplitude: -2.799999999999998, angle: 324.7 },\n { amplitude: -2.799999999999998, angle: 325 },\n { amplitude: -2.799999999999998, angle: 325.2 },\n { amplitude: -2.799999999999998, angle: 325.5 },\n { amplitude: -2.799999999999998, angle: 325.6 },\n { amplitude: -2.799999999999998, angle: 325.9 },\n { amplitude: -2.400000000000002, angle: 326 },\n { amplitude: -2.799999999999998, angle: 326.1 },\n { amplitude: -2.400000000000002, angle: 326.3 },\n { amplitude: -2.400000000000002, angle: 327 },\n { amplitude: -2.400000000000002, angle: 327.5 },\n { amplitude: -2.400000000000002, angle: 327.8 },\n { amplitude: -2.400000000000002, angle: 328.3 },\n { amplitude: -2.0000000000000018, angle: 328.6 },\n { amplitude: -2.400000000000002, angle: 328.8 },\n { amplitude: -2.0000000000000018, angle: 329.2 },\n { amplitude: -2.0000000000000018, angle: 329.7 },\n { amplitude: -2.0000000000000018, angle: 329.9 },\n { amplitude: -2.0000000000000018, angle: 330.3 },\n { amplitude: -2.0000000000000018, angle: 330.6 },\n { amplitude: -2.0000000000000018, angle: 331.2 },\n { amplitude: -2.0000000000000018, angle: 331.6 },\n { amplitude: -2.0000000000000018, angle: 331.7 },\n { amplitude: -2.0000000000000018, angle: 332 },\n { amplitude: -2.0000000000000018, angle: 332.3 },\n { amplitude: -2.0000000000000018, angle: 332.5 },\n { amplitude: -2.0000000000000018, angle: 333 },\n { amplitude: -2.0000000000000018, angle: 333.1 },\n { amplitude: -1.6000000000000014, angle: 333.3 },\n { amplitude: -2.0000000000000018, angle: 333.6 },\n { amplitude: -2.0000000000000018, angle: 333.8 },\n { amplitude: -1.6000000000000014, angle: 334.3 },\n { amplitude: -1.6000000000000014, angle: 334.6 },\n { amplitude: -1.6000000000000014, angle: 335.2 },\n { amplitude: -1.6000000000000014, angle: 335.5 },\n { amplitude: -1.6000000000000014, angle: 335.7 },\n { amplitude: -1.6000000000000014, angle: 336.1 },\n { amplitude: -1.6000000000000014, angle: 336.7 },\n { amplitude: -1.6000000000000014, angle: 336.9 },\n { amplitude: -1.6000000000000014, angle: 337 },\n { amplitude: -1.6000000000000014, angle: 337.1 },\n { amplitude: -1.6000000000000014, angle: 337.6 },\n { amplitude: -1.6000000000000014, angle: 338.1 },\n { amplitude: -1.6000000000000014, angle: 338.3 },\n { amplitude: -1.6000000000000014, angle: 338.6 },\n { amplitude: -1.6000000000000014, angle: 338.7 },\n { amplitude: -1.6000000000000014, angle: 338.9 },\n { amplitude: -1.6000000000000014, angle: 339.2 },\n { amplitude: -1.6000000000000014, angle: 339.4 },\n { amplitude: -1.6000000000000014, angle: 339.8 },\n { amplitude: -1.6000000000000014, angle: 340.6 },\n { amplitude: -1.6000000000000014, angle: 341.6 },\n { amplitude: -1.6000000000000014, angle: 341.7 },\n { amplitude: -1.200000000000001, angle: 342.2 },\n { amplitude: -1.200000000000001, angle: 342.4 },\n { amplitude: -1.200000000000001, angle: 342.9 },\n { amplitude: -1.200000000000001, angle: 343 },\n { amplitude: -1.200000000000001, angle: 343.5 },\n { amplitude: -1.200000000000001, angle: 343.6 },\n { amplitude: -1.200000000000001, angle: 344.1 },\n { amplitude: -1.200000000000001, angle: 344.2 },\n { amplitude: -1.200000000000001, angle: 344.6 },\n { amplitude: -0.8000000000000007, angle: 345.5 },\n { amplitude: -0.8000000000000007, angle: 345.8 },\n { amplitude: -0.8000000000000007, angle: 346.5 },\n { amplitude: -0.8000000000000007, angle: 346.6 },\n { amplitude: -0.8000000000000007, angle: 347.1 },\n { amplitude: -0.8000000000000007, angle: 347.6 },\n { amplitude: -0.8000000000000007, angle: 348 },\n { amplitude: -0.8000000000000007, angle: 348.2 },\n { amplitude: -0.8000000000000007, angle: 348.3 },\n { amplitude: -0.8000000000000007, angle: 348.8 },\n { amplitude: -0.8000000000000007, angle: 349.2 },\n { amplitude: -0.8000000000000007, angle: 349.7 },\n { amplitude: -0.8000000000000007, angle: 349.8 },\n { amplitude: -0.8000000000000007, angle: 350.2 },\n { amplitude: -0.8000000000000007, angle: 350.5 },\n { amplitude: -0.8000000000000007, angle: 350.8 },\n { amplitude: -0.8000000000000007, angle: 350.9 },\n { amplitude: -0.8000000000000007, angle: 351 },\n { amplitude: -0.8000000000000007, angle: 351.4 },\n { amplitude: -1.200000000000001, angle: 351.8 },\n { amplitude: -1.200000000000001, angle: 352 },\n { amplitude: -1.200000000000001, angle: 352.1 },\n { amplitude: -1.200000000000001, angle: 352.4 },\n { amplitude: -0.8000000000000007, angle: 352.5 },\n { amplitude: -1.200000000000001, angle: 352.9 },\n { amplitude: -0.8000000000000007, angle: 354 },\n { amplitude: -0.8000000000000007, angle: 354.6 },\n { amplitude: -0.8000000000000007, angle: 354.9 },\n { amplitude: -0.8000000000000007, angle: 355.4 },\n { amplitude: -0.40000000000000036, angle: 355.8 },\n { amplitude: -0.8000000000000007, angle: 356.4 },\n { amplitude: -0.40000000000000036, angle: 356.9 },\n { amplitude: -0.40000000000000036, angle: 357.4 },\n { amplitude: -0.40000000000000036, angle: 357.8 },\n { amplitude: -0.40000000000000036, angle: 358.5 },\n { amplitude: -0.40000000000000036, angle: 359.1 },\n { amplitude: -0.40000000000000036, angle: 359.5 },\n { amplitude: -0.40000000000000036, angle: 359.7 },\n { amplitude: -0.40000000000000036, angle: 360 },\n ],\n },\n])\n","url":null,"readme":"This example showcases a simple Polar Chart with five Line Series.\n\nPolar Charts are used for visualizing data relationships in terms of radiuses and angles.\n\n## Polar coordinate system and PolarLineSeries\n\n```typescript\n{\n // Data point angle as degrees [0, 360].\n angle: 0,\n // Data point position on the *Amplitude Axis*. Determines its location between the Charts origin and outer edge.\n amplitude: 50\n}\n```\n\n_PolarLineSeries_ connects a list of such _PolarPoints_ with a continuous line.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![Two Polar Line Series](./assets/polarLineSeries.png)\n\n## PolarRadialAxis\n\nThe coordinate system can be rotated with methods of \\*PolarRadialAxis\\*\\*.\n\n```typescript\n// Configure Polar Radial Axis.\nconst radialAxis = polar\n .getRadialAxis()\n // 0 = North\n .setRotation(90)\n // Clockwise direction.\n .setInverted(true)\n```\n\n## PolarAmplitudeAxis\n\nSimilarly, the visible range of amplitude values can be configured with methods of _PolarAmplitudeAxis_. The default configuration is to fit\n\n```typescript\nconst amplitudeAxis = polar\n .getAmplitudeAxis()\n // Set amplitude interval explicitly.\n // [-39 dB, 0 dB]\n .setInterval({ start: -39, end: 0, stopAxisAfter: false })\n .setTitle('Sensitivity (dB)')\n```\n","image":"polarMicrophoneSensitivity"},{"id":"lcjs-example-1002-polarEMFieldStrength","title":"JavaScript Polar Chart EM Field Strength","tags":["polar","area"],"description":"PolarChart showcase with AreaSeries","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Polar Charts, Scientific Charts, High-Performance Charts, Medical Charts, Area Charts, Line Series.","src":"/*\n * LightningChartJS example showcasing PolarChart and PolarAreaSeries in a electromagnetic field strength visualization application.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, Themes } = lcjs\n\nconst app = (data) => {\n // Create a polar chart.\n const polar = lightningChart()\n .Polar({\n // theme: Themes.darkGold\n })\n .setTitle('Electromagnetic field strength')\n\n // Configure Polar Axes.\n const radialAxis = polar.getRadialAxis()\n\n const amplitudeAxis = polar.getAmplitudeAxis().setTitle('Field strength H (A/m)')\n\n // Create series for each data set.\n const seriesList = data.map((info) => {\n const { name } = info\n const polarAreaSeries = polar\n .addAreaSeries()\n .setName(name)\n .setConnectDataAutomaticallyEnabled(true)\n .setCursorResultTableFormatter((builder, series, angleDeg, amplitude, format) =>\n builder\n .addRow(`${series.getName()}`)\n .addRow('Angle', '', `${Math.round(angleDeg)} °`)\n .addRow('Field strength', '', `${format(amplitude)} A/m`),\n )\n\n return polarAreaSeries\n })\n\n // Animate series data with random static to simulate live sensor data.\n let freezeData = false\n const updateData = () => {\n if (!freezeData)\n seriesList.forEach((series, i) => {\n const polarPoints = data[i].data\n const polarPointsWithStatic = polarPoints.map((polarPoint) => ({\n angle: polarPoint.angle,\n amplitude: polarPoint.amplitude + (Math.random() * 2 - 1) * 0.2,\n }))\n series.setData(polarPointsWithStatic)\n })\n\n requestAnimationFrame(updateData)\n }\n updateData()\n\n // Add LegendBox.\n const legendBox = polar\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.2,\n })\n legendBox.add(polar)\n\n // Freeze data animation while mouse is on Chart.\n let mouseOverBackground = false\n let numSeriesOverMouse = false\n polar.onSeriesBackgroundMouseEnter(() => {\n mouseOverBackground = true\n freezeData = mouseOverBackground || numSeriesOverMouse > 0\n })\n polar.onSeriesBackgroundMouseLeave(() => {\n mouseOverBackground = false\n freezeData = mouseOverBackground || numSeriesOverMouse > 0\n })\n seriesList.forEach((series) =>\n series.onMouseEnter(() => {\n numSeriesOverMouse += 1\n freezeData = mouseOverBackground || numSeriesOverMouse > 0\n }),\n )\n seriesList.forEach((series) =>\n series.onMouseLeave(() => {\n numSeriesOverMouse -= 1\n freezeData = mouseOverBackground || numSeriesOverMouse > 0\n }),\n )\n}\n\napp([\n {\n name: 'Above 100MHz',\n data: [\n { angle: 0, amplitude: 4.1 },\n { angle: 0.3, amplitude: 4.1 },\n { angle: 0.6, amplitude: 4 },\n { angle: 1.1, amplitude: 4 },\n { angle: 1.4, amplitude: 4 },\n { angle: 1.7, amplitude: 4 },\n { angle: 2.2, amplitude: 4 },\n { angle: 2.5, amplitude: 4 },\n { angle: 2.7, amplitude: 4 },\n { angle: 3.3, amplitude: 4 },\n { angle: 3.5, amplitude: 4 },\n { angle: 3.8, amplitude: 4 },\n { angle: 4.3, amplitude: 4 },\n { angle: 4.6, amplitude: 4 },\n { angle: 4.8, amplitude: 4 },\n { angle: 5.4, amplitude: 4 },\n { angle: 5.6, amplitude: 4 },\n { angle: 5.9, amplitude: 4 },\n { angle: 6.4, amplitude: 4.1 },\n { angle: 6.6, amplitude: 4.1 },\n { angle: 6.9, amplitude: 4.1 },\n { angle: 7.6, amplitude: 4.1 },\n { angle: 7.9, amplitude: 4.1 },\n { angle: 8.3, amplitude: 4.1 },\n { angle: 8.6, amplitude: 4.1 },\n { angle: 8.8, amplitude: 4.2 },\n { angle: 9.3, amplitude: 4.2 },\n { angle: 10.2, amplitude: 4.2 },\n { angle: 10.7, amplitude: 4.2 },\n { angle: 11.1, amplitude: 4.3 },\n { angle: 11.6, amplitude: 4.3 },\n { angle: 12.1, amplitude: 4.3 },\n { angle: 12.2, amplitude: 4.3 },\n { angle: 12.4, amplitude: 4.3 },\n { angle: 12.9, amplitude: 4.3 },\n { angle: 13.1, amplitude: 4.4 },\n { angle: 13.3, amplitude: 4.4 },\n { angle: 13.8, amplitude: 4.4 },\n { angle: 14.1, amplitude: 4.4 },\n { angle: 14.5, amplitude: 4.4 },\n { angle: 14.9, amplitude: 4.5 },\n { angle: 15.5, amplitude: 4.5 },\n { angle: 16.3, amplitude: 4.6000000000000005 },\n { angle: 17.1, amplitude: 4.6000000000000005 },\n { angle: 17.2, amplitude: 4.6000000000000005 },\n { angle: 17.6, amplitude: 4.699999999999999 },\n { angle: 17.7, amplitude: 4.699999999999999 },\n { angle: 18.4, amplitude: 4.699999999999999 },\n { angle: 18.5, amplitude: 4.8 },\n { angle: 18.6, amplitude: 4.8 },\n { angle: 19, amplitude: 4.8 },\n { angle: 19.2, amplitude: 4.8 },\n { angle: 19.6, amplitude: 4.9 },\n { angle: 19.7, amplitude: 4.9 },\n { angle: 20.3, amplitude: 5 },\n { angle: 20.4, amplitude: 5 },\n { angle: 21, amplitude: 5 },\n { angle: 21.3, amplitude: 5.1 },\n { angle: 21.5, amplitude: 5.1 },\n { angle: 21.7, amplitude: 5.1 },\n { angle: 21.9, amplitude: 5.2 },\n { angle: 22, amplitude: 5.2 },\n { angle: 22.1, amplitude: 5.2 },\n { angle: 22.5, amplitude: 5.2 },\n { angle: 22.6, amplitude: 5.300000000000001 },\n { angle: 23.1, amplitude: 5.300000000000001 },\n { angle: 23.3, amplitude: 5.4 },\n { angle: 23.7, amplitude: 5.4 },\n { angle: 23.8, amplitude: 5.4 },\n { angle: 24.4, amplitude: 5.4 },\n { angle: 24.6, amplitude: 5.4 },\n { angle: 24.9, amplitude: 5.5 },\n { angle: 25.3, amplitude: 5.5 },\n { angle: 25.6, amplitude: 5.5 },\n { angle: 25.8, amplitude: 5.5 },\n { angle: 26, amplitude: 5.5 },\n { angle: 26.1, amplitude: 5.5 },\n { angle: 26.5, amplitude: 5.5 },\n { angle: 26.6, amplitude: 5.5 },\n { angle: 26.8, amplitude: 5.4 },\n { angle: 26.9, amplitude: 5.4 },\n { angle: 27, amplitude: 5.4 },\n { angle: 27.2, amplitude: 5.4 },\n { angle: 27.3, amplitude: 5.300000000000001 },\n { angle: 27.4, amplitude: 5.300000000000001 },\n { angle: 27.5, amplitude: 5.300000000000001 },\n { angle: 27.7, amplitude: 5.300000000000001 },\n { angle: 27.9, amplitude: 5.2 },\n { angle: 28, amplitude: 5.1 },\n { angle: 28.2, amplitude: 5.1 },\n { angle: 28.4, amplitude: 5 },\n { angle: 28.6, amplitude: 5 },\n { angle: 28.8, amplitude: 5 },\n { angle: 29, amplitude: 4.9 },\n { angle: 29.2, amplitude: 4.9 },\n { angle: 29.6, amplitude: 4.8 },\n { angle: 29.8, amplitude: 4.8 },\n { angle: 30.5, amplitude: 4.699999999999999 },\n { angle: 31.7, amplitude: 4.4 },\n { angle: 31.9, amplitude: 4.3 },\n { angle: 32, amplitude: 4.2 },\n { angle: 32.4, amplitude: 4.2 },\n { angle: 32.7, amplitude: 4.1 },\n { angle: 32.8, amplitude: 4 },\n { angle: 33.1, amplitude: 4 },\n { angle: 33.2, amplitude: 3.9000000000000004 },\n { angle: 33.4, amplitude: 3.8 },\n { angle: 33.8, amplitude: 3.5 },\n { angle: 34, amplitude: 3.4000000000000004 },\n { angle: 34.8, amplitude: 3.3000000000000003 },\n { angle: 35, amplitude: 3.2 },\n { angle: 35.5, amplitude: 3.2 },\n { angle: 35.6, amplitude: 3.1 },\n { angle: 36.4, amplitude: 3.1 },\n { angle: 36.5, amplitude: 3 },\n { angle: 36.6, amplitude: 3 },\n { angle: 36.9, amplitude: 2.9 },\n { angle: 37.1, amplitude: 2.9 },\n { angle: 37.5, amplitude: 2.8000000000000003 },\n { angle: 37.7, amplitude: 2.8000000000000003 },\n { angle: 37.8, amplitude: 2.7 },\n { angle: 38.8, amplitude: 2.7 },\n { angle: 40.5, amplitude: 2.5 },\n { angle: 41.3, amplitude: 2.5 },\n { angle: 42.4, amplitude: 2.3000000000000003 },\n { angle: 42.9, amplitude: 2.2 },\n { angle: 45.3, amplitude: 2.1 },\n { angle: 46.7, amplitude: 2.1 },\n { angle: 46.8, amplitude: 2.1 },\n { angle: 47.9, amplitude: 2 },\n { angle: 48.3, amplitude: 2 },\n { angle: 49.1, amplitude: 2 },\n { angle: 49.6, amplitude: 2 },\n { angle: 50, amplitude: 1.9 },\n { angle: 50.8, amplitude: 1.9 },\n { angle: 51.2, amplitude: 1.9 },\n { angle: 51.7, amplitude: 1.9 },\n { angle: 53, amplitude: 1.9 },\n { angle: 53.7, amplitude: 1.7999999999999998 },\n { angle: 54.7, amplitude: 1.7999999999999998 },\n { angle: 57.2, amplitude: 1.7999999999999998 },\n { angle: 57.5, amplitude: 1.7999999999999998 },\n { angle: 58.4, amplitude: 1.9 },\n { angle: 58.7, amplitude: 1.9 },\n { angle: 60.3, amplitude: 1.9 },\n { angle: 61.1, amplitude: 2 },\n { angle: 61.4, amplitude: 2 },\n { angle: 61.9, amplitude: 2 },\n { angle: 64.4, amplitude: 2.1 },\n { angle: 65.5, amplitude: 2.1 },\n { angle: 65.9, amplitude: 2.2 },\n { angle: 66.3, amplitude: 2.2 },\n { angle: 68, amplitude: 2.2 },\n { angle: 68.8, amplitude: 2.2 },\n { angle: 69, amplitude: 2.3000000000000003 },\n { angle: 69.5, amplitude: 2.3000000000000003 },\n { angle: 70.3, amplitude: 2.3000000000000003 },\n { angle: 71.1, amplitude: 2.3000000000000003 },\n { angle: 71.8, amplitude: 2.3000000000000003 },\n { angle: 71.9, amplitude: 2.4 },\n { angle: 72.1, amplitude: 2.4 },\n { angle: 72.3, amplitude: 2.4 },\n { angle: 73.4, amplitude: 2.4 },\n { angle: 73.8, amplitude: 2.5 },\n { angle: 75.1, amplitude: 2.6 },\n { angle: 75.6, amplitude: 2.6 },\n { angle: 75.9, amplitude: 2.7 },\n { angle: 76.7, amplitude: 2.7 },\n { angle: 77, amplitude: 2.8000000000000003 },\n { angle: 77.6, amplitude: 2.8000000000000003 },\n { angle: 77.8, amplitude: 2.9 },\n { angle: 78, amplitude: 2.9 },\n { angle: 78.2, amplitude: 3 },\n { angle: 78.7, amplitude: 3 },\n { angle: 79.7, amplitude: 3.1 },\n { angle: 79.8, amplitude: 3.1 },\n { angle: 80, amplitude: 3.2 },\n { angle: 80.1, amplitude: 3.2 },\n { angle: 80.2, amplitude: 3.2 },\n { angle: 80.3, amplitude: 3.3000000000000003 },\n { angle: 80.5, amplitude: 3.3000000000000003 },\n { angle: 80.9, amplitude: 3.3000000000000003 },\n { angle: 81, amplitude: 3.4000000000000004 },\n { angle: 81.1, amplitude: 3.4000000000000004 },\n { angle: 82.2, amplitude: 3.5 },\n { angle: 82.3, amplitude: 3.5999999999999996 },\n { angle: 82.8, amplitude: 3.5999999999999996 },\n { angle: 83, amplitude: 3.7 },\n { angle: 83.4, amplitude: 3.8 },\n { angle: 83.5, amplitude: 3.9000000000000004 },\n { angle: 84.1, amplitude: 3.9000000000000004 },\n { angle: 84.2, amplitude: 4 },\n { angle: 84.3, amplitude: 4 },\n { angle: 84.4, amplitude: 4.1 },\n { angle: 84.8, amplitude: 4.2 },\n { angle: 85.2, amplitude: 4.3 },\n { angle: 85.7, amplitude: 4.4 },\n { angle: 86, amplitude: 4.5 },\n { angle: 86.3, amplitude: 4.5 },\n { angle: 86.8, amplitude: 4.6000000000000005 },\n { angle: 87.1, amplitude: 4.6000000000000005 },\n { angle: 87.4, amplitude: 4.8 },\n { angle: 87.9, amplitude: 4.8 },\n { angle: 88.1, amplitude: 4.9 },\n { angle: 88.4, amplitude: 5 },\n { angle: 88.8, amplitude: 5.1 },\n { angle: 89, amplitude: 5.1 },\n { angle: 89.2, amplitude: 5.2 },\n { angle: 89.7, amplitude: 5.300000000000001 },\n { angle: 89.9, amplitude: 5.300000000000001 },\n { angle: 90, amplitude: 5.300000000000001 },\n { angle: 90.4, amplitude: 5.300000000000001 },\n { angle: 90.6, amplitude: 5.300000000000001 },\n { angle: 91.4, amplitude: 5.300000000000001 },\n { angle: 92.5, amplitude: 5.300000000000001 },\n { angle: 93.1, amplitude: 5.300000000000001 },\n { angle: 94.1, amplitude: 5.300000000000001 },\n { angle: 94.5, amplitude: 5.2 },\n { angle: 94.9, amplitude: 5.2 },\n { angle: 95.5, amplitude: 5.2 },\n { angle: 95.8, amplitude: 5.2 },\n { angle: 96.2, amplitude: 5.2 },\n { angle: 96.4, amplitude: 5.2 },\n { angle: 96.7, amplitude: 5.2 },\n { angle: 97.1, amplitude: 5.1 },\n { angle: 97.2, amplitude: 5 },\n { angle: 97.7, amplitude: 5 },\n { angle: 98.2, amplitude: 5 },\n { angle: 98.4, amplitude: 5 },\n { angle: 98.8, amplitude: 4.9 },\n { angle: 99.3, amplitude: 4.8 },\n { angle: 99.6, amplitude: 4.8 },\n { angle: 99.9, amplitude: 4.8 },\n { angle: 100.4, amplitude: 4.8 },\n { angle: 100.5, amplitude: 4.699999999999999 },\n { angle: 100.7, amplitude: 4.699999999999999 },\n { angle: 101.1, amplitude: 4.699999999999999 },\n { angle: 101.6, amplitude: 4.6000000000000005 },\n { angle: 101.7, amplitude: 4.6000000000000005 },\n { angle: 101.9, amplitude: 4.6000000000000005 },\n { angle: 102.2, amplitude: 4.6000000000000005 },\n { angle: 102.8, amplitude: 4.5 },\n { angle: 103, amplitude: 4.5 },\n { angle: 103.1, amplitude: 4.5 },\n { angle: 103.2, amplitude: 4.5 },\n { angle: 103.5, amplitude: 4.5 },\n { angle: 103.6, amplitude: 4.4 },\n { angle: 104.1, amplitude: 4.4 },\n { angle: 104.3, amplitude: 4.4 },\n { angle: 104.7, amplitude: 4.4 },\n { angle: 105.1, amplitude: 4.4 },\n { angle: 105.6, amplitude: 4.4 },\n { angle: 106.1, amplitude: 4.4 },\n { angle: 106.4, amplitude: 4.4 },\n { angle: 106.6, amplitude: 4.4 },\n { angle: 107.1, amplitude: 4.4 },\n { angle: 107.5, amplitude: 4.5 },\n { angle: 107.9, amplitude: 4.5 },\n { angle: 108.1, amplitude: 4.6000000000000005 },\n { angle: 108.3, amplitude: 4.6000000000000005 },\n { angle: 108.5, amplitude: 4.6000000000000005 },\n { angle: 108.7, amplitude: 4.6000000000000005 },\n { angle: 109, amplitude: 4.699999999999999 },\n { angle: 109.1, amplitude: 4.699999999999999 },\n { angle: 109.4, amplitude: 4.8 },\n { angle: 109.5, amplitude: 4.8 },\n { angle: 109.9, amplitude: 4.9 },\n { angle: 110, amplitude: 5 },\n { angle: 110.5, amplitude: 5 },\n { angle: 111.1, amplitude: 5.1 },\n { angle: 111.6, amplitude: 5.2 },\n { angle: 112.8, amplitude: 5.300000000000001 },\n { angle: 113, amplitude: 5.300000000000001 },\n { angle: 113.3, amplitude: 5.4 },\n { angle: 113.4, amplitude: 5.4 },\n { angle: 113.5, amplitude: 5.5 },\n { angle: 114, amplitude: 5.6000000000000005 },\n { angle: 114.5, amplitude: 5.6000000000000005 },\n { angle: 115, amplitude: 5.8 },\n { angle: 115.4, amplitude: 5.8 },\n { angle: 115.8, amplitude: 5.8999999999999995 },\n { angle: 116.1, amplitude: 6 },\n { angle: 116.4, amplitude: 6.1 },\n { angle: 116.5, amplitude: 6.2 },\n { angle: 116.8, amplitude: 6.2 },\n { angle: 116.9, amplitude: 6.2 },\n { angle: 117, amplitude: 6.2 },\n { angle: 117.5, amplitude: 6.2 },\n { angle: 117.8, amplitude: 6.3 },\n { angle: 118.4, amplitude: 6.3 },\n { angle: 118.5, amplitude: 6.3 },\n { angle: 118.9, amplitude: 6.4 },\n { angle: 119, amplitude: 6.4 },\n { angle: 119.1, amplitude: 6.4 },\n { angle: 119.4, amplitude: 6.4 },\n { angle: 119.6, amplitude: 6.4 },\n { angle: 119.7, amplitude: 6.4 },\n { angle: 120, amplitude: 6.5 },\n { angle: 120.3, amplitude: 6.4 },\n { angle: 120.6, amplitude: 6.3 },\n { angle: 120.7, amplitude: 6.3 },\n { angle: 120.9, amplitude: 6.3 },\n { angle: 121.3, amplitude: 6.2 },\n { angle: 121.4, amplitude: 5.8999999999999995 },\n { angle: 121.5, amplitude: 5.8 },\n { angle: 121.7, amplitude: 5.8 },\n { angle: 122.1, amplitude: 5.5 },\n { angle: 122.6, amplitude: 5.300000000000001 },\n { angle: 122.7, amplitude: 5.300000000000001 },\n { angle: 122.9, amplitude: 5.300000000000001 },\n { angle: 123, amplitude: 5.2 },\n { angle: 123.5, amplitude: 5.1 },\n { angle: 123.6, amplitude: 5 },\n { angle: 123.8, amplitude: 5 },\n { angle: 124, amplitude: 5 },\n { angle: 124.3, amplitude: 4.9 },\n { angle: 124.5, amplitude: 4.9 },\n { angle: 124.7, amplitude: 4.8 },\n { angle: 125, amplitude: 4.8 },\n { angle: 125.4, amplitude: 4.699999999999999 },\n { angle: 126, amplitude: 4.5 },\n { angle: 126.6, amplitude: 4.5 },\n { angle: 126.9, amplitude: 4.4 },\n { angle: 127.2, amplitude: 4.3 },\n { angle: 127.5, amplitude: 4.3 },\n { angle: 127.6, amplitude: 4.2 },\n { angle: 128, amplitude: 4.2 },\n { angle: 128.1, amplitude: 4.1 },\n { angle: 128.3, amplitude: 4.1 },\n { angle: 128.6, amplitude: 4 },\n { angle: 129, amplitude: 4 },\n { angle: 129.3, amplitude: 4 },\n { angle: 129.8, amplitude: 3.9000000000000004 },\n { angle: 129.9, amplitude: 3.9000000000000004 },\n { angle: 130.5, amplitude: 3.9000000000000004 },\n { angle: 130.8, amplitude: 3.8 },\n { angle: 131.4, amplitude: 3.8 },\n { angle: 131.5, amplitude: 3.7 },\n { angle: 132.3, amplitude: 3.5999999999999996 },\n { angle: 132.8, amplitude: 3.5999999999999996 },\n { angle: 133.5, amplitude: 3.5 },\n { angle: 133.6, amplitude: 3.4000000000000004 },\n { angle: 134.5, amplitude: 3.3000000000000003 },\n { angle: 135.2, amplitude: 3.3000000000000003 },\n { angle: 135.4, amplitude: 3.3000000000000003 },\n { angle: 135.6, amplitude: 3.2 },\n { angle: 135.7, amplitude: 3.2 },\n { angle: 136.4, amplitude: 3.2 },\n { angle: 136.6, amplitude: 3.1 },\n { angle: 137.4, amplitude: 3.1 },\n { angle: 137.6, amplitude: 3.1 },\n { angle: 138.4, amplitude: 3.1 },\n { angle: 138.6, amplitude: 3 },\n { angle: 138.9, amplitude: 3.1 },\n { angle: 139.3, amplitude: 3.1 },\n { angle: 139.6, amplitude: 3.1 },\n { angle: 139.8, amplitude: 3.1 },\n { angle: 140.4, amplitude: 3.2 },\n { angle: 140.6, amplitude: 3.2 },\n { angle: 141.1, amplitude: 3.2 },\n { angle: 141.5, amplitude: 3.2 },\n { angle: 141.9, amplitude: 3.3000000000000003 },\n { angle: 142.1, amplitude: 3.3000000000000003 },\n { angle: 142.3, amplitude: 3.3000000000000003 },\n { angle: 142.7, amplitude: 3.3000000000000003 },\n { angle: 142.9, amplitude: 3.3000000000000003 },\n { angle: 143, amplitude: 3.3000000000000003 },\n { angle: 143.4, amplitude: 3.4000000000000004 },\n { angle: 143.8, amplitude: 3.4000000000000004 },\n { angle: 144.2, amplitude: 3.4000000000000004 },\n { angle: 144.3, amplitude: 3.5 },\n { angle: 145.4, amplitude: 3.5 },\n { angle: 149.1, amplitude: 3.7 },\n { angle: 151.8, amplitude: 3.9000000000000004 },\n { angle: 155.5, amplitude: 4.3 },\n { angle: 157.4, amplitude: 4.6000000000000005 },\n { angle: 157.5, amplitude: 4.6000000000000005 },\n { angle: 158, amplitude: 4.6000000000000005 },\n { angle: 158.4, amplitude: 4.699999999999999 },\n { angle: 158.5, amplitude: 4.699999999999999 },\n { angle: 159.4, amplitude: 4.699999999999999 },\n { angle: 159.8, amplitude: 4.8 },\n { angle: 160.9, amplitude: 4.9 },\n { angle: 161.4, amplitude: 5 },\n { angle: 162, amplitude: 5.1 },\n { angle: 163.3, amplitude: 5.2 },\n { angle: 164.4, amplitude: 5.4 },\n { angle: 166, amplitude: 5.6000000000000005 },\n { angle: 166.5, amplitude: 5.8 },\n { angle: 167, amplitude: 5.8 },\n { angle: 167.5, amplitude: 5.8999999999999995 },\n { angle: 168.2, amplitude: 6.1 },\n { angle: 169.2, amplitude: 6.2 },\n { angle: 169.5, amplitude: 6.3 },\n { angle: 169.7, amplitude: 6.4 },\n { angle: 170, amplitude: 6.5 },\n { angle: 170.6, amplitude: 6.6000000000000005 },\n { angle: 170.9, amplitude: 6.7 },\n { angle: 171.4, amplitude: 6.800000000000001 },\n { angle: 171.6, amplitude: 6.8999999999999995 },\n { angle: 171.7, amplitude: 6.8999999999999995 },\n { angle: 172.3, amplitude: 7 },\n { angle: 172.5, amplitude: 7.1 },\n { angle: 172.8, amplitude: 7.199999999999999 },\n { angle: 173.2, amplitude: 7.3 },\n { angle: 173.5, amplitude: 7.4 },\n { angle: 173.9, amplitude: 7.5 },\n { angle: 174.1, amplitude: 7.6 },\n { angle: 174.3, amplitude: 7.6 },\n { angle: 174.4, amplitude: 7.7 },\n { angle: 174.7, amplitude: 7.7 },\n { angle: 174.8, amplitude: 7.800000000000001 },\n { angle: 174.9, amplitude: 7.800000000000001 },\n { angle: 175, amplitude: 7.9 },\n { angle: 175.1, amplitude: 7.9 },\n { angle: 175.3, amplitude: 8 },\n { angle: 175.5, amplitude: 8.100000000000001 },\n { angle: 175.7, amplitude: 8.100000000000001 },\n { angle: 176, amplitude: 8.2 },\n { angle: 176.1, amplitude: 8.2 },\n { angle: 176.7, amplitude: 8.4 },\n { angle: 177.2, amplitude: 8.5 },\n { angle: 177.3, amplitude: 8.6 },\n { angle: 177.7, amplitude: 8.7 },\n { angle: 177.8, amplitude: 8.8 },\n { angle: 178, amplitude: 8.8 },\n { angle: 178.2, amplitude: 8.9 },\n { angle: 178.3, amplitude: 8.9 },\n { angle: 178.5, amplitude: 9 },\n { angle: 178.7, amplitude: 9 },\n { angle: 178.8, amplitude: 9.1 },\n { angle: 179, amplitude: 9.200000000000001 },\n { angle: 179.2, amplitude: 9.200000000000001 },\n { angle: 179.3, amplitude: 9.3 },\n { angle: 179.4, amplitude: 9.3 },\n { angle: 179.8, amplitude: 9.3 },\n { angle: 179.9, amplitude: 9.3 },\n { angle: 180.1, amplitude: 9.399999999999999 },\n { angle: 180.2, amplitude: 9.399999999999999 },\n { angle: 180.3, amplitude: 9.399999999999999 },\n { angle: 180.7, amplitude: 9.5 },\n { angle: 180.8, amplitude: 9.5 },\n { angle: 181.1, amplitude: 9.5 },\n { angle: 181.2, amplitude: 9.5 },\n { angle: 181.6, amplitude: 9.5 },\n { angle: 181.7, amplitude: 9.5 },\n { angle: 182, amplitude: 9.5 },\n { angle: 182.5, amplitude: 9.5 },\n { angle: 182.6, amplitude: 9.5 },\n { angle: 182.9, amplitude: 9.5 },\n { angle: 183.4, amplitude: 9.5 },\n { angle: 183.5, amplitude: 9.5 },\n { angle: 183.7, amplitude: 9.5 },\n { angle: 183.8, amplitude: 9.5 },\n { angle: 184.1, amplitude: 9.5 },\n { angle: 184.4, amplitude: 9.5 },\n { angle: 184.8, amplitude: 9.5 },\n { angle: 185.1, amplitude: 9.5 },\n { angle: 185.2, amplitude: 9.399999999999999 },\n { angle: 185.3, amplitude: 9.399999999999999 },\n { angle: 185.5, amplitude: 9.399999999999999 },\n { angle: 185.6, amplitude: 9.399999999999999 },\n { angle: 185.8, amplitude: 9.399999999999999 },\n { angle: 186, amplitude: 9.399999999999999 },\n { angle: 186.1, amplitude: 9.399999999999999 },\n { angle: 186.2, amplitude: 9.399999999999999 },\n { angle: 186.5, amplitude: 9.399999999999999 },\n { angle: 186.6, amplitude: 9.399999999999999 },\n { angle: 186.7, amplitude: 9.399999999999999 },\n { angle: 186.9, amplitude: 9.399999999999999 },\n { angle: 187.1, amplitude: 9.3 },\n { angle: 187.2, amplitude: 9.3 },\n { angle: 187.4, amplitude: 9.3 },\n { angle: 187.5, amplitude: 9.3 },\n { angle: 187.7, amplitude: 9.3 },\n { angle: 187.9, amplitude: 9.3 },\n { angle: 188, amplitude: 9.3 },\n { angle: 188.4, amplitude: 9.3 },\n { angle: 188.5, amplitude: 9.3 },\n { angle: 188.6, amplitude: 9.3 },\n { angle: 188.9, amplitude: 9.3 },\n { angle: 189, amplitude: 9.200000000000001 },\n { angle: 189.1, amplitude: 9.200000000000001 },\n { angle: 189.3, amplitude: 9.200000000000001 },\n { angle: 189.5, amplitude: 9.200000000000001 },\n { angle: 189.6, amplitude: 9.200000000000001 },\n { angle: 189.9, amplitude: 9.200000000000001 },\n { angle: 190, amplitude: 9.200000000000001 },\n { angle: 190.1, amplitude: 9.200000000000001 },\n { angle: 190.5, amplitude: 9.1 },\n { angle: 190.9, amplitude: 9.1 },\n { angle: 191.1, amplitude: 9.1 },\n { angle: 191.2, amplitude: 9.1 },\n { angle: 191.5, amplitude: 9 },\n { angle: 191.6, amplitude: 9 },\n { angle: 191.8, amplitude: 9 },\n { angle: 191.9, amplitude: 8.9 },\n { angle: 192.1, amplitude: 8.9 },\n { angle: 192.2, amplitude: 8.9 },\n { angle: 192.5, amplitude: 8.8 },\n { angle: 192.8, amplitude: 8.8 },\n { angle: 193, amplitude: 8.7 },\n { angle: 193.3, amplitude: 8.6 },\n { angle: 193.6, amplitude: 8.6 },\n { angle: 193.7, amplitude: 8.5 },\n { angle: 193.9, amplitude: 8.5 },\n { angle: 194.1, amplitude: 8.5 },\n { angle: 194.5, amplitude: 8.4 },\n { angle: 194.6, amplitude: 8.299999999999999 },\n { angle: 194.7, amplitude: 8.299999999999999 },\n { angle: 194.8, amplitude: 8.299999999999999 },\n { angle: 194.9, amplitude: 8.299999999999999 },\n { angle: 195, amplitude: 8.2 },\n { angle: 195.1, amplitude: 8.2 },\n { angle: 195.4, amplitude: 8.2 },\n { angle: 195.5, amplitude: 8.100000000000001 },\n { angle: 195.6, amplitude: 8.100000000000001 },\n { angle: 195.9, amplitude: 8 },\n { angle: 196, amplitude: 7.9 },\n { angle: 196.1, amplitude: 7.9 },\n { angle: 196.2, amplitude: 7.800000000000001 },\n { angle: 196.4, amplitude: 7.800000000000001 },\n { angle: 197, amplitude: 7.7 },\n { angle: 197.1, amplitude: 7.6 },\n { angle: 197.4, amplitude: 7.5 },\n { angle: 197.6, amplitude: 7.4 },\n { angle: 197.7, amplitude: 7.4 },\n { angle: 197.8, amplitude: 7.3 },\n { angle: 198, amplitude: 7.3 },\n { angle: 198.3, amplitude: 7.199999999999999 },\n { angle: 198.5, amplitude: 7.1 },\n { angle: 198.7, amplitude: 7 },\n { angle: 198.8, amplitude: 7 },\n { angle: 199.2, amplitude: 6.800000000000001 },\n { angle: 199.6, amplitude: 6.7 },\n { angle: 199.8, amplitude: 6.6000000000000005 },\n { angle: 199.9, amplitude: 6.6000000000000005 },\n { angle: 200, amplitude: 6.6000000000000005 },\n { angle: 200.1, amplitude: 6.5 },\n { angle: 200.3, amplitude: 6.5 },\n { angle: 200.5, amplitude: 6.4 },\n { angle: 200.7, amplitude: 6.3 },\n { angle: 200.8, amplitude: 6.3 },\n { angle: 201.1, amplitude: 6.2 },\n { angle: 201.3, amplitude: 6.2 },\n { angle: 201.5, amplitude: 6.1 },\n { angle: 201.9, amplitude: 6.1 },\n { angle: 202.3, amplitude: 6 },\n { angle: 202.8, amplitude: 5.8 },\n { angle: 203, amplitude: 5.8 },\n { angle: 203.3, amplitude: 5.699999999999999 },\n { angle: 203.6, amplitude: 5.699999999999999 },\n { angle: 204.3, amplitude: 5.5 },\n { angle: 205.2, amplitude: 5.300000000000001 },\n { angle: 205.6, amplitude: 5.2 },\n { angle: 205.9, amplitude: 5.2 },\n { angle: 206.4, amplitude: 5.1 },\n { angle: 206.8, amplitude: 5 },\n { angle: 207.1, amplitude: 5 },\n { angle: 207.7, amplitude: 4.9 },\n { angle: 207.9, amplitude: 4.8 },\n { angle: 208.4, amplitude: 4.8 },\n { angle: 208.8, amplitude: 4.699999999999999 },\n { angle: 209.2, amplitude: 4.6000000000000005 },\n { angle: 209.5, amplitude: 4.6000000000000005 },\n { angle: 210.4, amplitude: 4.5 },\n { angle: 211.1, amplitude: 4.4 },\n { angle: 211.6, amplitude: 4.3 },\n { angle: 212.7, amplitude: 4.2 },\n { angle: 213.5, amplitude: 4.1 },\n { angle: 213.8, amplitude: 4.1 },\n { angle: 214.1, amplitude: 4 },\n { angle: 214.3, amplitude: 4 },\n { angle: 214.7, amplitude: 4 },\n { angle: 215.2, amplitude: 4 },\n { angle: 215.9, amplitude: 3.9000000000000004 },\n { angle: 216.2, amplitude: 3.9000000000000004 },\n { angle: 217.7, amplitude: 3.7 },\n { angle: 219.1, amplitude: 3.5999999999999996 },\n { angle: 219.3, amplitude: 3.5999999999999996 },\n { angle: 219.9, amplitude: 3.5999999999999996 },\n { angle: 220.1, amplitude: 3.5 },\n { angle: 220.9, amplitude: 3.5 },\n { angle: 221.7, amplitude: 3.4000000000000004 },\n { angle: 222.3, amplitude: 3.4000000000000004 },\n { angle: 223.2, amplitude: 3.3000000000000003 },\n { angle: 223.4, amplitude: 3.3000000000000003 },\n { angle: 223.8, amplitude: 3.3000000000000003 },\n { angle: 224, amplitude: 3.3000000000000003 },\n { angle: 224.5, amplitude: 3.3000000000000003 },\n { angle: 224.7, amplitude: 3.3000000000000003 },\n { angle: 225.4, amplitude: 3.3000000000000003 },\n { angle: 226.4, amplitude: 3.2 },\n { angle: 227.6, amplitude: 3.1 },\n { angle: 228.3, amplitude: 3.1 },\n { angle: 228.6, amplitude: 3.1 },\n { angle: 229.1, amplitude: 3.1 },\n { angle: 229.4, amplitude: 3.1 },\n { angle: 230.7, amplitude: 3 },\n { angle: 231.8, amplitude: 3 },\n { angle: 234.8, amplitude: 2.8000000000000003 },\n { angle: 235.4, amplitude: 2.8000000000000003 },\n { angle: 236.3, amplitude: 2.8000000000000003 },\n { angle: 236.6, amplitude: 2.8000000000000003 },\n { angle: 237.3, amplitude: 2.8000000000000003 },\n { angle: 237.6, amplitude: 2.8000000000000003 },\n { angle: 239.9, amplitude: 2.7 },\n { angle: 240.2, amplitude: 2.6 },\n { angle: 240.9, amplitude: 2.6 },\n { angle: 241.6, amplitude: 2.6 },\n { angle: 242.5, amplitude: 2.6 },\n { angle: 243.5, amplitude: 2.5 },\n { angle: 243.9, amplitude: 2.5 },\n { angle: 244.6, amplitude: 2.4 },\n { angle: 245, amplitude: 2.4 },\n { angle: 246.1, amplitude: 2.4 },\n { angle: 246.3, amplitude: 2.3000000000000003 },\n { angle: 247.6, amplitude: 2.3000000000000003 },\n { angle: 248, amplitude: 2.3000000000000003 },\n { angle: 248.9, amplitude: 2.3000000000000003 },\n { angle: 249.6, amplitude: 2.3000000000000003 },\n { angle: 250.5, amplitude: 2.2 },\n { angle: 250.9, amplitude: 2.2 },\n { angle: 252.3, amplitude: 2.2 },\n { angle: 252.6, amplitude: 2.2 },\n { angle: 253.7, amplitude: 2.2 },\n { angle: 254.7, amplitude: 2.1 },\n { angle: 255.6, amplitude: 2.1 },\n { angle: 256.1, amplitude: 2.1 },\n { angle: 256.3, amplitude: 2.1 },\n { angle: 256.5, amplitude: 2.1 },\n { angle: 256.6, amplitude: 2.1 },\n { angle: 258.3, amplitude: 2.1 },\n { angle: 258.4, amplitude: 2.2 },\n { angle: 259.1, amplitude: 2.2 },\n { angle: 260.1, amplitude: 2.2 },\n { angle: 260.2, amplitude: 2.2 },\n { angle: 261.3, amplitude: 2.3000000000000003 },\n { angle: 262.5, amplitude: 2.3000000000000003 },\n { angle: 263, amplitude: 2.4 },\n { angle: 263.5, amplitude: 2.4 },\n { angle: 263.6, amplitude: 2.4 },\n { angle: 264.4, amplitude: 2.4 },\n { angle: 264.5, amplitude: 2.4 },\n { angle: 265.1, amplitude: 2.5 },\n { angle: 265.2, amplitude: 2.6 },\n { angle: 265.6, amplitude: 2.6 },\n { angle: 265.7, amplitude: 2.6 },\n { angle: 265.8, amplitude: 2.7 },\n { angle: 265.9, amplitude: 2.7 },\n { angle: 266.7, amplitude: 2.8000000000000003 },\n { angle: 267.2, amplitude: 2.8000000000000003 },\n { angle: 267.6, amplitude: 2.9 },\n { angle: 268.3, amplitude: 3 },\n { angle: 268.4, amplitude: 3 },\n { angle: 269.1, amplitude: 3.1 },\n { angle: 269.8, amplitude: 3.3000000000000003 },\n { angle: 270.4, amplitude: 3.5999999999999996 },\n { angle: 271, amplitude: 3.7 },\n { angle: 271.2, amplitude: 3.9000000000000004 },\n { angle: 271.9, amplitude: 4 },\n { angle: 272.1, amplitude: 4.1 },\n { angle: 272.4, amplitude: 4.1 },\n { angle: 272.8, amplitude: 4.2 },\n { angle: 273, amplitude: 4.3 },\n { angle: 273.2, amplitude: 4.4 },\n { angle: 273.7, amplitude: 4.6000000000000005 },\n { angle: 273.9, amplitude: 4.699999999999999 },\n { angle: 274.2, amplitude: 4.9 },\n { angle: 274.3, amplitude: 4.9 },\n { angle: 274.5, amplitude: 5 },\n { angle: 275.1, amplitude: 5 },\n { angle: 275.2, amplitude: 5.1 },\n { angle: 275.5, amplitude: 5.300000000000001 },\n { angle: 275.6, amplitude: 5.4 },\n { angle: 275.7, amplitude: 5.5 },\n { angle: 276, amplitude: 5.6000000000000005 },\n { angle: 276.1, amplitude: 5.6000000000000005 },\n { angle: 276.5, amplitude: 5.8 },\n { angle: 276.6, amplitude: 6 },\n { angle: 276.8, amplitude: 6.1 },\n { angle: 277, amplitude: 6.1 },\n { angle: 277.3, amplitude: 6.3 },\n { angle: 277.5, amplitude: 6.4 },\n { angle: 277.6, amplitude: 6.6000000000000005 },\n { angle: 277.7, amplitude: 6.7 },\n { angle: 278.1, amplitude: 6.800000000000001 },\n { angle: 278.4, amplitude: 7.199999999999999 },\n { angle: 278.5, amplitude: 7.4 },\n { angle: 278.7, amplitude: 7.5 },\n { angle: 278.9, amplitude: 7.5 },\n { angle: 279.1, amplitude: 7.9 },\n { angle: 279.2, amplitude: 7.9 },\n { angle: 279.4, amplitude: 8.100000000000001 },\n { angle: 279.6, amplitude: 8.5 },\n { angle: 279.8, amplitude: 8.6 },\n { angle: 280, amplitude: 8.9 },\n { angle: 280.3, amplitude: 9.1 },\n { angle: 280.5, amplitude: 9.3 },\n { angle: 280.6, amplitude: 9.399999999999999 },\n { angle: 280.7, amplitude: 9.5 },\n { angle: 280.8, amplitude: 9.6 },\n { angle: 280.9, amplitude: 9.7 },\n { angle: 281, amplitude: 10 },\n { angle: 281.1, amplitude: 10 },\n { angle: 281.2, amplitude: 10 },\n { angle: 281.3, amplitude: 10 },\n { angle: 281.4, amplitude: 10 },\n { angle: 281.6, amplitude: 10 },\n { angle: 281.7, amplitude: 10 },\n { angle: 281.8, amplitude: 10 },\n { angle: 282, amplitude: 10 },\n { angle: 282.1, amplitude: 10 },\n { angle: 282.4, amplitude: 10 },\n { angle: 282.5, amplitude: 10 },\n { angle: 282.7, amplitude: 10 },\n { angle: 282.8, amplitude: 10 },\n { angle: 282.9, amplitude: 10 },\n { angle: 283, amplitude: 10 },\n { angle: 283.3, amplitude: 10 },\n { angle: 283.4, amplitude: 10 },\n { angle: 283.6, amplitude: 10 },\n { angle: 283.8, amplitude: 10 },\n { angle: 284.1, amplitude: 10 },\n { angle: 284.2, amplitude: 10 },\n { angle: 284.3, amplitude: 10 },\n { angle: 284.5, amplitude: 10 },\n { angle: 284.6, amplitude: 10 },\n { angle: 284.7, amplitude: 10 },\n { angle: 284.9, amplitude: 10 },\n { angle: 285, amplitude: 10 },\n { angle: 285.2, amplitude: 10 },\n { angle: 285.4, amplitude: 10 },\n { angle: 285.5, amplitude: 10 },\n { angle: 285.6, amplitude: 10 },\n { angle: 285.8, amplitude: 10 },\n { angle: 286, amplitude: 10 },\n { angle: 286.1, amplitude: 10 },\n { angle: 286.3, amplitude: 10 },\n { angle: 286.4, amplitude: 10 },\n { angle: 286.5, amplitude: 10 },\n { angle: 286.8, amplitude: 10 },\n { angle: 286.9, amplitude: 10 },\n { angle: 287, amplitude: 10 },\n { angle: 287.2, amplitude: 10 },\n { angle: 287.3, amplitude: 10 },\n { angle: 287.4, amplitude: 10 },\n { angle: 287.6, amplitude: 10 },\n { angle: 287.7, amplitude: 10 },\n { angle: 287.8, amplitude: 10 },\n { angle: 287.9, amplitude: 10 },\n { angle: 288.1, amplitude: 10 },\n { angle: 288.2, amplitude: 10 },\n { angle: 288.3, amplitude: 10 },\n { angle: 288.5, amplitude: 10 },\n { angle: 288.6, amplitude: 10 },\n { angle: 288.7, amplitude: 10 },\n { angle: 288.9, amplitude: 10 },\n { angle: 289, amplitude: 10 },\n { angle: 289.1, amplitude: 10 },\n { angle: 289.2, amplitude: 10 },\n { angle: 289.4, amplitude: 10 },\n { angle: 289.5, amplitude: 10 },\n { angle: 289.8, amplitude: 10 },\n { angle: 290, amplitude: 10 },\n { angle: 290.2, amplitude: 10 },\n { angle: 290.4, amplitude: 10 },\n { angle: 290.5, amplitude: 10 },\n { angle: 290.7, amplitude: 10 },\n { angle: 290.8, amplitude: 10 },\n { angle: 290.9, amplitude: 10 },\n { angle: 291, amplitude: 10 },\n { angle: 291.1, amplitude: 10 },\n { angle: 291.2, amplitude: 10 },\n { angle: 291.3, amplitude: 10 },\n { angle: 291.6, amplitude: 10 },\n { angle: 292, amplitude: 10 },\n { angle: 292.1, amplitude: 10 },\n { angle: 292.3, amplitude: 10 },\n { angle: 292.4, amplitude: 10 },\n { angle: 292.6, amplitude: 10 },\n { angle: 292.8, amplitude: 10 },\n { angle: 293, amplitude: 10 },\n { angle: 293.2, amplitude: 10 },\n { angle: 293.3, amplitude: 10 },\n { angle: 293.4, amplitude: 10 },\n { angle: 293.7, amplitude: 10 },\n { angle: 294.1, amplitude: 10 },\n { angle: 294.2, amplitude: 10 },\n { angle: 294.5, amplitude: 10 },\n { angle: 294.6, amplitude: 10 },\n { angle: 294.8, amplitude: 10 },\n { angle: 295, amplitude: 10 },\n { angle: 295.3, amplitude: 10 },\n { angle: 295.6, amplitude: 10 },\n { angle: 295.8, amplitude: 10 },\n { angle: 296, amplitude: 10 },\n { angle: 296.2, amplitude: 10 },\n { angle: 296.5, amplitude: 10 },\n { angle: 296.7, amplitude: 10 },\n { angle: 297, amplitude: 10 },\n { angle: 297.1, amplitude: 10 },\n { angle: 297.3, amplitude: 10 },\n { angle: 297.4, amplitude: 10 },\n { angle: 297.5, amplitude: 10 },\n { angle: 297.6, amplitude: 10 },\n { angle: 297.8, amplitude: 10 },\n { angle: 297.9, amplitude: 10 },\n { angle: 298, amplitude: 10 },\n { angle: 298.2, amplitude: 10 },\n { angle: 298.4, amplitude: 10 },\n { angle: 298.5, amplitude: 10 },\n { angle: 298.7, amplitude: 10 },\n { angle: 298.8, amplitude: 10 },\n { angle: 299, amplitude: 10 },\n { angle: 299.3, amplitude: 10 },\n { angle: 299.4, amplitude: 10 },\n { angle: 299.6, amplitude: 10 },\n { angle: 299.7, amplitude: 10 },\n { angle: 299.8, amplitude: 10 },\n { angle: 300, amplitude: 10 },\n { angle: 300.1, amplitude: 10 },\n { angle: 300.3, amplitude: 10 },\n { angle: 300.5, amplitude: 10 },\n { angle: 301, amplitude: 10 },\n { angle: 301.2, amplitude: 10 },\n { angle: 301.3, amplitude: 10 },\n { angle: 301.6, amplitude: 10 },\n { angle: 301.7, amplitude: 10 },\n { angle: 301.8, amplitude: 10 },\n { angle: 301.9, amplitude: 10 },\n { angle: 302.2, amplitude: 10 },\n { angle: 302.6, amplitude: 10 },\n { angle: 302.8, amplitude: 10 },\n { angle: 303.2, amplitude: 10 },\n { angle: 303.3, amplitude: 10 },\n { angle: 303.6, amplitude: 10 },\n { angle: 303.7, amplitude: 10 },\n { angle: 304.1, amplitude: 10 },\n { angle: 304.2, amplitude: 10 },\n { angle: 304.3, amplitude: 10 },\n { angle: 304.5, amplitude: 10 },\n { angle: 304.7, amplitude: 10 },\n { angle: 305, amplitude: 10 },\n { angle: 305.3, amplitude: 10 },\n { angle: 305.4, amplitude: 10 },\n { angle: 305.5, amplitude: 10 },\n { angle: 305.8, amplitude: 10 },\n { angle: 306, amplitude: 10 },\n { angle: 306.2, amplitude: 10 },\n { angle: 306.3, amplitude: 10 },\n { angle: 306.4, amplitude: 10 },\n { angle: 306.6, amplitude: 10 },\n { angle: 306.7, amplitude: 10 },\n { angle: 306.8, amplitude: 10 },\n { angle: 307.1, amplitude: 10 },\n { angle: 307.2, amplitude: 10 },\n { angle: 307.3, amplitude: 10 },\n { angle: 307.5, amplitude: 10 },\n { angle: 307.7, amplitude: 10 },\n { angle: 307.8, amplitude: 10 },\n { angle: 308.1, amplitude: 10 },\n { angle: 308.3, amplitude: 10 },\n { angle: 308.5, amplitude: 10 },\n { angle: 308.6, amplitude: 10 },\n { angle: 308.7, amplitude: 10 },\n { angle: 309, amplitude: 10 },\n { angle: 309.2, amplitude: 10 },\n { angle: 309.5, amplitude: 10 },\n { angle: 309.6, amplitude: 10 },\n { angle: 309.7, amplitude: 10 },\n { angle: 309.8, amplitude: 10 },\n { angle: 310.2, amplitude: 10 },\n { angle: 310.3, amplitude: 10 },\n { angle: 310.4, amplitude: 10 },\n { angle: 310.6, amplitude: 10 },\n { angle: 310.8, amplitude: 10 },\n { angle: 310.9, amplitude: 10 },\n { angle: 311.2, amplitude: 10 },\n { angle: 311.6, amplitude: 10 },\n { angle: 311.8, amplitude: 10 },\n { angle: 312.1, amplitude: 10 },\n { angle: 312.2, amplitude: 10 },\n { angle: 312.3, amplitude: 10 },\n { angle: 312.5, amplitude: 10 },\n { angle: 312.6, amplitude: 10 },\n { angle: 312.7, amplitude: 10 },\n { angle: 312.8, amplitude: 10 },\n { angle: 313, amplitude: 10 },\n { angle: 313.2, amplitude: 10 },\n { angle: 313.4, amplitude: 10 },\n { angle: 313.6, amplitude: 10 },\n { angle: 313.7, amplitude: 10 },\n { angle: 313.9, amplitude: 10 },\n { angle: 314, amplitude: 10 },\n { angle: 314.2, amplitude: 10 },\n { angle: 314.3, amplitude: 10 },\n { angle: 314.5, amplitude: 10 },\n { angle: 314.7, amplitude: 10 },\n { angle: 315, amplitude: 10 },\n { angle: 315.1, amplitude: 10 },\n { angle: 315.2, amplitude: 10 },\n { angle: 315.3, amplitude: 10 },\n { angle: 315.4, amplitude: 10 },\n { angle: 315.5, amplitude: 10 },\n { angle: 315.6, amplitude: 10 },\n { angle: 315.7, amplitude: 9.8 },\n { angle: 315.9, amplitude: 6.1 },\n { angle: 316.1, amplitude: 5.8999999999999995 },\n { angle: 316.3, amplitude: 5.6000000000000005 },\n { angle: 316.4, amplitude: 5.4 },\n { angle: 316.6, amplitude: 5.1 },\n { angle: 317, amplitude: 4.9 },\n { angle: 317.2, amplitude: 3 },\n { angle: 317.5, amplitude: 2.9 },\n { angle: 317.9, amplitude: 2.8000000000000003 },\n { angle: 318.7, amplitude: 2.8000000000000003 },\n { angle: 318.9, amplitude: 2.7 },\n { angle: 319.8, amplitude: 2.6 },\n { angle: 320.2, amplitude: 2.6 },\n { angle: 320.6, amplitude: 2.5 },\n { angle: 320.7, amplitude: 2.5 },\n { angle: 321.4, amplitude: 2.5 },\n { angle: 322.8, amplitude: 2.4 },\n { angle: 323, amplitude: 2.3000000000000003 },\n { angle: 323.1, amplitude: 2.3000000000000003 },\n { angle: 323.7, amplitude: 2.2 },\n { angle: 323.9, amplitude: 2.2 },\n { angle: 325.1, amplitude: 2.2 },\n { angle: 326.2, amplitude: 2.1 },\n { angle: 326.9, amplitude: 2 },\n { angle: 327.4, amplitude: 1.9 },\n { angle: 327.9, amplitude: 1.9 },\n { angle: 328.8, amplitude: 1.9 },\n { angle: 329.6, amplitude: 2 },\n { angle: 329.9, amplitude: 2 },\n { angle: 330.2, amplitude: 2 },\n { angle: 330.7, amplitude: 2 },\n { angle: 331.7, amplitude: 2.1 },\n { angle: 331.9, amplitude: 2.1 },\n { angle: 332.6, amplitude: 2.2 },\n { angle: 333.1, amplitude: 2.2 },\n { angle: 333.7, amplitude: 2.2 },\n { angle: 334.5, amplitude: 2.3000000000000003 },\n { angle: 335.1, amplitude: 2.4 },\n { angle: 335.8, amplitude: 2.4 },\n { angle: 336.2, amplitude: 2.5 },\n { angle: 336.9, amplitude: 2.5 },\n { angle: 337.2, amplitude: 2.6 },\n { angle: 337.3, amplitude: 2.6 },\n { angle: 337.5, amplitude: 2.6 },\n { angle: 338, amplitude: 2.6 },\n { angle: 338.1, amplitude: 2.7 },\n { angle: 338.4, amplitude: 2.7 },\n { angle: 338.5, amplitude: 2.7 },\n { angle: 339, amplitude: 2.8000000000000003 },\n { angle: 339.1, amplitude: 2.8000000000000003 },\n { angle: 339.5, amplitude: 2.8000000000000003 },\n { angle: 339.6, amplitude: 2.9 },\n { angle: 339.8, amplitude: 2.9 },\n { angle: 340, amplitude: 2.9 },\n { angle: 340.1, amplitude: 2.9 },\n { angle: 340.3, amplitude: 2.9 },\n { angle: 340.4, amplitude: 3 },\n { angle: 340.7, amplitude: 3.1 },\n { angle: 341, amplitude: 3.2 },\n { angle: 341.2, amplitude: 3.2 },\n { angle: 341.6, amplitude: 3.3000000000000003 },\n { angle: 341.9, amplitude: 3.4000000000000004 },\n { angle: 342, amplitude: 3.5 },\n { angle: 342.1, amplitude: 3.5 },\n { angle: 342.2, amplitude: 3.5999999999999996 },\n { angle: 342.5, amplitude: 3.7 },\n { angle: 342.8, amplitude: 3.9000000000000004 },\n { angle: 343.1, amplitude: 3.9000000000000004 },\n { angle: 343.3, amplitude: 4 },\n { angle: 343.4, amplitude: 4.1 },\n { angle: 343.5, amplitude: 4.2 },\n { angle: 343.7, amplitude: 4.2 },\n { angle: 343.8, amplitude: 4.2 },\n { angle: 344, amplitude: 4.3 },\n { angle: 344.4, amplitude: 4.5 },\n { angle: 345, amplitude: 4.8 },\n { angle: 345.1, amplitude: 5 },\n { angle: 345.4, amplitude: 5.1 },\n { angle: 345.5, amplitude: 5.2 },\n { angle: 345.6, amplitude: 5.2 },\n { angle: 345.8, amplitude: 5.300000000000001 },\n { angle: 346, amplitude: 5.300000000000001 },\n { angle: 346.1, amplitude: 5.4 },\n { angle: 346.5, amplitude: 5.5 },\n { angle: 346.7, amplitude: 5.6000000000000005 },\n { angle: 346.8, amplitude: 5.6000000000000005 },\n { angle: 346.9, amplitude: 5.699999999999999 },\n { angle: 347, amplitude: 5.699999999999999 },\n { angle: 347.1, amplitude: 5.8 },\n { angle: 347.2, amplitude: 5.8 },\n { angle: 347.3, amplitude: 5.8999999999999995 },\n { angle: 347.5, amplitude: 6.1 },\n { angle: 347.7, amplitude: 6.1 },\n { angle: 348.1, amplitude: 6.3 },\n { angle: 348.2, amplitude: 6.4 },\n { angle: 348.3, amplitude: 6.4 },\n { angle: 348.4, amplitude: 6.5 },\n { angle: 348.5, amplitude: 6.6000000000000005 },\n { angle: 348.7, amplitude: 6.7 },\n { angle: 348.8, amplitude: 6.7 },\n { angle: 348.9, amplitude: 6.800000000000001 },\n { angle: 349, amplitude: 6.6000000000000005 },\n { angle: 349.1, amplitude: 6.6000000000000005 },\n { angle: 349.3, amplitude: 6.3 },\n { angle: 349.4, amplitude: 6 },\n { angle: 349.5, amplitude: 5.699999999999999 },\n { angle: 349.6, amplitude: 5.5 },\n { angle: 349.9, amplitude: 5.4 },\n { angle: 350, amplitude: 5.4 },\n { angle: 350.4, amplitude: 5.300000000000001 },\n { angle: 350.5, amplitude: 5.300000000000001 },\n { angle: 350.7, amplitude: 5.2 },\n { angle: 351, amplitude: 5.2 },\n { angle: 351.2, amplitude: 5.2 },\n { angle: 351.3, amplitude: 5.1 },\n { angle: 351.8, amplitude: 5 },\n { angle: 352, amplitude: 5 },\n { angle: 352.3, amplitude: 5 },\n { angle: 352.5, amplitude: 4.9 },\n { angle: 352.6, amplitude: 4.9 },\n { angle: 353.3, amplitude: 4.9 },\n { angle: 353.4, amplitude: 4.8 },\n { angle: 353.8, amplitude: 4.699999999999999 },\n { angle: 354, amplitude: 4.699999999999999 },\n { angle: 354.2, amplitude: 4.699999999999999 },\n { angle: 354.5, amplitude: 4.6000000000000005 },\n { angle: 354.8, amplitude: 4.6000000000000005 },\n { angle: 354.9, amplitude: 4.6000000000000005 },\n { angle: 355.3, amplitude: 4.5 },\n { angle: 355.6, amplitude: 4.5 },\n { angle: 355.8, amplitude: 4.4 },\n { angle: 356.2, amplitude: 4.4 },\n { angle: 356.4, amplitude: 4.3 },\n { angle: 356.6, amplitude: 4.3 },\n { angle: 357.1, amplitude: 4.2 },\n { angle: 357.3, amplitude: 4.2 },\n { angle: 357.5, amplitude: 4.1 },\n { angle: 358, amplitude: 4.1 },\n { angle: 358.3, amplitude: 4.1 },\n { angle: 358.5, amplitude: 4.1 },\n { angle: 359, amplitude: 4 },\n ],\n },\n {\n name: 'Below 100MHz',\n data: [\n { angle: 0, amplitude: 9.8 },\n { angle: 0.1, amplitude: 9.8 },\n { angle: 0.2, amplitude: 9.8 },\n { angle: 0.4, amplitude: 9.8 },\n { angle: 0.7, amplitude: 9.8 },\n { angle: 0.9, amplitude: 9.8 },\n { angle: 1, amplitude: 9.8 },\n { angle: 1.1, amplitude: 9.8 },\n { angle: 1.4, amplitude: 9.8 },\n { angle: 1.5, amplitude: 9.8 },\n { angle: 1.7, amplitude: 9.8 },\n { angle: 1.8, amplitude: 9.8 },\n { angle: 2.2, amplitude: 9.8 },\n { angle: 2.4, amplitude: 9.8 },\n { angle: 2.7, amplitude: 9.8 },\n { angle: 2.8, amplitude: 9.8 },\n { angle: 3.1, amplitude: 9.8 },\n { angle: 3.2, amplitude: 9.8 },\n { angle: 3.6, amplitude: 9.8 },\n { angle: 3.7, amplitude: 9.8 },\n { angle: 3.9, amplitude: 9.8 },\n { angle: 4, amplitude: 9.8 },\n { angle: 4.1, amplitude: 9.8 },\n { angle: 4.4, amplitude: 9.8 },\n { angle: 4.5, amplitude: 9.8 },\n { angle: 4.9, amplitude: 9.8 },\n { angle: 5, amplitude: 9.8 },\n { angle: 5.3, amplitude: 9.8 },\n { angle: 5.4, amplitude: 9.8 },\n { angle: 5.7, amplitude: 9.8 },\n { angle: 5.8, amplitude: 9.8 },\n { angle: 5.9, amplitude: 9.8 },\n { angle: 6.2, amplitude: 9.8 },\n { angle: 6.6, amplitude: 9.7 },\n { angle: 6.8, amplitude: 9.7 },\n { angle: 7, amplitude: 9.7 },\n { angle: 7.3, amplitude: 9.7 },\n { angle: 7.5, amplitude: 9.6 },\n { angle: 7.6, amplitude: 9.7 },\n { angle: 7.7, amplitude: 9.6 },\n { angle: 8.2, amplitude: 9.6 },\n { angle: 8.5, amplitude: 9.6 },\n { angle: 8.6, amplitude: 9.6 },\n { angle: 8.9, amplitude: 9.5 },\n { angle: 9.1, amplitude: 9.5 },\n { angle: 9.2, amplitude: 9.5 },\n { angle: 9.6, amplitude: 9.5 },\n { angle: 9.7, amplitude: 9.5 },\n { angle: 10.1, amplitude: 9.399999999999999 },\n { angle: 10.2, amplitude: 9.399999999999999 },\n { angle: 10.4, amplitude: 9.399999999999999 },\n { angle: 10.6, amplitude: 9.399999999999999 },\n { angle: 10.9, amplitude: 9.399999999999999 },\n { angle: 11, amplitude: 9.3 },\n { angle: 11.1, amplitude: 9.3 },\n { angle: 11.3, amplitude: 9.3 },\n { angle: 11.5, amplitude: 9.3 },\n { angle: 11.7, amplitude: 9.200000000000001 },\n { angle: 12, amplitude: 9.200000000000001 },\n { angle: 12.2, amplitude: 9.200000000000001 },\n { angle: 12.4, amplitude: 9.1 },\n { angle: 12.8, amplitude: 9.1 },\n { angle: 13.2, amplitude: 9.1 },\n { angle: 13.4, amplitude: 9.1 },\n { angle: 13.6, amplitude: 9 },\n { angle: 13.9, amplitude: 9 },\n { angle: 14, amplitude: 8.9 },\n { angle: 14.1, amplitude: 8.9 },\n { angle: 14.2, amplitude: 8.9 },\n { angle: 14.4, amplitude: 8.8 },\n { angle: 14.7, amplitude: 8.7 },\n { angle: 14.9, amplitude: 8.7 },\n { angle: 15.1, amplitude: 8.7 },\n { angle: 15.6, amplitude: 8.6 },\n { angle: 15.8, amplitude: 8.6 },\n { angle: 15.9, amplitude: 8.5 },\n { angle: 16.2, amplitude: 8.5 },\n { angle: 16.4, amplitude: 8.4 },\n { angle: 16.5, amplitude: 8.4 },\n { angle: 16.7, amplitude: 8.4 },\n { angle: 16.8, amplitude: 8.299999999999999 },\n { angle: 16.9, amplitude: 8.299999999999999 },\n { angle: 17.1, amplitude: 8.299999999999999 },\n { angle: 17.2, amplitude: 8.299999999999999 },\n { angle: 17.4, amplitude: 8.2 },\n { angle: 17.5, amplitude: 8.2 },\n { angle: 17.6, amplitude: 8.2 },\n { angle: 18.1, amplitude: 8.100000000000001 },\n { angle: 18.3, amplitude: 8 },\n { angle: 18.8, amplitude: 7.9 },\n { angle: 19.2, amplitude: 7.9 },\n { angle: 19.3, amplitude: 7.9 },\n { angle: 19.4, amplitude: 7.800000000000001 },\n { angle: 19.5, amplitude: 7.800000000000001 },\n { angle: 19.6, amplitude: 7.800000000000001 },\n { angle: 19.9, amplitude: 7.7 },\n { angle: 20, amplitude: 7.7 },\n { angle: 20.9, amplitude: 7.5 },\n { angle: 21, amplitude: 7.5 },\n { angle: 21.5, amplitude: 7.4 },\n { angle: 21.7, amplitude: 7.3 },\n { angle: 22.1, amplitude: 7.3 },\n { angle: 22.2, amplitude: 7.3 },\n { angle: 22.8, amplitude: 7.199999999999999 },\n { angle: 23, amplitude: 7.1 },\n { angle: 23.1, amplitude: 7.1 },\n { angle: 23.5, amplitude: 7 },\n { angle: 23.8, amplitude: 7 },\n { angle: 24.1, amplitude: 6.8999999999999995 },\n { angle: 24.3, amplitude: 6.8999999999999995 },\n { angle: 24.5, amplitude: 6.800000000000001 },\n { angle: 24.8, amplitude: 6.800000000000001 },\n { angle: 24.9, amplitude: 6.800000000000001 },\n { angle: 25.4, amplitude: 6.800000000000001 },\n { angle: 25.6, amplitude: 6.7 },\n { angle: 25.9, amplitude: 6.6000000000000005 },\n { angle: 26, amplitude: 6.6000000000000005 },\n { angle: 26.3, amplitude: 6.5 },\n { angle: 26.7, amplitude: 6.5 },\n { angle: 26.8, amplitude: 6.5 },\n { angle: 27.4, amplitude: 6.5 },\n { angle: 27.5, amplitude: 6.4 },\n { angle: 27.9, amplitude: 6.4 },\n { angle: 28, amplitude: 6.4 },\n { angle: 28.2, amplitude: 6.3 },\n { angle: 28.4, amplitude: 6.3 },\n { angle: 29.2, amplitude: 6.2 },\n { angle: 29.5, amplitude: 6.2 },\n { angle: 29.7, amplitude: 6.2 },\n { angle: 30.3, amplitude: 6.1 },\n { angle: 30.4, amplitude: 6.1 },\n { angle: 31.1, amplitude: 6 },\n { angle: 31.8, amplitude: 5.8999999999999995 },\n { angle: 32.2, amplitude: 5.8999999999999995 },\n { angle: 32.5, amplitude: 5.8 },\n { angle: 32.7, amplitude: 5.8 },\n { angle: 33.1, amplitude: 5.8 },\n { angle: 33.9, amplitude: 5.699999999999999 },\n { angle: 34.4, amplitude: 5.699999999999999 },\n { angle: 35.1, amplitude: 5.6000000000000005 },\n { angle: 36.2, amplitude: 5.5 },\n { angle: 36.8, amplitude: 5.5 },\n { angle: 37, amplitude: 5.5 },\n { angle: 37.5, amplitude: 5.4 },\n { angle: 37.9, amplitude: 5.4 },\n { angle: 38.1, amplitude: 5.4 },\n { angle: 38.5, amplitude: 5.4 },\n { angle: 38.9, amplitude: 5.4 },\n { angle: 39.4, amplitude: 5.4 },\n { angle: 39.6, amplitude: 5.4 },\n { angle: 39.9, amplitude: 5.4 },\n { angle: 40.2, amplitude: 5.300000000000001 },\n { angle: 40.5, amplitude: 5.4 },\n { angle: 40.6, amplitude: 5.4 },\n { angle: 41, amplitude: 5.300000000000001 },\n { angle: 41.3, amplitude: 5.300000000000001 },\n { angle: 41.6, amplitude: 5.4 },\n { angle: 42, amplitude: 5.300000000000001 },\n { angle: 42.1, amplitude: 5.300000000000001 },\n { angle: 42.8, amplitude: 5.300000000000001 },\n { angle: 43.3, amplitude: 5.300000000000001 },\n { angle: 43.8, amplitude: 5.300000000000001 },\n { angle: 44, amplitude: 5.300000000000001 },\n { angle: 44.8, amplitude: 5.300000000000001 },\n { angle: 45, amplitude: 5.300000000000001 },\n { angle: 45.2, amplitude: 5.300000000000001 },\n { angle: 45.7, amplitude: 5.2 },\n { angle: 45.8, amplitude: 5.2 },\n { angle: 46.2, amplitude: 5.2 },\n { angle: 46.5, amplitude: 5.2 },\n { angle: 46.7, amplitude: 5.2 },\n { angle: 47, amplitude: 5.2 },\n { angle: 47.4, amplitude: 5.2 },\n { angle: 47.8, amplitude: 5.2 },\n { angle: 48.1, amplitude: 5.2 },\n { angle: 48.4, amplitude: 5.300000000000001 },\n { angle: 48.5, amplitude: 5.2 },\n { angle: 49.1, amplitude: 5.300000000000001 },\n { angle: 49.2, amplitude: 5.2 },\n { angle: 49.5, amplitude: 5.300000000000001 },\n { angle: 49.7, amplitude: 5.300000000000001 },\n { angle: 49.8, amplitude: 5.300000000000001 },\n { angle: 50.2, amplitude: 5.300000000000001 },\n { angle: 50.6, amplitude: 5.300000000000001 },\n { angle: 50.9, amplitude: 5.300000000000001 },\n { angle: 51.2, amplitude: 5.300000000000001 },\n { angle: 51.9, amplitude: 5.300000000000001 },\n { angle: 52.1, amplitude: 5.300000000000001 },\n { angle: 52.4, amplitude: 5.300000000000001 },\n { angle: 52.9, amplitude: 5.300000000000001 },\n { angle: 53.1, amplitude: 5.300000000000001 },\n { angle: 53.5, amplitude: 5.300000000000001 },\n { angle: 53.7, amplitude: 5.300000000000001 },\n { angle: 53.8, amplitude: 5.300000000000001 },\n { angle: 54.3, amplitude: 5.300000000000001 },\n { angle: 54.7, amplitude: 5.300000000000001 },\n { angle: 54.8, amplitude: 5.300000000000001 },\n { angle: 55.2, amplitude: 5.2 },\n { angle: 55.3, amplitude: 5.2 },\n { angle: 55.6, amplitude: 5.2 },\n { angle: 55.9, amplitude: 5.2 },\n { angle: 56.6, amplitude: 5.2 },\n { angle: 56.8, amplitude: 5.2 },\n { angle: 57, amplitude: 5.2 },\n { angle: 57.3, amplitude: 5.1 },\n { angle: 57.5, amplitude: 5.1 },\n { angle: 57.7, amplitude: 5.1 },\n { angle: 58, amplitude: 5.1 },\n { angle: 58.4, amplitude: 5.1 },\n { angle: 58.6, amplitude: 5 },\n { angle: 58.7, amplitude: 5 },\n { angle: 58.9, amplitude: 4.9 },\n { angle: 59.2, amplitude: 4.8 },\n { angle: 59.5, amplitude: 3 },\n { angle: 59.8, amplitude: 3 },\n { angle: 59.9, amplitude: 2.9 },\n { angle: 60, amplitude: 2.9 },\n { angle: 60.3, amplitude: 2.9 },\n { angle: 60.5, amplitude: 2.8000000000000003 },\n { angle: 60.9, amplitude: 2.8000000000000003 },\n { angle: 61.2, amplitude: 2.8000000000000003 },\n { angle: 62.3, amplitude: 2.7 },\n { angle: 62.9, amplitude: 2.7 },\n { angle: 64.4, amplitude: 2.6 },\n { angle: 65.5, amplitude: 2.6 },\n { angle: 65.7, amplitude: 2.5 },\n { angle: 66.9, amplitude: 2.5 },\n { angle: 67.1, amplitude: 2.5 },\n { angle: 67.9, amplitude: 2.4 },\n { angle: 68.2, amplitude: 2.4 },\n { angle: 69.8, amplitude: 2.3000000000000003 },\n { angle: 71.5, amplitude: 2.3000000000000003 },\n { angle: 73.1, amplitude: 2.3000000000000003 },\n { angle: 74, amplitude: 2.3000000000000003 },\n { angle: 74.6, amplitude: 2.2 },\n { angle: 75.5, amplitude: 2.2 },\n { angle: 76, amplitude: 2.2 },\n { angle: 76.4, amplitude: 2.2 },\n { angle: 77.4, amplitude: 2.2 },\n { angle: 77.7, amplitude: 2.2 },\n { angle: 77.8, amplitude: 2.2 },\n { angle: 78.1, amplitude: 2.3000000000000003 },\n { angle: 78.2, amplitude: 2.3000000000000003 },\n { angle: 78.5, amplitude: 2.4 },\n { angle: 78.6, amplitude: 2.4 },\n { angle: 78.7, amplitude: 2.4 },\n { angle: 78.9, amplitude: 2.5 },\n { angle: 79.2, amplitude: 2.5 },\n { angle: 79.4, amplitude: 2.6 },\n { angle: 79.5, amplitude: 2.6 },\n { angle: 79.8, amplitude: 2.7 },\n { angle: 80, amplitude: 2.7 },\n { angle: 80.1, amplitude: 2.8000000000000003 },\n { angle: 80.3, amplitude: 2.8000000000000003 },\n { angle: 80.5, amplitude: 2.9 },\n { angle: 80.7, amplitude: 2.9 },\n { angle: 80.8, amplitude: 3 },\n { angle: 80.9, amplitude: 3 },\n { angle: 81, amplitude: 3 },\n { angle: 81.2, amplitude: 3.1 },\n { angle: 81.4, amplitude: 3.2 },\n { angle: 81.6, amplitude: 3.2 },\n { angle: 81.7, amplitude: 3.3000000000000003 },\n { angle: 81.8, amplitude: 3.3000000000000003 },\n { angle: 81.9, amplitude: 3.4000000000000004 },\n { angle: 82, amplitude: 3.4000000000000004 },\n { angle: 82.1, amplitude: 3.4000000000000004 },\n { angle: 82.2, amplitude: 3.5 },\n { angle: 82.3, amplitude: 3.5999999999999996 },\n { angle: 82.4, amplitude: 3.5999999999999996 },\n { angle: 82.6, amplitude: 3.7 },\n { angle: 82.7, amplitude: 3.7 },\n { angle: 82.8, amplitude: 3.8 },\n { angle: 82.9, amplitude: 3.8 },\n { angle: 83.3, amplitude: 3.9000000000000004 },\n { angle: 83.4, amplitude: 4 },\n { angle: 83.6, amplitude: 4.1 },\n { angle: 83.7, amplitude: 4.1 },\n { angle: 83.8, amplitude: 4.3 },\n { angle: 83.9, amplitude: 4.3 },\n { angle: 84, amplitude: 4.4 },\n { angle: 84.1, amplitude: 4.4 },\n { angle: 84.2, amplitude: 4.5 },\n { angle: 84.5, amplitude: 4.6000000000000005 },\n { angle: 85.1, amplitude: 4.699999999999999 },\n { angle: 85.2, amplitude: 4.8 },\n { angle: 85.4, amplitude: 4.8 },\n { angle: 85.5, amplitude: 4.9 },\n { angle: 85.8, amplitude: 5 },\n { angle: 85.9, amplitude: 5.1 },\n { angle: 86.6, amplitude: 5.2 },\n { angle: 86.8, amplitude: 5.2 },\n { angle: 86.9, amplitude: 5.300000000000001 },\n { angle: 87.3, amplitude: 5.5 },\n { angle: 87.4, amplitude: 5.5 },\n { angle: 87.6, amplitude: 5.6000000000000005 },\n { angle: 87.8, amplitude: 5.699999999999999 },\n { angle: 87.9, amplitude: 5.8 },\n { angle: 88.3, amplitude: 5.8999999999999995 },\n { angle: 88.4, amplitude: 6 },\n { angle: 88.6, amplitude: 6.1 },\n { angle: 89, amplitude: 6.2 },\n { angle: 89.2, amplitude: 6.3 },\n { angle: 89.7, amplitude: 6.5 },\n { angle: 89.9, amplitude: 6.6000000000000005 },\n { angle: 90, amplitude: 6.800000000000001 },\n { angle: 90.3, amplitude: 7 },\n { angle: 90.5, amplitude: 7 },\n { angle: 90.6, amplitude: 7.199999999999999 },\n { angle: 91, amplitude: 7.5 },\n { angle: 91.4, amplitude: 7.800000000000001 },\n { angle: 91.5, amplitude: 7.9 },\n { angle: 91.6, amplitude: 7.9 },\n { angle: 91.9, amplitude: 8 },\n { angle: 92, amplitude: 8.100000000000001 },\n { angle: 92.1, amplitude: 8.2 },\n { angle: 92.3, amplitude: 8.2 },\n { angle: 92.5, amplitude: 8.4 },\n { angle: 93, amplitude: 8.5 },\n { angle: 93.3, amplitude: 8.6 },\n { angle: 93.5, amplitude: 8.6 },\n { angle: 93.7, amplitude: 8.7 },\n { angle: 93.8, amplitude: 8.8 },\n { angle: 93.9, amplitude: 8.8 },\n { angle: 94.2, amplitude: 8.9 },\n { angle: 94.3, amplitude: 8.9 },\n { angle: 94.5, amplitude: 9 },\n { angle: 94.6, amplitude: 9 },\n { angle: 94.7, amplitude: 9 },\n { angle: 94.9, amplitude: 9.1 },\n { angle: 95, amplitude: 9.1 },\n { angle: 95.4, amplitude: 9.1 },\n { angle: 95.5, amplitude: 9.200000000000001 },\n { angle: 95.6, amplitude: 9.200000000000001 },\n { angle: 95.9, amplitude: 9.200000000000001 },\n { angle: 96, amplitude: 9.200000000000001 },\n { angle: 96.3, amplitude: 9.3 },\n { angle: 96.8, amplitude: 9.3 },\n { angle: 96.9, amplitude: 9.3 },\n { angle: 97.3, amplitude: 9.3 },\n { angle: 97.5, amplitude: 9.3 },\n { angle: 97.7, amplitude: 9.399999999999999 },\n { angle: 98.1, amplitude: 9.399999999999999 },\n { angle: 98.4, amplitude: 9.399999999999999 },\n { angle: 98.5, amplitude: 9.399999999999999 },\n { angle: 98.9, amplitude: 9.399999999999999 },\n { angle: 99.5, amplitude: 9.5 },\n { angle: 99.7, amplitude: 9.5 },\n { angle: 99.8, amplitude: 9.5 },\n { angle: 100.1, amplitude: 9.5 },\n { angle: 100.2, amplitude: 9.5 },\n { angle: 100.3, amplitude: 9.5 },\n { angle: 101, amplitude: 9.5 },\n { angle: 101.1, amplitude: 9.5 },\n { angle: 101.2, amplitude: 9.5 },\n { angle: 101.4, amplitude: 9.5 },\n { angle: 101.7, amplitude: 9.5 },\n { angle: 101.9, amplitude: 9.5 },\n { angle: 102, amplitude: 9.6 },\n { angle: 102.1, amplitude: 9.6 },\n { angle: 102.4, amplitude: 9.6 },\n { angle: 102.5, amplitude: 9.6 },\n { angle: 102.7, amplitude: 9.6 },\n { angle: 103, amplitude: 9.6 },\n { angle: 103.2, amplitude: 9.6 },\n { angle: 103.4, amplitude: 9.6 },\n { angle: 104.3, amplitude: 9.6 },\n { angle: 104.8, amplitude: 9.6 },\n { angle: 105, amplitude: 9.6 },\n { angle: 105.2, amplitude: 9.6 },\n { angle: 105.3, amplitude: 9.6 },\n { angle: 105.5, amplitude: 9.6 },\n { angle: 105.6, amplitude: 9.6 },\n { angle: 105.8, amplitude: 9.6 },\n { angle: 106.1, amplitude: 9.5 },\n { angle: 106.2, amplitude: 9.5 },\n { angle: 106.3, amplitude: 9.5 },\n { angle: 106.7, amplitude: 9.5 },\n { angle: 107.4, amplitude: 9.399999999999999 },\n { angle: 107.6, amplitude: 9.399999999999999 },\n { angle: 107.9, amplitude: 9.399999999999999 },\n { angle: 108.3, amplitude: 9.399999999999999 },\n { angle: 108.6, amplitude: 9.399999999999999 },\n { angle: 108.8, amplitude: 9.399999999999999 },\n { angle: 109.2, amplitude: 9.399999999999999 },\n { angle: 109.3, amplitude: 9.399999999999999 },\n { angle: 109.5, amplitude: 9.3 },\n { angle: 109.7, amplitude: 9.3 },\n { angle: 109.9, amplitude: 9.3 },\n { angle: 110, amplitude: 9.3 },\n { angle: 110.2, amplitude: 9.3 },\n { angle: 110.4, amplitude: 9.3 },\n { angle: 110.6, amplitude: 9.3 },\n { angle: 110.8, amplitude: 9.3 },\n { angle: 110.9, amplitude: 9.3 },\n { angle: 111.3, amplitude: 9.3 },\n { angle: 111.6, amplitude: 9.3 },\n { angle: 111.8, amplitude: 9.3 },\n { angle: 112, amplitude: 9.200000000000001 },\n { angle: 112.2, amplitude: 9.200000000000001 },\n { angle: 112.4, amplitude: 9.200000000000001 },\n { angle: 112.6, amplitude: 9.200000000000001 },\n { angle: 113, amplitude: 9.200000000000001 },\n { angle: 113.2, amplitude: 9.200000000000001 },\n { angle: 113.4, amplitude: 9.200000000000001 },\n { angle: 113.7, amplitude: 9.1 },\n { angle: 114, amplitude: 9.1 },\n { angle: 114.3, amplitude: 9.1 },\n { angle: 114.4, amplitude: 9.1 },\n { angle: 114.7, amplitude: 9.1 },\n { angle: 115.6, amplitude: 9 },\n { angle: 115.8, amplitude: 9 },\n { angle: 116.2, amplitude: 9 },\n { angle: 116.4, amplitude: 9 },\n { angle: 116.7, amplitude: 8.9 },\n { angle: 117, amplitude: 8.9 },\n { angle: 117.1, amplitude: 8.9 },\n { angle: 117.2, amplitude: 8.9 },\n { angle: 117.3, amplitude: 8.9 },\n { angle: 117.6, amplitude: 8.8 },\n { angle: 117.8, amplitude: 8.8 },\n { angle: 118.1, amplitude: 8.8 },\n { angle: 118.3, amplitude: 8.8 },\n { angle: 118.7, amplitude: 8.7 },\n { angle: 118.8, amplitude: 8.7 },\n { angle: 119.1, amplitude: 8.7 },\n { angle: 119.6, amplitude: 8.7 },\n { angle: 119.7, amplitude: 8.7 },\n { angle: 119.8, amplitude: 8.6 },\n { angle: 120.2, amplitude: 8.6 },\n { angle: 120.5, amplitude: 8.6 },\n { angle: 120.9, amplitude: 8.6 },\n { angle: 121.3, amplitude: 8.6 },\n { angle: 121.6, amplitude: 8.6 },\n { angle: 121.7, amplitude: 8.5 },\n { angle: 122.1, amplitude: 8.5 },\n { angle: 122.3, amplitude: 8.5 },\n { angle: 122.8, amplitude: 8.5 },\n { angle: 123, amplitude: 8.5 },\n { angle: 123.4, amplitude: 8.5 },\n { angle: 123.7, amplitude: 8.5 },\n { angle: 123.8, amplitude: 8.5 },\n { angle: 123.9, amplitude: 8.5 },\n { angle: 124.1, amplitude: 8.5 },\n { angle: 124.4, amplitude: 8.5 },\n { angle: 124.5, amplitude: 8.5 },\n { angle: 124.6, amplitude: 8.5 },\n { angle: 125, amplitude: 8.5 },\n { angle: 125.2, amplitude: 8.5 },\n { angle: 125.3, amplitude: 8.5 },\n { angle: 125.5, amplitude: 8.5 },\n { angle: 125.9, amplitude: 8.5 },\n { angle: 126.4, amplitude: 8.5 },\n { angle: 126.6, amplitude: 8.5 },\n { angle: 127.3, amplitude: 8.5 },\n { angle: 127.7, amplitude: 8.6 },\n { angle: 128.3, amplitude: 8.6 },\n { angle: 128.8, amplitude: 8.6 },\n { angle: 128.9, amplitude: 8.6 },\n { angle: 129.1, amplitude: 8.6 },\n { angle: 129.2, amplitude: 8.6 },\n { angle: 129.4, amplitude: 8.6 },\n { angle: 129.6, amplitude: 8.6 },\n { angle: 129.9, amplitude: 8.6 },\n { angle: 130.1, amplitude: 8.6 },\n { angle: 130.3, amplitude: 8.6 },\n { angle: 130.9, amplitude: 8.5 },\n { angle: 131.2, amplitude: 8.5 },\n { angle: 131.7, amplitude: 8.5 },\n { angle: 131.8, amplitude: 8.5 },\n { angle: 132.2, amplitude: 8.4 },\n { angle: 132.3, amplitude: 8.4 },\n { angle: 132.5, amplitude: 8.4 },\n { angle: 132.6, amplitude: 8.4 },\n { angle: 132.8, amplitude: 8.4 },\n { angle: 133, amplitude: 8.4 },\n { angle: 133.2, amplitude: 8.4 },\n { angle: 133.3, amplitude: 8.4 },\n { angle: 133.5, amplitude: 8.299999999999999 },\n { angle: 133.6, amplitude: 8.299999999999999 },\n { angle: 133.7, amplitude: 8.299999999999999 },\n { angle: 133.9, amplitude: 8.299999999999999 },\n { angle: 134, amplitude: 8.299999999999999 },\n { angle: 134.2, amplitude: 8.2 },\n { angle: 134.3, amplitude: 8.2 },\n { angle: 134.4, amplitude: 8.2 },\n { angle: 134.6, amplitude: 8.2 },\n { angle: 134.7, amplitude: 8.2 },\n { angle: 134.8, amplitude: 8.2 },\n { angle: 135, amplitude: 8.100000000000001 },\n { angle: 135.1, amplitude: 8.100000000000001 },\n { angle: 135.2, amplitude: 8 },\n { angle: 135.3, amplitude: 8 },\n { angle: 135.5, amplitude: 8 },\n { angle: 135.6, amplitude: 8 },\n { angle: 135.7, amplitude: 8 },\n { angle: 135.8, amplitude: 7.9 },\n { angle: 135.9, amplitude: 7.9 },\n { angle: 136, amplitude: 7.9 },\n { angle: 136.1, amplitude: 7.9 },\n { angle: 136.4, amplitude: 7.800000000000001 },\n { angle: 136.5, amplitude: 7.800000000000001 },\n { angle: 136.7, amplitude: 7.7 },\n { angle: 136.8, amplitude: 7.6 },\n { angle: 136.9, amplitude: 7.6 },\n { angle: 137.1, amplitude: 7.6 },\n { angle: 137.3, amplitude: 7.5 },\n { angle: 137.5, amplitude: 7.4 },\n { angle: 137.6, amplitude: 7.4 },\n { angle: 137.8, amplitude: 7.3 },\n { angle: 137.9, amplitude: 7.1 },\n { angle: 138, amplitude: 7.1 },\n { angle: 138.1, amplitude: 7 },\n { angle: 138.2, amplitude: 6.8999999999999995 },\n { angle: 138.3, amplitude: 6.800000000000001 },\n { angle: 138.5, amplitude: 6.800000000000001 },\n { angle: 138.7, amplitude: 6.7 },\n { angle: 138.8, amplitude: 6.7 },\n { angle: 139, amplitude: 6.6000000000000005 },\n { angle: 139.1, amplitude: 6.4 },\n { angle: 139.2, amplitude: 6.3 },\n { angle: 139.4, amplitude: 6.2 },\n { angle: 139.5, amplitude: 6.1 },\n { angle: 139.7, amplitude: 6 },\n { angle: 139.9, amplitude: 5.8999999999999995 },\n { angle: 140.1, amplitude: 5.8999999999999995 },\n { angle: 140.2, amplitude: 5.699999999999999 },\n { angle: 140.3, amplitude: 5.6000000000000005 },\n { angle: 140.4, amplitude: 5.5 },\n { angle: 140.5, amplitude: 5.5 },\n { angle: 140.6, amplitude: 5.4 },\n { angle: 140.8, amplitude: 5.4 },\n { angle: 141, amplitude: 5.300000000000001 },\n { angle: 141.1, amplitude: 4.9 },\n { angle: 141.2, amplitude: 4.699999999999999 },\n { angle: 141.5, amplitude: 4.6000000000000005 },\n { angle: 142, amplitude: 4.5 },\n { angle: 142.3, amplitude: 4.2 },\n { angle: 142.5, amplitude: 3.9000000000000004 },\n { angle: 142.6, amplitude: 3.8 },\n { angle: 142.8, amplitude: 3.7 },\n { angle: 142.9, amplitude: 3.5999999999999996 },\n { angle: 143.1, amplitude: 3.4000000000000004 },\n { angle: 143.2, amplitude: 3.3000000000000003 },\n { angle: 143.4, amplitude: 2.9 },\n { angle: 143.5, amplitude: 2.8000000000000003 },\n { angle: 143.8, amplitude: 2.8000000000000003 },\n { angle: 144.1, amplitude: 2.7 },\n { angle: 144.4, amplitude: 2.6 },\n { angle: 144.6, amplitude: 2.5 },\n { angle: 145.2, amplitude: 2.4 },\n { angle: 145.7, amplitude: 2.4 },\n { angle: 145.9, amplitude: 2.3000000000000003 },\n { angle: 146.1, amplitude: 2.3000000000000003 },\n { angle: 146.2, amplitude: 2.3000000000000003 },\n { angle: 146.5, amplitude: 2.2 },\n { angle: 146.6, amplitude: 2.2 },\n { angle: 146.7, amplitude: 2.2 },\n { angle: 147, amplitude: 2.1 },\n { angle: 147.4, amplitude: 2.1 },\n { angle: 147.6, amplitude: 2.1 },\n { angle: 148.9, amplitude: 2.1 },\n { angle: 149.2, amplitude: 2 },\n { angle: 149.6, amplitude: 2 },\n { angle: 150.1, amplitude: 2 },\n { angle: 150.8, amplitude: 1.9 },\n { angle: 151.2, amplitude: 1.9 },\n { angle: 152.7, amplitude: 1.7999999999999998 },\n { angle: 153.2, amplitude: 1.7999999999999998 },\n { angle: 153.5, amplitude: 1.7000000000000002 },\n { angle: 154.1, amplitude: 1.7000000000000002 },\n { angle: 155.2, amplitude: 1.7000000000000002 },\n { angle: 155.8, amplitude: 1.7000000000000002 },\n { angle: 156.8, amplitude: 1.6 },\n { angle: 157.4, amplitude: 1.6 },\n { angle: 158, amplitude: 1.6 },\n { angle: 159.2, amplitude: 1.6 },\n { angle: 159.6, amplitude: 1.6 },\n { angle: 160.2, amplitude: 1.6 },\n { angle: 161.5, amplitude: 1.6 },\n { angle: 162.2, amplitude: 1.5 },\n { angle: 162.8, amplitude: 1.5 },\n { angle: 163, amplitude: 1.6 },\n { angle: 165.3, amplitude: 1.6 },\n { angle: 165.5, amplitude: 1.6 },\n { angle: 165.7, amplitude: 1.6 },\n { angle: 166.1, amplitude: 1.7000000000000002 },\n { angle: 166.3, amplitude: 1.7000000000000002 },\n { angle: 166.7, amplitude: 1.7000000000000002 },\n { angle: 166.9, amplitude: 1.7999999999999998 },\n { angle: 167.3, amplitude: 1.7999999999999998 },\n { angle: 167.4, amplitude: 1.7999999999999998 },\n { angle: 167.8, amplitude: 1.9 },\n { angle: 167.9, amplitude: 1.9 },\n { angle: 168.1, amplitude: 1.9 },\n { angle: 168.2, amplitude: 2 },\n { angle: 168.3, amplitude: 2 },\n { angle: 168.5, amplitude: 2 },\n { angle: 168.6, amplitude: 2 },\n { angle: 168.7, amplitude: 2 },\n { angle: 168.9, amplitude: 2.1 },\n { angle: 169.1, amplitude: 2.1 },\n { angle: 169.5, amplitude: 4.8 },\n { angle: 169.6, amplitude: 4.8 },\n { angle: 170, amplitude: 4.9 },\n { angle: 170.2, amplitude: 4.9 },\n { angle: 170.7, amplitude: 4.9 },\n { angle: 170.8, amplitude: 4.9 },\n { angle: 171.2, amplitude: 4.9 },\n { angle: 171.7, amplitude: 5 },\n { angle: 171.8, amplitude: 5 },\n { angle: 172.2, amplitude: 5 },\n { angle: 172.3, amplitude: 5.1 },\n { angle: 172.7, amplitude: 5 },\n { angle: 173.2, amplitude: 5.1 },\n { angle: 173.7, amplitude: 5.2 },\n { angle: 173.9, amplitude: 5.1 },\n { angle: 174.1, amplitude: 5.2 },\n { angle: 174.6, amplitude: 5.2 },\n { angle: 174.8, amplitude: 5.300000000000001 },\n { angle: 175, amplitude: 5.300000000000001 },\n { angle: 175.4, amplitude: 5.300000000000001 },\n { angle: 175.6, amplitude: 5.300000000000001 },\n { angle: 175.8, amplitude: 5.300000000000001 },\n { angle: 176.5, amplitude: 5.300000000000001 },\n { angle: 176.7, amplitude: 5.300000000000001 },\n { angle: 177.1, amplitude: 5.300000000000001 },\n { angle: 177.3, amplitude: 5.300000000000001 },\n { angle: 177.9, amplitude: 5.300000000000001 },\n { angle: 178.1, amplitude: 5.300000000000001 },\n { angle: 178.3, amplitude: 5.300000000000001 },\n { angle: 178.7, amplitude: 5.300000000000001 },\n { angle: 179.1, amplitude: 5.300000000000001 },\n { angle: 179.5, amplitude: 5.300000000000001 },\n { angle: 179.9, amplitude: 5.300000000000001 },\n { angle: 180.2, amplitude: 5.300000000000001 },\n { angle: 180.4, amplitude: 5.300000000000001 },\n { angle: 180.6, amplitude: 5.300000000000001 },\n { angle: 181, amplitude: 5.300000000000001 },\n { angle: 181.2, amplitude: 5.300000000000001 },\n { angle: 181.4, amplitude: 5.300000000000001 },\n { angle: 181.8, amplitude: 5.300000000000001 },\n { angle: 182, amplitude: 5.300000000000001 },\n { angle: 182.2, amplitude: 5.300000000000001 },\n { angle: 182.6, amplitude: 5.300000000000001 },\n { angle: 183, amplitude: 5.300000000000001 },\n { angle: 183.4, amplitude: 5.300000000000001 },\n { angle: 183.5, amplitude: 5.300000000000001 },\n { angle: 183.7, amplitude: 5.2 },\n { angle: 184.4, amplitude: 5.2 },\n { angle: 184.6, amplitude: 5.1 },\n { angle: 184.7, amplitude: 5.1 },\n { angle: 185, amplitude: 5 },\n { angle: 185.4, amplitude: 5 },\n { angle: 185.5, amplitude: 4.9 },\n { angle: 185.7, amplitude: 4.9 },\n { angle: 185.8, amplitude: 4.8 },\n { angle: 186, amplitude: 4.9 },\n { angle: 186.5, amplitude: 4.8 },\n { angle: 186.6, amplitude: 4.699999999999999 },\n { angle: 186.7, amplitude: 4.699999999999999 },\n { angle: 186.8, amplitude: 4.6000000000000005 },\n { angle: 186.9, amplitude: 4.5 },\n { angle: 187.2, amplitude: 4.5 },\n { angle: 187.5, amplitude: 4.4 },\n { angle: 187.6, amplitude: 4.4 },\n { angle: 188.1, amplitude: 4.4 },\n { angle: 188.5, amplitude: 4.3 },\n { angle: 188.6, amplitude: 4.3 },\n { angle: 188.7, amplitude: 4.2 },\n { angle: 189.6, amplitude: 4.1 },\n { angle: 189.9, amplitude: 4.1 },\n { angle: 190.2, amplitude: 4 },\n { angle: 190.4, amplitude: 3.9000000000000004 },\n { angle: 190.7, amplitude: 3.9000000000000004 },\n { angle: 190.9, amplitude: 3.8 },\n { angle: 191.7, amplitude: 3.8 },\n { angle: 191.8, amplitude: 3.8 },\n { angle: 191.9, amplitude: 3.7 },\n { angle: 192.3, amplitude: 3.7 },\n { angle: 192.7, amplitude: 3.7 },\n { angle: 192.8, amplitude: 3.5999999999999996 },\n { angle: 193, amplitude: 3.5999999999999996 },\n { angle: 193.2, amplitude: 3.5 },\n { angle: 193.4, amplitude: 3.5 },\n { angle: 193.6, amplitude: 3.4000000000000004 },\n { angle: 194.5, amplitude: 3.4000000000000004 },\n { angle: 195.2, amplitude: 3.3000000000000003 },\n { angle: 195.5, amplitude: 3.2 },\n { angle: 195.9, amplitude: 3.2 },\n { angle: 196.1, amplitude: 3.2 },\n { angle: 196.5, amplitude: 3.1 },\n { angle: 196.6, amplitude: 3.1 },\n { angle: 196.9, amplitude: 3 },\n { angle: 197, amplitude: 3 },\n { angle: 197.4, amplitude: 2.9 },\n { angle: 198.2, amplitude: 2.9 },\n { angle: 198.5, amplitude: 2.9 },\n { angle: 198.9, amplitude: 2.8000000000000003 },\n { angle: 199, amplitude: 2.8000000000000003 },\n { angle: 199.5, amplitude: 2.8000000000000003 },\n { angle: 199.7, amplitude: 2.8000000000000003 },\n { angle: 199.9, amplitude: 2.7 },\n { angle: 200, amplitude: 2.7 },\n { angle: 200.3, amplitude: 2.7 },\n { angle: 200.6, amplitude: 2.7 },\n { angle: 200.8, amplitude: 2.7 },\n { angle: 200.9, amplitude: 2.7 },\n { angle: 201.2, amplitude: 2.6 },\n { angle: 201.9, amplitude: 2.6 },\n { angle: 202.3, amplitude: 2.7 },\n { angle: 202.7, amplitude: 2.7 },\n { angle: 203.4, amplitude: 2.7 },\n { angle: 203.8, amplitude: 2.7 },\n { angle: 204.9, amplitude: 2.8000000000000003 },\n { angle: 205.6, amplitude: 2.8000000000000003 },\n { angle: 205.8, amplitude: 2.9 },\n { angle: 206.9, amplitude: 2.9 },\n { angle: 207.2, amplitude: 3 },\n { angle: 207.4, amplitude: 3 },\n { angle: 207.5, amplitude: 3 },\n { angle: 207.8, amplitude: 3.1 },\n { angle: 208, amplitude: 3.1 },\n { angle: 208.4, amplitude: 3.2 },\n { angle: 208.5, amplitude: 3.2 },\n { angle: 208.8, amplitude: 3.3000000000000003 },\n { angle: 208.9, amplitude: 3.3000000000000003 },\n { angle: 209.2, amplitude: 3.3000000000000003 },\n { angle: 209.3, amplitude: 3.5 },\n { angle: 209.4, amplitude: 3.5999999999999996 },\n { angle: 209.7, amplitude: 3.5999999999999996 },\n { angle: 209.9, amplitude: 3.8 },\n { angle: 210, amplitude: 3.9000000000000004 },\n { angle: 210.1, amplitude: 4.3 },\n { angle: 210.2, amplitude: 4.4 },\n { angle: 210.5, amplitude: 4.5 },\n { angle: 210.6, amplitude: 4.5 },\n { angle: 210.7, amplitude: 4.6000000000000005 },\n { angle: 210.8, amplitude: 4.8 },\n { angle: 211.2, amplitude: 4.9 },\n { angle: 211.4, amplitude: 5 },\n { angle: 211.7, amplitude: 5.2 },\n { angle: 212, amplitude: 5.2 },\n { angle: 212.1, amplitude: 5.2 },\n { angle: 212.5, amplitude: 5.300000000000001 },\n { angle: 212.6, amplitude: 5.4 },\n { angle: 212.8, amplitude: 5.5 },\n { angle: 212.9, amplitude: 5.6000000000000005 },\n { angle: 213, amplitude: 5.6000000000000005 },\n { angle: 213.4, amplitude: 5.699999999999999 },\n { angle: 213.5, amplitude: 5.8999999999999995 },\n { angle: 213.7, amplitude: 6 },\n { angle: 213.8, amplitude: 6 },\n { angle: 214, amplitude: 6 },\n { angle: 214.1, amplitude: 6.1 },\n { angle: 214.5, amplitude: 6.2 },\n { angle: 214.7, amplitude: 6.3 },\n { angle: 214.8, amplitude: 6.4 },\n { angle: 215, amplitude: 6.5 },\n { angle: 215.1, amplitude: 6.6000000000000005 },\n { angle: 215.3, amplitude: 6.7 },\n { angle: 215.4, amplitude: 6.800000000000001 },\n { angle: 215.5, amplitude: 6.800000000000001 },\n { angle: 215.7, amplitude: 6.8999999999999995 },\n { angle: 215.8, amplitude: 7 },\n { angle: 215.9, amplitude: 7.1 },\n { angle: 216.1, amplitude: 7.1 },\n { angle: 216.3, amplitude: 7.199999999999999 },\n { angle: 216.4, amplitude: 7.199999999999999 },\n { angle: 216.6, amplitude: 7.3 },\n { angle: 216.7, amplitude: 7.4 },\n { angle: 216.9, amplitude: 7.4 },\n { angle: 217.1, amplitude: 7.4 },\n { angle: 217.3, amplitude: 7.5 },\n { angle: 217.5, amplitude: 7.6 },\n { angle: 217.6, amplitude: 7.800000000000001 },\n { angle: 217.7, amplitude: 7.800000000000001 },\n { angle: 217.8, amplitude: 7.800000000000001 },\n { angle: 218, amplitude: 8.299999999999999 },\n { angle: 218.2, amplitude: 8.5 },\n { angle: 218.3, amplitude: 8.6 },\n { angle: 218.4, amplitude: 8.7 },\n { angle: 218.5, amplitude: 8.7 },\n { angle: 218.6, amplitude: 8.8 },\n { angle: 218.7, amplitude: 9.200000000000001 },\n { angle: 218.9, amplitude: 9.3 },\n { angle: 219, amplitude: 9.3 },\n { angle: 219.1, amplitude: 9.399999999999999 },\n { angle: 219.3, amplitude: 9.5 },\n { angle: 219.4, amplitude: 9.5 },\n { angle: 219.5, amplitude: 9.5 },\n { angle: 219.7, amplitude: 9.5 },\n { angle: 219.8, amplitude: 9.7 },\n { angle: 219.9, amplitude: 9.7 },\n { angle: 220.1, amplitude: 9.7 },\n { angle: 220.2, amplitude: 9.7 },\n { angle: 220.4, amplitude: 9.7 },\n { angle: 220.5, amplitude: 9.8 },\n { angle: 220.6, amplitude: 9.8 },\n { angle: 220.7, amplitude: 9.8 },\n { angle: 220.8, amplitude: 9.8 },\n { angle: 220.9, amplitude: 9.8 },\n { angle: 221.1, amplitude: 9.8 },\n { angle: 221.2, amplitude: 9.9 },\n { angle: 221.5, amplitude: 9.9 },\n { angle: 221.7, amplitude: 9.9 },\n { angle: 222.1, amplitude: 9.9 },\n { angle: 222.2, amplitude: 9.9 },\n { angle: 222.5, amplitude: 9.9 },\n { angle: 222.7, amplitude: 9.9 },\n { angle: 222.8, amplitude: 9.9 },\n { angle: 223.1, amplitude: 9.9 },\n { angle: 223.3, amplitude: 9.9 },\n { angle: 223.4, amplitude: 9.9 },\n { angle: 223.6, amplitude: 9.8 },\n { angle: 223.7, amplitude: 9.8 },\n { angle: 224, amplitude: 9.8 },\n { angle: 224.2, amplitude: 9.8 },\n { angle: 224.3, amplitude: 9.8 },\n { angle: 224.4, amplitude: 9.8 },\n { angle: 224.6, amplitude: 9.7 },\n { angle: 224.7, amplitude: 9.7 },\n { angle: 224.8, amplitude: 9.7 },\n { angle: 224.9, amplitude: 9.7 },\n { angle: 225, amplitude: 9.7 },\n { angle: 225.1, amplitude: 9.7 },\n { angle: 225.5, amplitude: 9.6 },\n { angle: 225.8, amplitude: 9.6 },\n { angle: 226.2, amplitude: 9.5 },\n { angle: 226.3, amplitude: 9.5 },\n { angle: 226.5, amplitude: 9.5 },\n { angle: 226.9, amplitude: 9.5 },\n { angle: 227, amplitude: 9.399999999999999 },\n { angle: 227.1, amplitude: 9.399999999999999 },\n { angle: 227.3, amplitude: 9.399999999999999 },\n { angle: 227.4, amplitude: 9.399999999999999 },\n { angle: 227.7, amplitude: 9.399999999999999 },\n { angle: 228, amplitude: 9.399999999999999 },\n { angle: 228.1, amplitude: 9.399999999999999 },\n { angle: 228.4, amplitude: 9.399999999999999 },\n { angle: 228.6, amplitude: 9.399999999999999 },\n { angle: 228.7, amplitude: 9.399999999999999 },\n { angle: 228.9, amplitude: 9.5 },\n { angle: 229, amplitude: 9.5 },\n { angle: 229.1, amplitude: 9.5 },\n { angle: 229.5, amplitude: 9.5 },\n { angle: 229.9, amplitude: 9.399999999999999 },\n { angle: 230.1, amplitude: 9.399999999999999 },\n { angle: 230.4, amplitude: 9.399999999999999 },\n { angle: 230.6, amplitude: 9.399999999999999 },\n { angle: 230.7, amplitude: 9.399999999999999 },\n { angle: 231, amplitude: 9.3 },\n { angle: 231.1, amplitude: 9.3 },\n { angle: 231.3, amplitude: 9.3 },\n { angle: 231.5, amplitude: 9.3 },\n { angle: 231.6, amplitude: 9.3 },\n { angle: 231.7, amplitude: 9.3 },\n { angle: 231.9, amplitude: 9.3 },\n { angle: 232, amplitude: 9.200000000000001 },\n { angle: 232.2, amplitude: 9.200000000000001 },\n { angle: 232.6, amplitude: 9.200000000000001 },\n { angle: 232.8, amplitude: 9.1 },\n { angle: 233, amplitude: 9.1 },\n { angle: 233.5, amplitude: 9.1 },\n { angle: 233.6, amplitude: 9 },\n { angle: 233.8, amplitude: 8.9 },\n { angle: 234.2, amplitude: 8.9 },\n { angle: 234.6, amplitude: 8.7 },\n { angle: 234.8, amplitude: 8.6 },\n { angle: 234.9, amplitude: 8.6 },\n { angle: 235.1, amplitude: 8.5 },\n { angle: 235.3, amplitude: 8.5 },\n { angle: 235.7, amplitude: 8.4 },\n { angle: 235.9, amplitude: 8.299999999999999 },\n { angle: 236, amplitude: 8.299999999999999 },\n { angle: 236.1, amplitude: 8.299999999999999 },\n { angle: 236.3, amplitude: 8.2 },\n { angle: 236.7, amplitude: 8.100000000000001 },\n { angle: 236.8, amplitude: 8.100000000000001 },\n { angle: 237, amplitude: 8 },\n { angle: 237.1, amplitude: 8 },\n { angle: 237.5, amplitude: 8 },\n { angle: 237.7, amplitude: 7.9 },\n { angle: 237.8, amplitude: 7.9 },\n { angle: 238.2, amplitude: 7.9 },\n { angle: 238.3, amplitude: 7.9 },\n { angle: 238.6, amplitude: 7.9 },\n { angle: 238.8, amplitude: 7.800000000000001 },\n { angle: 238.9, amplitude: 7.800000000000001 },\n { angle: 239.1, amplitude: 7.800000000000001 },\n { angle: 239.2, amplitude: 7.800000000000001 },\n { angle: 239.6, amplitude: 7.800000000000001 },\n { angle: 239.7, amplitude: 7.800000000000001 },\n { angle: 240.2, amplitude: 7.7 },\n { angle: 240.3, amplitude: 7.7 },\n { angle: 240.5, amplitude: 7.7 },\n { angle: 240.8, amplitude: 7.7 },\n { angle: 241.2, amplitude: 7.7 },\n { angle: 241.4, amplitude: 7.7 },\n { angle: 241.8, amplitude: 7.7 },\n { angle: 242, amplitude: 7.7 },\n { angle: 242.1, amplitude: 7.7 },\n { angle: 242.3, amplitude: 7.7 },\n { angle: 242.6, amplitude: 7.7 },\n { angle: 242.7, amplitude: 7.7 },\n { angle: 243, amplitude: 7.7 },\n { angle: 243.2, amplitude: 7.7 },\n { angle: 243.3, amplitude: 7.7 },\n { angle: 243.4, amplitude: 7.800000000000001 },\n { angle: 243.7, amplitude: 7.800000000000001 },\n { angle: 244.1, amplitude: 7.800000000000001 },\n { angle: 244.4, amplitude: 7.800000000000001 },\n { angle: 244.7, amplitude: 7.800000000000001 },\n { angle: 244.9, amplitude: 7.9 },\n { angle: 245, amplitude: 7.9 },\n { angle: 245.1, amplitude: 7.9 },\n { angle: 245.4, amplitude: 8 },\n { angle: 245.8, amplitude: 8 },\n { angle: 245.9, amplitude: 8 },\n { angle: 246.1, amplitude: 8 },\n { angle: 246.3, amplitude: 8.100000000000001 },\n { angle: 246.4, amplitude: 8.100000000000001 },\n { angle: 246.5, amplitude: 8.100000000000001 },\n { angle: 247, amplitude: 8.2 },\n { angle: 247.2, amplitude: 8.2 },\n { angle: 247.3, amplitude: 8.2 },\n { angle: 247.4, amplitude: 8.2 },\n { angle: 247.8, amplitude: 8.299999999999999 },\n { angle: 248, amplitude: 8.4 },\n { angle: 248.4, amplitude: 8.4 },\n { angle: 248.5, amplitude: 8.4 },\n { angle: 248.6, amplitude: 8.5 },\n { angle: 248.9, amplitude: 8.5 },\n { angle: 249, amplitude: 8.5 },\n { angle: 249.3, amplitude: 8.6 },\n { angle: 249.4, amplitude: 8.6 },\n { angle: 249.7, amplitude: 8.7 },\n { angle: 249.9, amplitude: 8.7 },\n { angle: 250, amplitude: 8.7 },\n { angle: 250.1, amplitude: 8.7 },\n { angle: 250.2, amplitude: 8.8 },\n { angle: 250.3, amplitude: 8.8 },\n { angle: 250.5, amplitude: 8.9 },\n { angle: 250.7, amplitude: 8.9 },\n { angle: 251, amplitude: 8.9 },\n { angle: 251.1, amplitude: 9 },\n { angle: 251.3, amplitude: 9 },\n { angle: 251.4, amplitude: 9 },\n { angle: 251.5, amplitude: 9.1 },\n { angle: 251.6, amplitude: 9.1 },\n { angle: 251.7, amplitude: 9.200000000000001 },\n { angle: 252.1, amplitude: 9.200000000000001 },\n { angle: 252.2, amplitude: 9.200000000000001 },\n { angle: 252.4, amplitude: 9.3 },\n { angle: 252.6, amplitude: 9.399999999999999 },\n { angle: 252.7, amplitude: 9.399999999999999 },\n { angle: 252.9, amplitude: 9.399999999999999 },\n { angle: 253.1, amplitude: 9.399999999999999 },\n { angle: 253.2, amplitude: 9.5 },\n { angle: 253.4, amplitude: 9.5 },\n { angle: 253.6, amplitude: 9.5 },\n { angle: 253.8, amplitude: 9.5 },\n { angle: 253.9, amplitude: 9.5 },\n { angle: 254.2, amplitude: 9.6 },\n { angle: 254.3, amplitude: 9.6 },\n { angle: 254.6, amplitude: 9.6 },\n { angle: 254.7, amplitude: 9.6 },\n { angle: 255.3, amplitude: 9.6 },\n { angle: 255.7, amplitude: 9.6 },\n { angle: 256, amplitude: 9.6 },\n { angle: 256.1, amplitude: 9.6 },\n { angle: 256.2, amplitude: 9.6 },\n { angle: 256.4, amplitude: 9.6 },\n { angle: 256.7, amplitude: 9.5 },\n { angle: 256.9, amplitude: 9.5 },\n { angle: 257.2, amplitude: 9.399999999999999 },\n { angle: 257.3, amplitude: 9.3 },\n { angle: 257.4, amplitude: 9.200000000000001 },\n { angle: 257.5, amplitude: 9.200000000000001 },\n { angle: 257.7, amplitude: 9.1 },\n { angle: 257.9, amplitude: 8.9 },\n { angle: 258, amplitude: 8.9 },\n { angle: 258.2, amplitude: 8.8 },\n { angle: 258.3, amplitude: 8.7 },\n { angle: 258.5, amplitude: 8.7 },\n { angle: 258.7, amplitude: 8.6 },\n { angle: 258.9, amplitude: 8.5 },\n { angle: 259.1, amplitude: 8.5 },\n { angle: 259.3, amplitude: 8.4 },\n { angle: 259.4, amplitude: 8.299999999999999 },\n { angle: 259.5, amplitude: 8.299999999999999 },\n { angle: 259.7, amplitude: 8.2 },\n { angle: 259.9, amplitude: 8.100000000000001 },\n { angle: 260, amplitude: 8.100000000000001 },\n { angle: 260.2, amplitude: 8 },\n { angle: 260.3, amplitude: 7.9 },\n { angle: 260.5, amplitude: 7.7 },\n { angle: 260.6, amplitude: 7.6 },\n { angle: 260.8, amplitude: 7.5 },\n { angle: 261.1, amplitude: 7.3 },\n { angle: 261.3, amplitude: 7.199999999999999 },\n { angle: 261.7, amplitude: 7.1 },\n { angle: 262, amplitude: 6.8999999999999995 },\n { angle: 262.1, amplitude: 6.6000000000000005 },\n { angle: 262.2, amplitude: 6.6000000000000005 },\n { angle: 262.3, amplitude: 6.5 },\n { angle: 262.5, amplitude: 6.4 },\n { angle: 262.6, amplitude: 6.3 },\n { angle: 262.7, amplitude: 6.2 },\n { angle: 262.9, amplitude: 6.1 },\n { angle: 263, amplitude: 6.1 },\n { angle: 263.2, amplitude: 6 },\n { angle: 263.4, amplitude: 5.8 },\n { angle: 263.5, amplitude: 5.699999999999999 },\n { angle: 263.8, amplitude: 5.5 },\n { angle: 263.9, amplitude: 5.300000000000001 },\n { angle: 264.1, amplitude: 5.2 },\n { angle: 264.3, amplitude: 5.2 },\n { angle: 264.5, amplitude: 4.8 },\n { angle: 264.8, amplitude: 4.2 },\n { angle: 265, amplitude: 4.2 },\n { angle: 265.1, amplitude: 4.1 },\n { angle: 265.7, amplitude: 4.1 },\n { angle: 265.8, amplitude: 4 },\n { angle: 266.6, amplitude: 3.9000000000000004 },\n { angle: 266.8, amplitude: 3.8 },\n { angle: 267.6, amplitude: 3.8 },\n { angle: 268.1, amplitude: 3.7 },\n { angle: 268.7, amplitude: 3.7 },\n { angle: 268.9, amplitude: 3.5999999999999996 },\n { angle: 269.2, amplitude: 3.5999999999999996 },\n { angle: 269.8, amplitude: 3.5999999999999996 },\n { angle: 270.1, amplitude: 3.5 },\n { angle: 270.4, amplitude: 3.5 },\n { angle: 271, amplitude: 3.4000000000000004 },\n { angle: 271.3, amplitude: 3.4000000000000004 },\n { angle: 271.7, amplitude: 3.4000000000000004 },\n { angle: 272.3, amplitude: 3.4000000000000004 },\n { angle: 272.6, amplitude: 3.4000000000000004 },\n { angle: 273.6, amplitude: 3.4000000000000004 },\n { angle: 273.9, amplitude: 3.4000000000000004 },\n { angle: 274.8, amplitude: 3.4000000000000004 },\n { angle: 275.1, amplitude: 3.4000000000000004 },\n { angle: 275.5, amplitude: 3.4000000000000004 },\n { angle: 276, amplitude: 3.4000000000000004 },\n { angle: 276.3, amplitude: 3.4000000000000004 },\n { angle: 276.5, amplitude: 3.5 },\n { angle: 277.1, amplitude: 3.5 },\n { angle: 277.3, amplitude: 3.5 },\n { angle: 277.5, amplitude: 3.5999999999999996 },\n { angle: 278, amplitude: 3.5999999999999996 },\n { angle: 278.3, amplitude: 3.5999999999999996 },\n { angle: 278.4, amplitude: 3.7 },\n { angle: 279, amplitude: 3.7 },\n { angle: 279.1, amplitude: 3.8 },\n { angle: 279.3, amplitude: 3.8 },\n { angle: 279.8, amplitude: 3.9000000000000004 },\n { angle: 280, amplitude: 3.9000000000000004 },\n { angle: 280.8, amplitude: 4 },\n { angle: 280.9, amplitude: 4 },\n { angle: 281.4, amplitude: 4.1 },\n { angle: 281.5, amplitude: 4.2 },\n { angle: 281.8, amplitude: 4.3 },\n { angle: 281.9, amplitude: 4.3 },\n { angle: 282.1, amplitude: 4.6000000000000005 },\n { angle: 282.2, amplitude: 4.8 },\n { angle: 282.4, amplitude: 5 },\n { angle: 282.5, amplitude: 5.1 },\n { angle: 282.6, amplitude: 5.2 },\n { angle: 282.8, amplitude: 5.300000000000001 },\n { angle: 282.9, amplitude: 5.300000000000001 },\n { angle: 283.2, amplitude: 5.5 },\n { angle: 283.3, amplitude: 5.5 },\n { angle: 283.6, amplitude: 5.699999999999999 },\n { angle: 283.7, amplitude: 5.699999999999999 },\n { angle: 284.2, amplitude: 5.8 },\n { angle: 284.5, amplitude: 5.8999999999999995 },\n { angle: 284.6, amplitude: 5.8999999999999995 },\n { angle: 284.7, amplitude: 5.8999999999999995 },\n { angle: 285, amplitude: 6 },\n { angle: 285.1, amplitude: 6.1 },\n { angle: 285.3, amplitude: 6.1 },\n { angle: 285.5, amplitude: 6.2 },\n { angle: 285.8, amplitude: 6.2 },\n { angle: 286, amplitude: 6.2 },\n { angle: 286.1, amplitude: 6.2 },\n { angle: 286.6, amplitude: 6.3 },\n { angle: 286.7, amplitude: 6.3 },\n { angle: 287.1, amplitude: 6.3 },\n { angle: 287.2, amplitude: 6.3 },\n { angle: 287.5, amplitude: 6.3 },\n { angle: 287.7, amplitude: 6.3 },\n { angle: 287.9, amplitude: 6.4 },\n { angle: 288.3, amplitude: 6.4 },\n { angle: 288.5, amplitude: 6.4 },\n { angle: 289, amplitude: 6.4 },\n { angle: 289.6, amplitude: 6.4 },\n { angle: 290.4, amplitude: 6.4 },\n { angle: 290.7, amplitude: 6.4 },\n { angle: 291.2, amplitude: 6.4 },\n { angle: 291.5, amplitude: 6.4 },\n { angle: 291.7, amplitude: 6.4 },\n { angle: 291.9, amplitude: 6.4 },\n { angle: 292, amplitude: 6.4 },\n { angle: 292.3, amplitude: 6.4 },\n { angle: 292.5, amplitude: 6.4 },\n { angle: 292.8, amplitude: 6.4 },\n { angle: 293.2, amplitude: 6.4 },\n { angle: 293.3, amplitude: 6.3 },\n { angle: 293.5, amplitude: 6.3 },\n { angle: 293.8, amplitude: 6.3 },\n { angle: 294.5, amplitude: 6.3 },\n { angle: 294.6, amplitude: 6.2 },\n { angle: 294.8, amplitude: 6.2 },\n { angle: 295.3, amplitude: 6.2 },\n { angle: 295.5, amplitude: 6.2 },\n { angle: 295.6, amplitude: 6.2 },\n { angle: 295.7, amplitude: 6.2 },\n { angle: 296, amplitude: 6.2 },\n { angle: 296.2, amplitude: 6.2 },\n { angle: 296.3, amplitude: 6.2 },\n { angle: 296.8, amplitude: 6.2 },\n { angle: 297.1, amplitude: 6.2 },\n { angle: 297.7, amplitude: 6.2 },\n { angle: 297.9, amplitude: 6.2 },\n { angle: 298.4, amplitude: 6.2 },\n { angle: 298.5, amplitude: 6.2 },\n { angle: 299.2, amplitude: 6.2 },\n { angle: 299.4, amplitude: 6.2 },\n { angle: 300, amplitude: 6.2 },\n { angle: 300.4, amplitude: 6.3 },\n { angle: 300.7, amplitude: 6.3 },\n { angle: 301.2, amplitude: 6.3 },\n { angle: 301.7, amplitude: 6.3 },\n { angle: 302.2, amplitude: 6.4 },\n { angle: 303.1, amplitude: 6.4 },\n { angle: 303.2, amplitude: 6.4 },\n { angle: 303.6, amplitude: 6.4 },\n { angle: 304, amplitude: 6.4 },\n { angle: 304.4, amplitude: 6.4 },\n { angle: 304.8, amplitude: 6.5 },\n { angle: 305.4, amplitude: 6.5 },\n { angle: 305.7, amplitude: 6.5 },\n { angle: 306, amplitude: 6.5 },\n { angle: 306.1, amplitude: 6.5 },\n { angle: 306.3, amplitude: 6.5 },\n { angle: 306.4, amplitude: 6.5 },\n { angle: 306.7, amplitude: 6.6000000000000005 },\n { angle: 307.2, amplitude: 6.6000000000000005 },\n { angle: 307.3, amplitude: 6.6000000000000005 },\n { angle: 307.8, amplitude: 6.7 },\n { angle: 308.4, amplitude: 6.7 },\n { angle: 309, amplitude: 6.7 },\n { angle: 309.3, amplitude: 6.800000000000001 },\n { angle: 309.6, amplitude: 6.800000000000001 },\n { angle: 309.9, amplitude: 6.800000000000001 },\n { angle: 310.3, amplitude: 6.800000000000001 },\n { angle: 310.8, amplitude: 6.8999999999999995 },\n { angle: 311, amplitude: 6.8999999999999995 },\n { angle: 311.4, amplitude: 7 },\n { angle: 311.5, amplitude: 7 },\n { angle: 312, amplitude: 7 },\n { angle: 312.3, amplitude: 7 },\n { angle: 312.5, amplitude: 7 },\n { angle: 312.7, amplitude: 7 },\n { angle: 313.1, amplitude: 7.1 },\n { angle: 313.4, amplitude: 7.1 },\n { angle: 313.9, amplitude: 7.199999999999999 },\n { angle: 314.3, amplitude: 7.199999999999999 },\n { angle: 314.7, amplitude: 7.3 },\n { angle: 315.5, amplitude: 7.4 },\n { angle: 315.7, amplitude: 7.4 },\n { angle: 315.9, amplitude: 7.4 },\n { angle: 316.1, amplitude: 7.4 },\n { angle: 316.5, amplitude: 7.5 },\n { angle: 317, amplitude: 7.6 },\n { angle: 317.5, amplitude: 7.6 },\n { angle: 317.9, amplitude: 7.7 },\n { angle: 318.3, amplitude: 7.800000000000001 },\n { angle: 318.6, amplitude: 7.800000000000001 },\n { angle: 318.9, amplitude: 7.800000000000001 },\n { angle: 319, amplitude: 7.9 },\n { angle: 319.3, amplitude: 7.9 },\n { angle: 319.4, amplitude: 7.9 },\n { angle: 319.7, amplitude: 8 },\n { angle: 320, amplitude: 8 },\n { angle: 320.3, amplitude: 8.100000000000001 },\n { angle: 321.1, amplitude: 8.2 },\n { angle: 321.3, amplitude: 8.2 },\n { angle: 321.7, amplitude: 8.299999999999999 },\n { angle: 321.8, amplitude: 8.299999999999999 },\n { angle: 322.1, amplitude: 8.4 },\n { angle: 322.3, amplitude: 8.4 },\n { angle: 323, amplitude: 8.5 },\n { angle: 323.6, amplitude: 8.7 },\n { angle: 323.9, amplitude: 8.7 },\n { angle: 324.3, amplitude: 8.8 },\n { angle: 324.4, amplitude: 8.8 },\n { angle: 324.6, amplitude: 8.8 },\n { angle: 324.7, amplitude: 8.8 },\n { angle: 324.8, amplitude: 8.8 },\n { angle: 324.9, amplitude: 8.8 },\n { angle: 325, amplitude: 8.8 },\n { angle: 325.2, amplitude: 8.8 },\n { angle: 325.3, amplitude: 8.8 },\n { angle: 325.6, amplitude: 8.9 },\n { angle: 325.7, amplitude: 8.9 },\n { angle: 325.9, amplitude: 8.9 },\n { angle: 326.1, amplitude: 8.9 },\n { angle: 326.3, amplitude: 8.9 },\n { angle: 326.4, amplitude: 8.9 },\n { angle: 326.5, amplitude: 9 },\n { angle: 326.7, amplitude: 9 },\n { angle: 326.9, amplitude: 9 },\n { angle: 327.1, amplitude: 9 },\n { angle: 327.2, amplitude: 9 },\n { angle: 327.4, amplitude: 9 },\n { angle: 327.5, amplitude: 9 },\n { angle: 327.8, amplitude: 9 },\n { angle: 328.1, amplitude: 9.1 },\n { angle: 328.2, amplitude: 9.1 },\n { angle: 328.6, amplitude: 9.1 },\n { angle: 328.7, amplitude: 9.1 },\n { angle: 328.9, amplitude: 9.1 },\n { angle: 329.1, amplitude: 9.1 },\n { angle: 329.3, amplitude: 9.1 },\n { angle: 329.4, amplitude: 9.1 },\n { angle: 329.5, amplitude: 9.1 },\n { angle: 329.7, amplitude: 9.1 },\n { angle: 329.8, amplitude: 9.1 },\n { angle: 330, amplitude: 9.1 },\n { angle: 330.3, amplitude: 9.1 },\n { angle: 330.5, amplitude: 9.1 },\n { angle: 330.8, amplitude: 9.1 },\n { angle: 330.9, amplitude: 9.1 },\n { angle: 331.2, amplitude: 9 },\n { angle: 331.3, amplitude: 9 },\n { angle: 331.4, amplitude: 9 },\n { angle: 331.6, amplitude: 9 },\n { angle: 331.7, amplitude: 9 },\n { angle: 331.8, amplitude: 9 },\n { angle: 332.1, amplitude: 9 },\n { angle: 332.2, amplitude: 9 },\n { angle: 332.5, amplitude: 8.9 },\n { angle: 332.6, amplitude: 8.9 },\n { angle: 332.9, amplitude: 8.9 },\n { angle: 333, amplitude: 8.9 },\n { angle: 333.4, amplitude: 8.9 },\n { angle: 333.5, amplitude: 8.9 },\n { angle: 333.8, amplitude: 8.8 },\n { angle: 333.9, amplitude: 8.8 },\n { angle: 334.2, amplitude: 8.8 },\n { angle: 334.3, amplitude: 8.8 },\n { angle: 334.7, amplitude: 8.8 },\n { angle: 334.9, amplitude: 8.7 },\n { angle: 335.2, amplitude: 8.7 },\n { angle: 335.6, amplitude: 8.7 },\n { angle: 335.8, amplitude: 8.7 },\n { angle: 335.9, amplitude: 8.6 },\n { angle: 336.2, amplitude: 8.6 },\n { angle: 336.4, amplitude: 8.6 },\n { angle: 336.6, amplitude: 8.6 },\n { angle: 337, amplitude: 8.5 },\n { angle: 337.3, amplitude: 8.5 },\n { angle: 337.5, amplitude: 8.4 },\n { angle: 337.6, amplitude: 8.4 },\n { angle: 337.8, amplitude: 8.4 },\n { angle: 337.9, amplitude: 8.4 },\n { angle: 338.2, amplitude: 8.4 },\n { angle: 338.5, amplitude: 8.299999999999999 },\n { angle: 338.6, amplitude: 8.299999999999999 },\n { angle: 339, amplitude: 8.2 },\n { angle: 339.4, amplitude: 8.2 },\n { angle: 339.8, amplitude: 8.100000000000001 },\n { angle: 340, amplitude: 8.100000000000001 },\n { angle: 340.1, amplitude: 8.100000000000001 },\n { angle: 340.2, amplitude: 8 },\n { angle: 340.6, amplitude: 8 },\n { angle: 341.1, amplitude: 8 },\n { angle: 341.3, amplitude: 8 },\n { angle: 341.6, amplitude: 7.9 },\n { angle: 341.9, amplitude: 7.9 },\n { angle: 342.5, amplitude: 7.9 },\n { angle: 342.6, amplitude: 7.800000000000001 },\n { angle: 342.7, amplitude: 7.800000000000001 },\n { angle: 343.1, amplitude: 7.800000000000001 },\n { angle: 343.5, amplitude: 7.800000000000001 },\n { angle: 343.8, amplitude: 7.800000000000001 },\n { angle: 344, amplitude: 7.800000000000001 },\n { angle: 344.1, amplitude: 7.800000000000001 },\n { angle: 344.5, amplitude: 7.800000000000001 },\n { angle: 344.7, amplitude: 7.800000000000001 },\n { angle: 344.8, amplitude: 7.800000000000001 },\n { angle: 345.3, amplitude: 7.7 },\n { angle: 345.7, amplitude: 7.7 },\n { angle: 346.1, amplitude: 7.7 },\n { angle: 346.2, amplitude: 7.7 },\n { angle: 346.3, amplitude: 7.7 },\n { angle: 346.4, amplitude: 7.7 },\n { angle: 346.8, amplitude: 7.800000000000001 },\n { angle: 346.9, amplitude: 7.800000000000001 },\n { angle: 347.1, amplitude: 7.800000000000001 },\n { angle: 347.4, amplitude: 7.800000000000001 },\n { angle: 347.5, amplitude: 7.800000000000001 },\n { angle: 348, amplitude: 7.800000000000001 },\n { angle: 348.1, amplitude: 7.800000000000001 },\n { angle: 348.6, amplitude: 7.9 },\n { angle: 348.8, amplitude: 7.9 },\n { angle: 349.2, amplitude: 7.9 },\n { angle: 349.6, amplitude: 8 },\n { angle: 349.9, amplitude: 8 },\n { angle: 350.2, amplitude: 8.100000000000001 },\n { angle: 350.6, amplitude: 8.100000000000001 },\n { angle: 350.7, amplitude: 8.100000000000001 },\n { angle: 350.8, amplitude: 8.2 },\n { angle: 351.2, amplitude: 8.2 },\n { angle: 351.3, amplitude: 8.299999999999999 },\n { angle: 351.4, amplitude: 8.299999999999999 },\n { angle: 351.5, amplitude: 8.299999999999999 },\n { angle: 351.6, amplitude: 8.4 },\n { angle: 351.9, amplitude: 8.4 },\n { angle: 352.1, amplitude: 8.5 },\n { angle: 352.3, amplitude: 8.5 },\n { angle: 352.6, amplitude: 8.6 },\n { angle: 352.7, amplitude: 8.6 },\n { angle: 352.8, amplitude: 8.7 },\n { angle: 353.2, amplitude: 8.7 },\n { angle: 353.3, amplitude: 8.7 },\n { angle: 353.4, amplitude: 8.8 },\n { angle: 353.5, amplitude: 8.8 },\n { angle: 353.7, amplitude: 8.8 },\n { angle: 353.9, amplitude: 8.9 },\n { angle: 354, amplitude: 8.9 },\n { angle: 354.3, amplitude: 8.9 },\n { angle: 354.6, amplitude: 9 },\n { angle: 354.9, amplitude: 9 },\n { angle: 355.1, amplitude: 9.1 },\n { angle: 355.3, amplitude: 9.1 },\n { angle: 355.5, amplitude: 9.1 },\n { angle: 355.6, amplitude: 9.200000000000001 },\n { angle: 355.8, amplitude: 9.200000000000001 },\n { angle: 356, amplitude: 9.200000000000001 },\n { angle: 356.1, amplitude: 9.200000000000001 },\n { angle: 356.3, amplitude: 9.200000000000001 },\n { angle: 356.5, amplitude: 9.3 },\n { angle: 356.6, amplitude: 9.3 },\n { angle: 356.8, amplitude: 9.3 },\n { angle: 356.9, amplitude: 9.399999999999999 },\n { angle: 357.1, amplitude: 9.399999999999999 },\n { angle: 357.3, amplitude: 9.399999999999999 },\n { angle: 357.4, amplitude: 9.399999999999999 },\n { angle: 357.8, amplitude: 9.399999999999999 },\n { angle: 357.9, amplitude: 9.399999999999999 },\n { angle: 358, amplitude: 9.5 },\n { angle: 358.2, amplitude: 9.5 },\n { angle: 358.3, amplitude: 9.5 },\n { angle: 358.4, amplitude: 9.5 },\n { angle: 358.7, amplitude: 9.6 },\n { angle: 358.8, amplitude: 9.6 },\n { angle: 358.9, amplitude: 9.6 },\n { angle: 359.1, amplitude: 9.6 },\n ],\n },\n])\n","url":null,"readme":"This example showcases a simple Polar Chart with two Area Series.\n\n# PolarAreaSeries\n\n_PolarAreaSeries_ connects a list of _PolarPoints_ with a stroke, and fills the enclosed area.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![Polar Area Series](./assets/polarAreaSeries.png)\n\n## Automatic closing of data points\n\nBy enabling automatic closing of data points\n\n```typescript\nPolarAreaSeries.setConnectDataAutomaticallyEnabled(true)\n```\n\nyou can ensure that the highlighted area will be closed. In this picture there were only data points supplied for angles [0, 270], from there on, the data was automatically closed with a linear interpolation.\n\n![Polar Area Series connected](./assets/polarAreaSeriesConnected.png)\n","image":"polarEMFieldStrength"},{"id":"lcjs-example-1003-polarHeatmapBasic","title":"JavaScript Polar Heatmap Chart","tags":["polar","heatmap"],"description":"Basic Polar Heatmap showcase","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Polar Charts, Scientific Charts, High-Performance Charts, Medical Charts, Area Charts, Line Series.","src":"/*\n * Example showcasing the basics of Polar Heatmap feature.\n */\nconst lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\nconst { lightningChart, Themes, LUT, PalettedFill, regularColorSteps } = lcjs\nconst { createWaterDropDataGenerator } = xydata\n\nconst resolutionSectors = 360\nconst resolutionAnnuli = 100\n\nconst polarChart = lightningChart().Polar({\n // theme: Themes.darkGold\n})\nconst polarHeatmap = polarChart\n .addHeatmapSeries({\n sectors: resolutionSectors,\n annuli: resolutionAnnuli,\n amplitudeStart: 0,\n amplitudeStep: 1,\n dataOrder: 'annuli',\n })\n .setIntensityInterpolation('bilinear')\n\nconst themeExamples = polarChart.getTheme().examples\nif (!themeExamples) {\n throw new Error()\n}\n\ncreateWaterDropDataGenerator()\n .setRows(resolutionAnnuli)\n .setColumns(resolutionSectors)\n .generate()\n .then((data) => {\n const palette = new PalettedFill({\n lut: new LUT({\n units: 'intensity',\n steps: regularColorSteps(0, 60, themeExamples.intensityColorPalette),\n interpolate: true,\n }),\n })\n polarHeatmap.setFillStyle(palette).invalidateIntensityValues(data)\n\n const legend = polarChart.addLegendBox().add(polarChart).setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n })\n","url":null,"readme":"Example on the basics of Polar Heatmap feature.\n\nThe Polar Heatmap allows visualizing a 2D matrix of numeric data in a polar coordinate system.\nThe data is layed out in a grid split to _sectors_ (angle axis) and _annuli_ (amplitude axis).\n\nThe most important built-in features are:\n\n- Fast data and color updates.\n- Bilinear interpolation to smoothly color pixels between data values.\n\nTo learn how to extrapolate a heatmap data matrix from a scattered data set, see [Polar Sensor Heatmap example](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1005-polarHeatmapSensors.html)\n","image":"polarHeatmapBasic"},{"id":"lcjs-example-1004-polarHeatmapRadar","title":"JavaScript Polar Radar Heatmap Chart","tags":["polar","heatmap"],"description":"Polar Radar Heatmap example","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Polar Charts, Scientific Charts, High-Performance Charts, Medical Charts, Area Charts, Line Series.","src":"/*\n * Example showcasing real-time, partial data updates to Polar Heatmap.\n */\nconst lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\nconst { lightningChart, Themes, LUT, PalettedFill, regularColorSteps, SolidFill } = lcjs\nconst { createWaterDropDataGenerator } = xydata\n\nconst resolutionSectors = 360\nconst resolutionAnnuli = 200\n\nconst polarChart = lightningChart().Polar({\n // theme: Themes.darkGold\n})\nconst polarHeatmap = polarChart\n .addHeatmapSeries({\n sectors: resolutionSectors,\n annuli: resolutionAnnuli,\n amplitudeStart: 0,\n amplitudeStep: 1,\n dataOrder: 'sectors',\n })\n .setVisible(false)\n\nconst themeExamples = polarChart.getTheme().examples\nif (!themeExamples) {\n throw new Error()\n}\n\nconst polarSector = polarChart\n .addSector()\n .setAmplitudeStart(0)\n .setAmplitudeEnd(resolutionAnnuli)\n .setStrokeStyle((stroke) => stroke.setFillStyle(new SolidFill({ color: themeExamples.highlightPointColor })))\n\ncreateWaterDropDataGenerator()\n .setRows(resolutionSectors)\n .setColumns(resolutionAnnuli)\n .generate()\n .then((data) => {\n const palette = new PalettedFill({\n lut: new LUT({\n units: 'intensity',\n steps: regularColorSteps(0, 60, themeExamples.intensityColorPalette),\n interpolate: true,\n }),\n })\n polarHeatmap.setFillStyle(palette)\n polarHeatmap.invalidateIntensityValues(data).setVisible(true)\n polarChart.getAmplitudeAxis().fit()\n\n let iSector = 0\n const frame = () => {\n // --- Partial data update ---\n const updatedVectorValues = []\n for (let i = 0; i < resolutionAnnuli; i += 1) {\n updatedVectorValues[i] = data[iSector][i] + 15 * (Math.random() * 2 - 1)\n }\n polarHeatmap.invalidateIntensityValues({\n iSector,\n iAnnulus: 0,\n values: [updatedVectorValues],\n })\n\n iSector = (iSector + 1) % resolutionSectors\n polarSector.setAngleStart((360 * iSector) / resolutionSectors).setAngleEnd(polarSector.getAngleStart())\n requestAnimationFrame(frame)\n }\n requestAnimationFrame(frame)\n })\n","url":null,"readme":"Showcase of real-time, partial data updates to a Polar Heatmap.\n\nIn this example application, a new data vector is calculated every frame (usually 60 times per second), and pushed to the Polar Heatmap with an efficient _partial data update_ operation.\n\nThe full heatmap resolution is 360x200, so a total of 72 000 data points are displayed at every given time.\nWith 60 FPS, 12 000 new data points are pushed and displayed every second.\n","image":"polarHeatmapRadar"},{"id":"lcjs-example-1005-polarHeatmapSensors","title":"JavaScript Real-Time Polar Sensor Chart","tags":["polar","heatmap"],"description":"Example of Polar Sensor data visualization in real-time","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: Polar Charts, Scientific Charts, High-Performance Charts, Medical Charts, Area Charts, Line Series.","src":"/*\n * Example showcasing real-time, partial data updates to Polar Heatmap.\n */\nconst lcjs = require('@lightningchart/lcjs')\nconst { lightningChart, Themes, LUT, PalettedFill, regularColorSteps, SolidFill, ColorRGBA, PointShape } = lcjs\n\nconst sensors = [\n { angle: 0, amplitude: 0, value: Math.random() },\n { angle: 0, amplitude: 3, value: Math.random() },\n { angle: 30, amplitude: 3, value: Math.random() },\n { angle: 60, amplitude: 3, value: Math.random() },\n { angle: 90, amplitude: 3, value: Math.random() },\n { angle: 120, amplitude: 3, value: Math.random() },\n { angle: 150, amplitude: 3, value: Math.random() },\n { angle: 180, amplitude: 3, value: Math.random() },\n { angle: 210, amplitude: 3, value: Math.random() },\n { angle: 240, amplitude: 3, value: Math.random() },\n { angle: 270, amplitude: 3, value: Math.random() },\n { angle: 300, amplitude: 3, value: Math.random() },\n { angle: 330, amplitude: 3, value: Math.random() },\n { angle: 0, amplitude: 7, value: Math.random() },\n { angle: 30, amplitude: 7, value: Math.random() },\n { angle: 60, amplitude: 7, value: Math.random() },\n { angle: 90, amplitude: 7, value: Math.random() },\n { angle: 120, amplitude: 7, value: Math.random() },\n { angle: 150, amplitude: 7, value: Math.random() },\n { angle: 180, amplitude: 7, value: Math.random() },\n { angle: 210, amplitude: 7, value: Math.random() },\n { angle: 240, amplitude: 7, value: Math.random() },\n { angle: 270, amplitude: 7, value: Math.random() },\n { angle: 300, amplitude: 7, value: Math.random() },\n { angle: 330, amplitude: 7, value: Math.random() },\n { angle: 0, amplitude: 10, value: Math.random() },\n { angle: 30, amplitude: 10, value: Math.random() },\n { angle: 60, amplitude: 10, value: Math.random() },\n { angle: 90, amplitude: 10, value: Math.random() },\n { angle: 120, amplitude: 10, value: Math.random() },\n { angle: 150, amplitude: 10, value: Math.random() },\n { angle: 180, amplitude: 10, value: Math.random() },\n { angle: 210, amplitude: 10, value: Math.random() },\n { angle: 240, amplitude: 10, value: Math.random() },\n { angle: 270, amplitude: 10, value: Math.random() },\n { angle: 300, amplitude: 10, value: Math.random() },\n { angle: 330, amplitude: 10, value: Math.random() },\n]\nconst resolutionSectors = 16\nconst resolutionAnnuli = 10\nconst amplitudeMin = 0\nconst amplitudeMax = 10\nconst angleStep = 360 / resolutionSectors\nconst amplitudeStep = (amplitudeMax - amplitudeMin) / resolutionAnnuli\n\nconst polarChart = lightningChart().Polar({\n // theme: Themes.darkGold,\n})\n\nconst themeExamples = polarChart.getTheme().examples\nif (!themeExamples) {\n throw new Error()\n}\n\nconst pointSeries = polarChart\n .addPointSeries()\n .setName('Sensor locations')\n .setPointSize(10)\n .setPointShape(PointShape.Circle)\n .setData(sensors)\n .setCursorEnabled(false)\n .setAutoScrollingEnabled(false)\n\nconst polarHeatmap = polarChart\n .addHeatmapSeries({\n sectors: resolutionSectors,\n annuli: resolutionAnnuli,\n amplitudeStart: amplitudeMin,\n amplitudeEnd: amplitudeMax,\n dataOrder: 'annuli',\n })\n .setName('Heatmap')\n .setIntensityInterpolation('bilinear')\n .setCursorInterpolationEnabled(true)\n .setHighlightOnHover(false)\n\n// This series is intended for helping understand the example. It displays the location of heatmap cells in the chart.\n// The application extrapolates a data value for each of these locations and pushes those to the heatmap.\nconst cellLocationsSeries = polarChart\n .addPointSeries()\n .setName('Cell locations')\n .setPointSize(3)\n .setPointShape(PointShape.Square)\n .setPointFillStyle(new SolidFill({ color: ColorRGBA(0, 0, 0, 100) }))\n .setCursorEnabled(false)\n .setMouseInteractions(false)\n\nconst palette = new PalettedFill({\n lut: new LUT({\n units: 'intensity',\n steps: regularColorSteps(0, 1, themeExamples.coldHotColorPalette, { alpha: 100 }),\n interpolate: true,\n }),\n})\npolarHeatmap.setFillStyle(palette)\npolarChart.forEachAxis((axis) => axis.fit(false))\n\nconst legend = polarChart.addLegendBox().add(polarChart)\n\nrequestAnimationFrame(() => {\n const heatmapData = new Array(resolutionAnnuli).fill(0).map((_) => new Array(resolutionSectors).fill(0))\n\n const debugCellLocations = []\n console.time('calc heatmap cell locations')\n const heatmapCells = []\n for (let iAmplitude = 0; iAmplitude < resolutionAnnuli; iAmplitude += 1) {\n const annuliCells = []\n heatmapCells.push(annuliCells)\n for (let iSector = 0; iSector < resolutionSectors; iSector += 1) {\n const angle = iSector * angleStep\n const amplitude = iAmplitude * amplitudeStep\n debugCellLocations.push({ angle, amplitude })\n const cellLocationPixels = polarChart.translateCoordinate({ angle, amplitude }, polarChart.coordsRelative)\n const weights = new Array(sensors.length).fill(0)\n annuliCells.push({ cellLocationPixels, weights, weightsSum: 0 })\n }\n }\n console.timeEnd('calc heatmap cell locations')\n cellLocationsSeries.setData(debugCellLocations)\n\n /**\n * Weights only need to be calculated every time a sensor location changes.\n * It is a very heavy operation, which should only be performed when needed.\n */\n const calculateWeights = () => {\n // For each heatmap cell, calculate a weight to every sensor.\n console.time('calc weights')\n for (let iAmplitude = 0; iAmplitude < resolutionAnnuli; iAmplitude += 1) {\n for (let iSector = 0; iSector < resolutionSectors; iSector += 1) {\n const cell = heatmapCells[iAmplitude][iSector]\n let weightsSum = 0\n sensors.forEach((sensor, i) => {\n const sensorLocationPixels = polarChart.translateCoordinate(sensor, polarChart.coordsRelative)\n const distance = Math.sqrt(\n (sensorLocationPixels.x - cell.cellLocationPixels.x) ** 2 +\n (sensorLocationPixels.y - cell.cellLocationPixels.y) ** 2,\n )\n let weight = 1\n if (distance !== 0) {\n weight = 1 / distance ** 3\n }\n cell.weights[i] = weight\n weightsSum += weight\n })\n cell.weightsSum = weightsSum\n }\n }\n console.timeEnd('calc weights')\n\n /**\n * Return method for refreshing heatmap with updated values.\n */\n return () => {\n // Extrapolate value for each heatmap cell, considering all the sensors.\n for (let iAmplitude = 0; iAmplitude < resolutionAnnuli; iAmplitude += 1) {\n for (let iSector = 0; iSector < resolutionSectors; iSector += 1) {\n const cell = heatmapCells[iAmplitude][iSector]\n const sum = sensors.reduce((prev, cur, i) => prev + cur.value * cell.weights[i], 0)\n const value = sum / cell.weightsSum\n heatmapData[iAmplitude][iSector] = value\n }\n }\n polarHeatmap.invalidateIntensityValues(heatmapData)\n }\n }\n const refreshHeatmap = calculateWeights()\n\n // For demo purposes, change value of every sensor randomly 60 times per second and refresh heatmap.\n const frame = () => {\n sensors.forEach((sensor) => {\n sensor.value = Math.max(Math.min(sensor.value + 0.05 * (Math.random() * 2 - 1), 1), 0)\n })\n refreshHeatmap()\n requestAnimationFrame(frame)\n }\n frame()\n})\n","url":null,"readme":"Showcase of using Polar Heatmap to visualize a scatter data set in polar coordinates.\n\nTo explain that a bit further, the example establishes a number of _sensors_ that are positioned in polar coordinates (angle + amplitude). Each sensor has a numeric measurement, which could be temperature, voltage, etc. These measurements are then _extrapolated_ to linearly ease in the gaps between the sensors. The final extrapolated data set is then visualized with a heatmap.\n\nThe example simulates the sensor measurements changing in real-time (60 times per second), immediately recalculates the extrapolated heatmap data and displays it with low latency.\n\nThe extrapolation algorithm can be found in the example source code.\nEssentially, it calculates a measurement value for each heatmap cell by considering the value and distance to each sensor.\n\n![Heatmap cell value extrapolation](./assets/extrapolation.png)\n\nThis is a simple but robust algorithm that works for a variety of use cases.\n","image":"polarHeatmapSensors"},{"id":"lcjs-example-1100-mapChart","title":"Map Chart","tags":["map"],"description":"Simple overview of the Map Chart feature","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance charts with maps, interactive map charts, charting library with maps, dynamic coloring maps, several map types.","src":"/*\n * LightningChart JS example that showcases Map Chart feature.\n *\n * Next examples cover extended configuration, API usage and real life scenarios.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, MapTypes, Themes } = lcjs\n\nconst mapChart = lightningChart().Map({\n // theme: Themes.darkGold\n type: MapTypes.World,\n})\n","url":null,"readme":"Very simple overview of MapChart feature.\n\nA `MapChart` is created by selecting one of the 9 available _Map types_:\n\n- `MapTypes.World`\n- `MapTypes.Europe`\n- `MapTypes.Africa`\n- `MapTypes.Asia`\n- `MapTypes.NorthAmerica`\n- `MapTypes.SouthAmerica`\n- `MapTypes.Australia`\n- `MapTypes.USA`\n- `MapTypes.Canada`\n\nThis example showcases `MapTypes.World`, but you can try the other ones by simply editing this one part in the live editor:\n\n```js\nconst mapChart = lightningChart().Map({\n type: MapTypes.World, // <--- Select MapType HERE\n})\n```\n\n**More map examples**:\n\n- [Data visualization over LightningChart JS Map Charts](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1103-mapChartVizXY.html)\n- [Data visualization over Google Maps](https://blog.arction.com/easy-geospatial-data-visualization-with-lightningchart-js-and-google)\n- [LightningChart JS Map Charts with Drill-down](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1111-covidDrillDownDashboard.html)\n- [Data visualization over static map picture](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1110-geoChartUsaTemperature.html)\n","image":"mapChart"},{"id":"lcjs-example-1101-mapChartDynamicColor","title":"Map Chart Dynamic Coloring","tags":["map","palette"],"description":"Example of using MapChart with real data set and dynamic region coloring","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance charts with maps, interactive map charts, charting library with maps, dynamic coloring maps, several map types.","src":"/*\n * LightningChart JS that showcases MapChart with dynamic region coloring\n * based on an external data set (country population).\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, MapTypes, PalettedFill, LUT, ColorRGBA, formatLongitudeLatitude, regularColorSteps, Themes } = lcjs\n\nconst mapChart = lightningChart().Map({\n // theme: Themes.darkGold\n type: MapTypes.Europe,\n})\nconst theme = mapChart.getTheme()\n\nmapChart\n .setTitle('Population by country (2018)')\n .setFillStyle(\n new PalettedFill({\n lut: new LUT({\n steps: regularColorSteps(5 * 1000 * 1000, 100 * 1000 * 1000, theme.examples.badGoodColorPalette.reverse(), {\n formatLabels: (value) => `${(value / (1000 * 1000)).toFixed(0)} Million`,\n }),\n interpolate: true,\n // This property is used to specify fallback color for regions which have no data.\n color: ColorRGBA(255, 255, 255),\n }),\n }),\n )\n .setCursorResultTableFormatter((builder, region, value, longitude, latitude) => {\n builder.addRow(region.name).addRow(formatLongitudeLatitude(longitude, latitude))\n if (value) {\n builder.addRow(`Population: `, '', `${(value / (1000 * 1000)).toFixed(1)} million`)\n } else {\n builder.addRow(`No population data available`)\n }\n return builder\n })\n\n// Add Legend to show color look-up range.\nmapChart\n .addLegendBox()\n // Dispose example UI elements automatically if they take too much space. This is to avoid bad UI on mobile / etc. devices.\n .setAutoDispose({\n type: 'max-width',\n maxWidth: 0.3,\n })\n .add(mapChart)\n\n// Load population data.\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1101/population_eu_2018.json')\n .then((r) => r.json())\n .then((populationData) => {\n // Data is Europe countries population in year 2018.\n // Format is:\n // Array<{ \"Country Code\": string, \"Value\": number }>\n\n // Map data to format expected by Europe MapChart.\n const regionValuesData = populationData.map((item) => ({\n ISO_A3: item['Country Code'],\n value: item['Value'],\n }))\n mapChart.invalidateRegionValues(regionValuesData)\n })\n","url":null,"readme":"Example on using `MapChart` with real data set for coloring map regions dynamically.\n\nThe data set is downloaded with `fetch` when the application is started.\nIt contains population for each country around European area in the year 2018.\n\n```js\n;[\n { 'Country Code': 'ALB', Value: 2866376 },\n { 'Country Code': 'AUT', Value: 8840521 },\n { 'Country Code': 'BLR', Value: 9483499 },\n]\n```\n\nThe application translates this format to one expected by `MapChart`:\n\n```js\nconst regionValuesData = populationData.map((item) => ({\n ISO_A3: item['Country Code'],\n value: item['Value'],\n}))\n```\n\n```js\n;[\n { ISO_A3: 'ALB', value: 2866376 },\n { ISO_A3: 'AUT', value: 8840521 },\n { ISO_A3: 'BLR', value: 9483499 },\n]\n```\n\nFinally, the data is supplied to `MapChart` using the `invalidateRegionValues` method:\n\n```js\nmapChart.invalidateRegionValues(regionValuesData)\n```\n\n`MapChart` can utilize the region values data in two ways:\n\n1. Dynamic region coloring based on color look-up table.\n2. Auto Cursor formatting.\n\n### Dynamic region coloring\n\nDynamic coloring is enabled by setting the regions _fill style_ to a `PalettedFill`:\n\n```js\nmapChart.setFillStyle(\n new PalettedFill({\n lut: new LUT({\n steps: [\n {\n value: 1 * 1000 * 1000,\n color: ColorRGBA(0, 255, 0),\n label: '1 Million',\n },\n { value: 10 * 1000 * 1000, color: ColorRGBA(127, 127, 0), label: '' },\n { value: 50 * 1000 * 1000, color: ColorRGBA(255, 127, 0), label: '' },\n {\n value: 500 * 1000 * 1000,\n color: ColorRGBA(255, 0, 0),\n label: '500 Million',\n },\n ],\n interpolate: true,\n // This property is used to specify fallback color for regions which have no data.\n color: ColorRGBA(255, 255, 255),\n }),\n }),\n)\n```\n\n### Auto cursor formatting\n\n`MapChart` cursor formatting is configured with `setCursorResultTableFormatter` method:\n\n```js\nmapChart.setCursorResultTableFormatter((builder, region, value, longitude, latitude) => {\n builder.addRow(region.name)\n\n // Region value is supplied to the formatter function. Note, that it is `undefined` for regions which were not invalidated by the user.\n if (value) {\n builder.addRow(`Population: `, '', `${(value / (1000 * 1000)).toFixed(1)} million`)\n } else {\n builder.addRow(`No population data available`)\n }\n return builder\n})\n```\n\n**More map examples**:\n\n- [Data visualization over LightningChart JS Map Charts](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1103-mapChartVizXY.html)\n- [Data visualization over Google Maps](https://blog.arction.com/easy-geospatial-data-visualization-with-lightningchart-js-and-google)\n- [LightningChart JS Map Charts with Drill-down](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1111-covidDrillDownDashboard.html)\n- [Data visualization over static map picture](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1110-geoChartUsaTemperature.html)\n","image":"mapChartDynamicColor"},{"id":"lcjs-example-1102-mapChartTimeline","title":"JavaScript Real-time Map Dashboard","tags":["map","realtime","dashboard","ui","html","palette"],"description":"Example on using MapChart with animated real-time data set","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance charts with maps, interactive map charts, charting library with maps, dynamic coloring maps, several map types.","src":"/*\n * LightningChart JS Example on using `MapChart` with real-time animated data set and dynamic region coloring.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\n// Extract required parts from LightningChartJS.\nconst {\n lightningChart,\n MapTypes,\n PalettedFill,\n LUT,\n ColorRGBA,\n emptyFill,\n emptyLine,\n UIOrigins,\n LegendBoxBuilders,\n UIElementBuilders,\n UILayoutBuilders,\n Themes,\n} = lcjs\n\n// Create Dashboard and Charts.\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart().Dashboard({\n // theme: Themes.darkGold\n numberOfColumns: 3,\n numberOfRows: 2,\n})\nconst theme = dashboard.getTheme()\n\n// Specify color look up table for coloring countries. Color depends on % of population change\nconst palette = new PalettedFill({\n lut: new LUT({\n steps: [\n {\n value: -5,\n color: theme.examples.badGoodColorPalette[theme.examples.badGoodColorPalette.length - 1],\n label: '-5%',\n },\n {\n value: 0,\n color: ColorRGBA(200, 200, 200),\n label: '0%',\n },\n {\n value: 5,\n color: theme.examples.badGoodColorPalette[0],\n label: '+5%',\n },\n ],\n interpolate: true,\n // This property is used to specify fallback color for regions which have no data.\n color: ColorRGBA(255, 255, 255),\n }),\n})\n\n// Specify cursor result table formatter for all map charts.\nconst cursorResultTableFormatter = (builder, region, value, longitude, latitude) => {\n builder.addRow('', region.name, '').addRow('', `Population change ${currentYear}`, '')\n if (value) {\n builder.addRow('', `${value > 0 ? '+' : ''}${value.toFixed(2)} %`, '')\n }\n return builder\n}\n\n// North America region\nconst chartNA = dashboard\n .createMapChart({\n type: MapTypes.NorthAmerica,\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 1,\n })\n .setTitle('North America')\n .setFillStyle(palette)\n .setCursorResultTableFormatter(cursorResultTableFormatter)\n\n// South America region\nconst chartSA = dashboard\n .createMapChart({\n type: MapTypes.SouthAmerica,\n columnIndex: 1,\n rowIndex: 0,\n columnSpan: 1,\n })\n .setTitle('South America')\n .setFillStyle(palette)\n .setCursorResultTableFormatter(cursorResultTableFormatter)\n\n// Europe region\nconst chartEurope = dashboard\n .createMapChart({\n type: MapTypes.Europe,\n columnIndex: 0,\n rowIndex: 1,\n columnSpan: 3,\n rowSpan: 1,\n })\n .setTitle('Europe')\n .setFillStyle(palette)\n .setCursorResultTableFormatter(cursorResultTableFormatter)\n\n// Create UI panel inside Dashboard for placing legend and some extra controls.\nconst panel = dashboard.createUIPanel({\n columnIndex: 2,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n})\n\npanel.onResize((chart, width, height, engineWidth, engineHeight) => {\n block.style.width = width + 'px'\n block.style.left = engineWidth - width + 'px'\n})\nchartEurope.onResize((chart, width, height, engineWidth, engineHeight) => {\n block.style.top = engineHeight - height - 82 + 'px'\n})\n\n// NOTE: Custom Legend Box is created with UI elements.\nconst legendLayout = panel\n .addUIElement(UILayoutBuilders.Column)\n .setPosition({\n x: 0,\n y: 20,\n })\n .setOrigin(UIOrigins.LeftBottom)\n .setMargin(6)\n .setMouseInteractions(false)\n .setBackground((bg) => bg.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n\nconst legendTitle = legendLayout.addElement(UIElementBuilders.TextBox).setText('Population change (% / year)')\n\nconst legendBuilder = LegendBoxBuilders.HorizontalLegendBox.addStyler((legendBox) =>\n legendBox.setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine)).setTitle(''),\n)\n\nconst legendNA = legendLayout.addElement(legendBuilder).add(chartNA)\nconst legendSA = legendLayout.addElement(legendBuilder).add(chartSA)\nconst legendEurope = legendLayout.addElement(legendBuilder).add(chartEurope)\n\n// Add dynamically injected HTML elements for active Year slider.\nconst yearDiv = document.createElement('div')\nyearDiv.id = 'block'\nconst yearSlider = document.createElement('input')\nyearSlider.type = 'range'\nyearSlider.min = 1961\nyearSlider.max = 2018\nyearSlider.value = yearSlider.min\nyearSlider.id = 'slider'\nconst yearMarker = document.createElement('span')\nyearMarker.id = 'marker'\nyearDiv.appendChild(yearMarker)\nyearDiv.appendChild(yearSlider)\ndashboard.engine.container.append(yearDiv)\n\nconst markerColorGreen = 'rgb(0, 0, 200, 0.6)'\nconst markerColorDarkGreen = 'rgb(0, 0, 150)'\nconst markerColorRed = 'rgb(200, 0, 0)'\nconst markerColorDarkRed = 'rgb(150, 0, 0)'\n\n// Keep track of animation properties.\nlet currentYear = yearSlider.min\nlet yearAnimationActive = true\nlet interval\n\n// Fetch data set used in example.\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1102/population60-21.json')\n .then((r) => r.json())\n .then((populationData) => {\n // stop timeline, change the year and change bg color of slider by clicking on slider\n yearSlider.oninput = () => {\n currentYear = yearSlider.value\n clearInterval(interval)\n yearAnimationActive = false\n yearMarker.style.background = markerColorRed\n setMap(populationData, currentYear)\n const value = ((yearSlider.value - yearSlider.min) * 100) / (yearSlider.max - yearSlider.min)\n yearSlider.style.background = 'linear-gradient(to right, rgba(0,0,255,.6)' + value + '%, #fff ' + value + '%, white 100%)'\n }\n\n // change the color of the marker on hover\n yearMarker.onmouseover = () => {\n if (yearAnimationActive) {\n yearMarker.style.background = markerColorDarkRed\n } else {\n yearMarker.style.background = markerColorDarkGreen\n }\n }\n\n // reset the color of the marker on mouse out\n yearMarker.onmouseout = () => {\n if (yearAnimationActive) {\n yearMarker.style.background = markerColorGreen\n } else {\n yearMarker.style.background = markerColorRed\n }\n }\n\n // pause/start timeline by clicking the marker\n yearMarker.onclick = () => {\n if (yearAnimationActive) {\n clearInterval(interval)\n yearAnimationActive = false\n yearMarker.style.background = markerColorRed\n } else {\n intervalHandler()\n yearAnimationActive = true\n yearMarker.style.background = markerColorGreen\n }\n }\n\n // set timeline\n const intervalHandler = () => {\n // subscribe var. 'interval' to 'setInterval'\n interval = setInterval(() => {\n // Map data to format expected by MapChart.\n setMap(populationData, currentYear)\n // if timeline is over wait for 2sec and start it again\n if (currentYear >= 2019 && yearAnimationActive) {\n setTimeout(() => {\n currentYear = yearSlider.min\n }, 1800)\n } else {\n yearSlider.value = currentYear\n // change BG of slider\n const value = ((yearSlider.value - yearSlider.min) * 100) / (yearSlider.max - yearSlider.min)\n yearSlider.style.background =\n 'linear-gradient(to right, rgba(0,0,255,.6)' + value + '%, #fff ' + value + '%, white 100%)'\n currentYear++\n }\n }, 200)\n }\n\n intervalHandler()\n\n const setMap = (populationData, year) => {\n // set year for marker\n yearMarker.textContent = year\n\n // calculate population change from previous year and put into map chart data format.\n const regionValuesData = populationData.map((item) => ({\n ISO_A3: item['Country Code'],\n value: ((item[year] - item[year - 1]) * 100) / item[year],\n }))\n\n // update map chart region values\n chartEurope.invalidateRegionValues(regionValuesData)\n chartSA.invalidateRegionValues(regionValuesData)\n chartNA.invalidateRegionValues(regionValuesData)\n }\n })\n\n// Dynamically inject some CSS to example.\nfunction addStyle(styleString) {\n const style = document.createElement('style')\n style.textContent = styleString\n document.head.append(style)\n}\n\naddStyle(`\n\n * {\n box-sizing: border-box;\n }\n \n #block{\n width: 33%;\n height: 60px;\n top: calc(40% - 13px);\n right: -2px;\n position: absolute;\n display: flex;\n justify-content: space-evenly;\n padding: 30px 10px;\n z-index: 1;\n box-sizing: border-box\n }\n\n #slider{\n -webkit-appearance: none;\n margin: 0;\n padding: 0;\n width: 75%;\n height: 5px;\n position: relative;\n cursor: pointer;\n border-radius: 10px;\n border: solid 1px; \n background: linear-gradient(to right, #fff 0%, white 100%)\n }\n \n #slider::-webkit-slider-thumb{\n -webkit-appearance: none;\n height: 20px;\n width: 20px;\n padding: 0;\n background-color: lightgray;\n cursor: pointer;\n border-radius: 50%;\n border: solid 1px gray\n }\n\n #marker {\n background: rgb(0, 0, 200, 0.6);\n color: white;\n height: 30px;\n width: 50px;\n top: -13px;\n position: relative;\n border-radius: 4px;\n text-align:center; \n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n #marker::after {\n content: \"\";\n text-align: center;\n position: absolute;\n left: 100%;\n border-bottom: 5px solid transparent;\n border-top: 5px solid transparent;\n border-left: 5px solid lightgray;\n }\n\n #marker:active {\n transform: scale(0.9);\n }\n\n `)\n","url":null,"readme":"Example on using `MapChart` with real-time animated data set and dynamic region coloring.\n\nThe data set is downloaded with `fetch` when the application is started.\nIt contains population for each country in Europe, North and South America in the year range between 1961-2019.\n\nThe dashboard contains 3 charts (for each region) and 1 cell with UI panel.\nThe UI panel contains interactive slider that can set a data period and year marker that can pause and start animation.\n\nEvery time the active year is changed, map regions data is quickly invalidated in real-time with the 'invalidateRegionValues' method\n\n```js\n// Code snippet setting region values for all 3 map charts.\nlet year = 2005\n\nconst regionValuesData = populationData.map((item) => ({\n ISO_A3: item['Country Code'],\n value: item[year],\n}))\n\nchartEurope.invalidateRegionValues(regionValuesData)\nchartSA.invalidateRegionValues(regionValuesData)\nchartNA.invalidateRegionValues(regionValuesData)\n```\n\n**More map examples**:\n\n- [Data visualization over LightningChart JS Map Charts](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1103-mapChartVizXY.html)\n- [Data visualization over Google Maps](https://blog.arction.com/easy-geospatial-data-visualization-with-lightningchart-js-and-google)\n- [LightningChart JS Map Charts with Drill-down](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1111-covidDrillDownDashboard.html)\n- [Data visualization over static map picture](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1110-geoChartUsaTemperature.html)\n\n**(!) Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/**\n","image":"mapChartTimeline"},{"id":"lcjs-example-1103-mapChartVizXY","title":"JavaScript Animated CoVID Vaccination Coverage Chart","tags":["xy","map","map","palette"],"description":"Animated map chart that visualizes the progression of first round of CoVID-19 vaccination coverage per country","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance charts with maps, interactive map charts, charting library with maps, dynamic coloring maps, several map types.","src":"/*\n * LightningChart JS Example on ChartXY with Custom Color Theme.\n */\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\n\nconst {\n lightningChart,\n AxisTickStrategies,\n ColorRGBA,\n PointShape,\n PalettedFill,\n LUT,\n UIElementBuilders,\n emptyFill,\n emptyLine,\n UIOrigins,\n MapTypes,\n transparentFill,\n regularColorSteps,\n Themes,\n} = lcjs\n\n// Custom methods for date\nDate.prototype.formatDate = function () {\n return this.toISOString().split('T')[0]\n}\n\nDate.prototype.addDays = function (days) {\n const date = new Date(this.valueOf())\n const newDay = new Date(date.getFullYear(), date.getMonth(), date.getDate() + days).formatDate()\n return newDay\n}\n\nconst domContainer = document.getElementById('chart-container') || document.body\nconst lc = lightningChart()\n\n// Add div for MapChart\nconst divMap = document.createElement('div')\ndomContainer.append(divMap)\n\n// Add div for ChartXY\nconst divOverlay = document.createElement('div')\ndomContainer.append(divOverlay)\n\n// Adding slider\nlet animationActive = true\n\n// Add slider div\nconst yearDiv = document.createElement('div')\nconst yearSlider = document.createElement('input')\nconst yearMarker = document.createElement('span')\nyearDiv.appendChild(yearMarker)\nyearDiv.appendChild(yearSlider)\n\n// Yesterday's day in real time\nlet yesterday = new Date('January 10, 2022').formatDate()\n\nconst mapChart = lc\n .Map({\n // theme: Themes.darkGold\n type: MapTypes.World,\n container: divMap,\n })\n .setTitle('')\n .setPadding({\n top: 30,\n bottom: 0,\n right: 0,\n left: 0,\n })\n\n// Palette for coloring data by value\nconst theme = mapChart.getTheme()\nconst palette = new PalettedFill({\n lut: new LUT({\n steps: regularColorSteps(0, 100, theme.examples.badGoodColorPalette, {\n alpha: 150,\n formatLabels: (value) => `${value.toFixed(0)} %`,\n }),\n }),\n})\n\n// Create chart with customized settings\nconst chart = lc\n .ChartXY({\n // theme: Themes.darkGold\n container: divOverlay,\n })\n .setMouseInteractions(false)\n .setTitle('Loading example data ...')\n .setBackgroundFillStyle(transparentFill)\n .setSeriesBackgroundFillStyle(transparentFill)\n .setSeriesBackgroundStrokeStyle(emptyLine)\nchart.engine.setBackgroundFillStyle(transparentFill)\n\n// Hide axes\nchart.getDefaultAxes().forEach((axis) => axis.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine))\n\n// Synchronize ChartXY with MapChart view.\nmapChart.onViewChange((view) => {\n const { latitudeRange, longitudeRange, margin } = view\n\n chart.getDefaultAxisX().setInterval({ start: longitudeRange.start, end: longitudeRange.end })\n chart.getDefaultAxisY().setInterval({ start: latitudeRange.start, end: latitudeRange.end })\n\n chart.setPadding(0)\n})\n\n// Create TextBox of 'average of vaccinated %'\nconst textBox = chart\n .addUIElement(UIElementBuilders.TextBox)\n .setOrigin(UIOrigins.LeftTop)\n .setPosition({\n x: 0,\n y: 100,\n })\n .setMargin(10)\n .setText('')\n .setTextFont((fontSettings) => fontSettings.setSize(15))\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n\n// Add PointSeries\nconst covidVaccinated = chart\n .addPointSeries({\n pointShape: PointShape.Circle,\n })\n .setMouseInteractions(false)\n .setName('Vaccination coverage')\n .setIndividualPointSizeEnabled(true)\n .setIndividualPointValueEnabled(true)\n .setPointFillStyle(palette)\n .setEffect(false)\n .setCursorResultTableFormatter((builder, series, x, y, dataPoint) =>\n builder\n .addRow('')\n .addRow(dataPoint.country)\n .addRow(`Vaccinated once:`)\n .addRow(`${dataPoint.value.toFixed(2)}% of population`),\n )\n .setEffect(false)\n\n// Fetch the data\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + `examples/assets/1103/data.json`)\n .then((r) => r.json())\n .then((data) => {\n // Add data to the Point Series\n data.countries.forEach((el, i) => {\n covidVaccinated.add({\n x: el.pos[1],\n y: el.pos[0],\n value: 0,\n size: 0,\n country: el.name,\n })\n })\n\n // Set legendBox\n const legend = chart.addLegendBox().add(covidVaccinated)\n\n // Start TimeInterval\n startBubbling(covidVaccinated, data)\n\n // If slider was moved then stop animation and set\n yearSlider.oninput = () => {\n stopSlider()\n //start 'Bubbling' to animate poins during slider dragging\n startBubbling(covidVaccinated, data)\n }\n\n // Start/Stop animation by click on marker\n yearMarker.onclick = () => {\n if (animationActive) {\n stopSlider()\n } else {\n animationActive = true\n yearMarker.textContent = 'Started'\n yearMarker.style.background = markerColorGreen\n if (yearSlider.value == yearSlider.max) yearSlider.value = 0\n startBubbling(covidVaccinated, data)\n }\n }\n })\n .catch((error) => {\n console.log(error)\n })\n\nfunction startBubbling(bubbles, data) {\n // The current day in the loop\n const date = new Date(2021, 0, yearSlider.value)\n let day = date.formatDate()\n\n // Clear data of the Series\n bubbles.clear()\n let total = 0\n // Add new data\n const dataAtDate = data.samples.find((item) => item.date === day)\n dataAtDate.values.forEach((vacc100, i) => {\n total = total + vacc100\n const country = data.countries[i]\n changeData(country, bubbles, vacc100)\n })\n\n // Set title as current day\n chart.setTitle(date.toLocaleDateString('FIN'))\n\n // Set textBox\n textBox.setText(`Population who received at least one vaccine ${(total / dataAtDate.values.length).toFixed(2)}%`)\n\n // Loop until reach 'Yesterday'\n if (yesterday > day && animationActive) {\n yearSlider.value++\n setTimeout(() => startBubbling(covidVaccinated, data), 1000 / 24)\n } else {\n stopSlider()\n }\n}\n\n// Add new data / change data function\nfunction changeData(country, covidVaccinated, vacc100) {\n covidVaccinated.add({\n x: country.pos[1],\n y: country.pos[0],\n value: vacc100,\n size: Math.max(3, vacc100 / 2),\n country: country.name,\n })\n}\n\nfunction stopSlider() {\n animationActive = false\n yearMarker.textContent = 'Stopped'\n yearMarker.style.background = markerColorRed\n}\n\n// Style Map div\ndivMap.style.width = '100%'\ndivMap.style.height = '100%'\ndivMap.style.position = 'absolute'\ndivMap.style.left = '0px'\ndivMap.style.top = '0px'\nmapChart.engine.layout()\n\n// Style Chart div\ndivOverlay.style.width = '100%'\ndivOverlay.style.height = '100%'\ndivOverlay.style.position = 'absolute'\ndivOverlay.style.left = '0px'\ndivOverlay.style.top = '0px'\nchart.engine.layout()\n\n// Style Slider div\nyearDiv.id = 'block'\nyearSlider.type = 'range'\nyearSlider.min = 0\nyearSlider.max = Math.ceil((new Date('January 11, 2022') - new Date(2021, 0, 1)) / (1000 * 3600 * 24))\nyearSlider.value = yearSlider.min\nyearSlider.id = 'slider'\nyearMarker.id = 'marker'\nyearMarker.textContent = 'Started'\nconst markerColorGreen = 'rgb(0, 0, 200, 0.6)'\nconst markerColorRed = 'rgb(200, 0, 0)'\n\nchart.engine.container.append(yearDiv)\n\n// Dynamically inject some CSS to example.\nfunction addStyle(styleString) {\n const style = document.createElement('style')\n style.textContent = styleString\n document.head.append(style)\n}\n\naddStyle(`\n\n * {\n box-sizing: border-box;\n }\n \n #block{\n width: 50%;\n height: 60px;\n\t\ttop: 90%;\n right: 60px;\n position: absolute;\n display: flex;\n justify-content: space-evenly;\n padding: 30px 10px;\n z-index: 1;\n box-sizing: border-box\n }\n\n #slider{\n -webkit-appearance: none;\n margin: 0;\n padding: 0;\n width: 85%;\n height: 5px;\n position: relative;\n cursor: pointer;\n border-radius: 10px;\n border: solid 1px; \n background: linear-gradient(to right, #fff 0%, white 100%)\n }\n \n #slider::-webkit-slider-thumb{\n -webkit-appearance: none;\n height: 20px;\n width: 20px;\n padding: 0;\n background-color: lightgray;\n cursor: pointer;\n border-radius: 50%;\n border: solid 1px gray\n }\n\n #marker {\n background: rgb(0, 0, 200, 0.6);\n color: white;\n height: 30px;\n width: 55px;\n top: -13px;\n position: relative;\n border-radius: 4px;\n text-align:center; \n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n #marker::after {\n content: \"\";\n text-align: center;\n position: absolute;\n left: 100%;\n border-bottom: 5px solid transparent;\n border-top: 5px solid transparent;\n border-left: 5px solid gray;\n }\n\n #marker:active {\n transform: scale(0.9);\n }\n\n`)\n","url":null,"readme":"Example which showcases laying LightningChart JS `ChartXY` data visualization features over a LightningChart JS `MapChart`.\n\nThis is likely to be the single easiest method available of implementing a geographical data visualization component:\n\n- **No tile server or large tile storage required**\n- **Can be used offline**\n- **Extremely simple to develop** (minimal setup less than 50 lines of code)\n\nThe two charts are laid perfectly over each other by placing them on their own HTML `div` elements with same position and size. To complete the setting, `MapChart` provides a method `onViewChange` which can be used to conveniently synchronize the map latitude and longitude view with the overlaid XY axes.\n\n```js\n// Minimal working code for overlaid and synchronized MapChart and ChartXY.\nconst divMap = document.createElement('div')\ndocument.body.append(divMap)\n\nconst divOverlay = document.createElement('div')\ndocument.body.append(divOverlay)\n\nconst mapChart = lightningChart()\n .Map({\n type: MapTypes.World,\n container: divMap,\n })\n .setTitle('')\n\nconst chart = lightningChart()\n .ChartXY({\n container: divOverlay,\n })\n .setMouseInteractions(false)\n .setBackgroundFillStyle(transparentFill)\n .setSeriesBackgroundFillStyle(transparentFill)\nchart.engine.setBackgroundFillStyle(transparentFill)\nchart.getDefaultAxes().forEach((axis) => axis.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine))\n\nmapChart.onViewChange((view) => {\n const { latitudeRange, longitudeRange, margin } = view\n chart.getDefaultAxisX().setInterval({ start: longitudeRange.start, end: longitudeRange.end })\n chart.getDefaultAxisY().setInterval({ start: latitudeRange.start, end: latitudeRange.end })\n chart.setPadding(margin)\n})\n\ndivMap.style.width = '100vw'\ndivMap.style.height = '100vh'\ndivMap.style.position = 'absolute'\ndivMap.style.left = '0px'\ndivMap.style.top = '0px'\nmapChart.engine.layout()\n\ndivOverlay.style.width = '100vw'\ndivOverlay.style.height = '100vh'\ndivOverlay.style.position = 'absolute'\ndivOverlay.style.left = '0px'\ndivOverlay.style.top = '0px'\nchart.engine.layout()\n```\n\nThe example animates the progression of first round of Covid-19 vaccines coverage across all countries.\n\nThe used data set is from [ourworldindata.org](https://ourworldindata.org/covid-vaccinations)\n\n> Hannah Ritchie, Edouard Mathieu, Lucas Rodés-Guirao, Cameron Appel, Charlie Giattino, Esteban Ortiz-Ospina, Joe Hasell, Bobbie Macdonald, Diana Beltekian and Max Roser (2020) - \"Coronavirus Pandemic (COVID-19)\". Published online at OurWorldInData.org. Retrieved from: 'https://ourworldindata.org/coronavirus' [Online Resource]\n\n**More map examples**:\n\n- [Simple Countries Visualization](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1101-mapChartDynamicColor.html)\n- [Data visualization over Google Maps](https://blog.arction.com/easy-geospatial-data-visualization-with-lightningchart-js-and-google)\n- [LightningChart JS Map Charts with Drill-down](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1111-covidDrillDownDashboard.html)\n- [Data visualization over static map picture](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1110-geoChartUsaTemperature.html)\n","image":"mapChartVizXY"},{"id":"lcjs-example-1110-geoChartUsaTemperature","title":"JavaScript Animated Geographical Temperature Chart","tags":["xy","map","heatmap","palette","realtime","image"],"description":"Example on geographical data visualization by laying a 2D heatmap over a picture of a map.","metaDescription":"Example on geographical data visualization by laying a 2D heatmap over a picture of a map.","src":"/*\n * LightningChart JS example on geographical data visualization by laying a 2D heatmap over a picture of a map.\n */\n\n// Import LightningChartJS\nconst lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\n\n// Extract required parts from LightningChartJS.\nconst { lightningChart, regularColorSteps, ImageFill, ImageFitMode, PalettedFill, LUT, formatLongitudeLatitude, emptyLine, Themes } = lcjs\n\nconst { createWaterDropDataGenerator } = xydata\n\n// Create a XY Chart\nconst chart = lightningChart({\n // Example data set is a bit larger than actual displayed heatmap. This is intentional, but displays a console warning.\n // This flag is specified to omit this warning.\n warnings: false,\n})\n .ChartXY({\n // theme: Themes.darkGold\n })\n .setTitle('Loading temperature data ...')\n .setPadding({ right: 40 })\n .setMouseInteractions(false)\n\nconst axisY = chart.getDefaultAxisY().setTitle('Latitude').setMouseInteractions(false).setAnimationScroll(false)\nconst axisX = chart.getDefaultAxisX().setTitle('Longitude').setMouseInteractions(false).setAnimationScroll(false)\nconst theme = chart.getTheme()\n\n// Define value -> color look up table.\nlet legend\nconst setHeatmapPalette = (transparency) => {\n heatmap.setFillStyle(\n new PalettedFill({\n lut: new LUT({\n units: 'intensity',\n steps: regularColorSteps(0, 100, theme.examples.coldHotColorPalette, { alpha: transparency }),\n interpolate: true,\n }),\n }),\n )\n legend = legend || chart.addLegendBox().add(chart)\n}\n\n// Add Heatmap Series\nconst columns = 500\nconst rows = 320\nconst heatmap = chart\n .addHeatmapGridSeries({\n columns,\n rows,\n start: { x: -126, y: 24 },\n end: { x: -66, y: 48.0 },\n dataOrder: 'columns',\n })\n .setWireframeStyle(emptyLine)\n // Customize cursor result table formatting.\n .setCursorResultTableFormatter((builder, _, dataPoint) =>\n builder\n .addRow(formatLongitudeLatitude(dataPoint.x, dataPoint.y))\n .addRow('Temp:', '', fahrenheitToCelsius(dataPoint.intensity).toFixed(1), '\\u00B0С'),\n )\n\n// Get Temperature Data\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1110/usa-temperature-data.json')\n .then((r) => r.json())\n .then((temperatureData) => {\n // Add data to the Heatmap Series\n heatmap.invalidateIntensityValues(temperatureData.data)\n chart.setTitle('Loading animation ...')\n\n // Generate random offset data set for real-time animation.\n createWaterDropDataGenerator()\n .setColumns(columns)\n .setRows(rows)\n .setWaterDrops([\n { columnNormalized: 0.6, rowNormalized: 0.6, amplitude: 1 },\n { columnNormalized: 0.2, rowNormalized: 0.1, amplitude: 0.9 },\n { columnNormalized: 0.1, rowNormalized: 0.8, amplitude: 0.6 },\n ])\n .generate()\n .then((randomData) => {\n // Map random data to more realistic fahrenheit value range.\n return randomData.map((row) => row.map((fahrenheitOffset) => fahrenheitOffset * 0.4))\n })\n .then((randomData) => {\n chart.setTitle('Animated United States Temperature Heat map')\n\n // Generate n data sets that are interpolations between temperature data set and offset with random data.\n const animationSteps = 100\n const dataSets = []\n for (let i = 0; i < animationSteps; i += 1) {\n // [0, 1]\n const interpolation = i / (animationSteps - 1)\n if (interpolation === 0) {\n dataSets.push(temperatureData.data)\n } else {\n const interpolatedDataSet = []\n for (let column = 0; column < columns; column += 1) {\n const columnValues = []\n interpolatedDataSet.push(columnValues)\n for (let row = 0; row < rows; row += 1) {\n columnValues.push(temperatureData.data[column][row] + interpolation * randomData[row][column])\n }\n }\n dataSets.push(interpolatedDataSet)\n }\n }\n\n // Animate continuous interpolation between temperature data set and offset with random data.\n let dAnimation = 0\n let tPrevAnimationUpdate = window.performance.now()\n let activeDataSetIndex = 0\n const animationDurationMs = 5000\n const updateAnimation = () => {\n const tNow = window.performance.now()\n const dDelta = tNow - tPrevAnimationUpdate\n dAnimation += dDelta\n // Calculate animation position as [0, 1] where 0 = exact temperature data and 1 = exact temperature + random data.\n const a = dAnimation % animationDurationMs\n const animationPosition =\n a < animationDurationMs / 2\n ? a / (animationDurationMs / 2)\n : 1 - (a - animationDurationMs / 2) / (animationDurationMs / 2)\n\n const dataSetIndex = Math.round(animationPosition * (dataSets.length - 1))\n if (dataSetIndex !== activeDataSetIndex) {\n activeDataSetIndex = dataSetIndex\n // Change displayed heat map data set.\n heatmap.invalidateIntensityValues(dataSets[dataSetIndex])\n }\n\n tPrevAnimationUpdate = tNow\n requestAnimationFrame(updateAnimation)\n }\n updateAnimation()\n })\n })\n\n// Load picture of USA map.\nconst bgImg = new Image()\nbgImg.crossOrigin = ''\nbgImg.src =\n new URL(document.head.baseURI).origin +\n new URL(document.head.baseURI).pathname +\n `examples/assets/1110/${theme.isDark ? 'usa.png' : 'usa-light.png'}`\n\n// Style Chart series background as the picture.\nchart.setSeriesBackgroundFillStyle(\n new ImageFill({\n source: bgImg,\n fitMode: ImageFitMode.Stretch,\n }),\n)\n\n// Utility function for converting Fahrenheit to Celsius\nconst fahrenheitToCelsius = (celsius) => {\n return (celsius - 32) * (5 / 9)\n}\n\n// Maintain static aspect ratio of series area.\n// Size of X and Y axes is configured manually here to know the exact size distribution of the chart.\nconst leftAxisSizePx = 80\nconst bottomAxisSizePx = 60\naxisX.setThickness(bottomAxisSizePx)\naxisY.setThickness(leftAxisSizePx)\n\nconst updateChartAspectRatio = () => {\n const chartBounds = chart.engine.container.getBoundingClientRect()\n const seriesAreaSizePx = {\n x: Math.ceil(chartBounds.width - leftAxisSizePx),\n y: Math.ceil(chartBounds.height - bottomAxisSizePx),\n }\n\n // height / width\n const mapAspectRatio = 883 / 1600\n const curAspectRatio = seriesAreaSizePx.y / seriesAreaSizePx.x\n\n if (curAspectRatio < mapAspectRatio) {\n // Add horizontal chart padding to maintain Map picture aspect ratio.\n const targetAxisWidth = seriesAreaSizePx.y / mapAspectRatio\n const horizontalPadding = Math.max(seriesAreaSizePx.x - targetAxisWidth, 0)\n chart.setPadding({ left: horizontalPadding / 2, right: horizontalPadding / 2, top: 0, bottom: 0 })\n } else if (curAspectRatio > mapAspectRatio) {\n // Add vertical chart padding to maintain Map picture aspect ratio.\n const targetAxisHeight = seriesAreaSizePx.x * mapAspectRatio\n const verticalPadding = Math.max(seriesAreaSizePx.y - targetAxisHeight, 0)\n chart.setPadding({ top: verticalPadding / 2, bottom: verticalPadding / 2, left: 0, right: 16 })\n }\n}\nupdateChartAspectRatio()\n\n// Maintain chart aspect ratio when window is resized.\nwindow.addEventListener('resize', updateChartAspectRatio)\n\n// Add slider user interface for adjusting heat map transparency.\nconst exampleContainer = document.getElementById('chart') || document.body\nconst uiDiv = document.createElement('div')\nchart.engine.container.append(uiDiv)\nuiDiv.style.position = 'absolute'\nuiDiv.style.left = '6px'\nuiDiv.style.bottom = '6px'\nuiDiv.style.zIndex = '999'\nuiDiv.style.color = 'white'\nuiDiv.style.display = 'flex'\nuiDiv.style.flexDirection = 'row'\nuiDiv.style.color =\n (exampleContainer.parentElement.parentElement && window.getComputedStyle(exampleContainer.parentElement.parentElement).color) || 'white'\nconst label = document.createElement('span')\nuiDiv.append(label)\nlabel.innerHTML = 'Heat map transparency'\nconst slider = document.createElement('input')\nuiDiv.append(slider)\nslider.type = 'range'\nslider.min = 0\nslider.max = 255\nslider.value = 150\nsetHeatmapPalette(slider.value)\nslider.oninput = (e) => setHeatmapPalette(slider.value)\n","url":null,"readme":"Example on geographical data visualization by laying a 2D heatmap over a picture of a map.\n\nThis example displays a heat map data set of temperature grid measurements on the area of the United States. In geographical data visualization, grid measurements mean that data points are layed with regular latitude and longitude steps.\n\nThe data set used in this example has 500 columns (longitude) and 400 rows (latitude). This translates to roughly 12 km step between longitude measurements and 6 km step between latitude measurements. The total number of measurements is 200 000 data points.\n\nThe visualization is done by laying a predefined picture of a map under the heatmap, which is styled with transparent colours. This approach is simple, but only suitable when the geographical view is predefined.\n\nLightningChart JS can also be combined with mapping solutions such as [Leaflet](https://leafletjs.com/), which allows the combination of interactive, dynamic maps and the data visualization power of LightningChart.\n\nThe picture used in this example is quite low resolution (1600 x 883 px), if a high resolution picture is used, then zooming and panning can be enabled. Otherwise, the map picture would stretch and not look very good.\n\n# Real-Time Geographical Data Visualization\n\nThis example also generates a random data set that is used to showcase the real-time capabilities of LightningChart JS - the heat map visualization is animated continuously with smooth 60 refresh rate. Traditionally, this kind of applications do not exist in web pages because it requires too much processing power and results in bad user experience. However, LightningCharts real-time performance oriented heat map features enable running this example as well as even more stressful usage cases on desktop, mobile and tablet devices while leaving plenty of resources for the rest of the web page.\n\nTo learn more about the ground-breaking performance differences between LightningChart and traditional data visualization tools, please refer to our [performance comparison studies](https://lightningchart.com/high-performance-javascript-charts/).\n\n**More map examples**:\n\n- [Data visualization over LightningChart JS Map Charts](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1103-mapChartVizXY.html)\n- [Data visualization over Google Maps](https://blog.arction.com/easy-geospatial-data-visualization-with-lightningchart-js-and-google)\n- [LightningChart JS Map Charts with Drill-down](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1111-covidDrillDownDashboard.html)\n- [Simple Countries Visualization](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1101-mapChartDynamicColor.html)\n\n# About LightningChart Heatmaps Performance\n\nSince September 2021, LightningChart JS is the proven performance leader in real-time and static heatmaps visualization in the web.\n\nAt that time, we took the initiative to compare the performance of the different commercial data visualization tools as well as open source tools, who offer generic heatmap chart solutions. You can find the study description and results [here](https://lightningchart.com/js-heatmaps-performance-comparison/).\n\nThe most important finding from this study was that the maximum data visualization capacity of LightningChart JS greatly exceeds that of any other visualization library, being able to display more than **5 billion data points**. In context of this example, this translates to the latitude/longitude step between measurements that can be interpreted.\n\nAnother performance attribute where LightningChart dominated was real-time updates - for example, updating the heatmap data displayed over this map.\nThis is a crucial feature in real-time geographical data monitoring applications.\n","image":"geoChartUsaTemperature"},{"id":"lcjs-example-1111-covidDrillDownDashboard","title":"JavaScript Drill-Down CoVID Map Dashboard","tags":["xy","map","html","palette","line","cursor","ui","customtick"],"description":"In-depth example of map dashboard with data drill-down. Visualizes relations between CoVID vaccinations and cases","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: High-performance charts with maps, interactive map charts, charting library with maps, dynamic coloring maps, several map types.","src":"/*\n * In-depth example of map dashboard with data drill-down. Visualizes relations between CoVID vaccinations and cases\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst {\n AxisScrollStrategies,\n AxisTickStrategies,\n emptyTick,\n AutoCursorModes,\n FormattingFunctions,\n LUT,\n lightningChart,\n UIElementBuilders,\n UILayoutBuilders,\n PointShape,\n ColorCSS,\n ColorRGBA,\n emptyFill,\n PalettedFill,\n SolidFill,\n emptyLine,\n synchronizeAxisIntervals,\n translatePoint,\n transparentFill,\n UIOrigins,\n MouseStyles,\n SolidLine,\n UIDraggingModes,\n Themes,\n regularColorSteps,\n} = lcjs\n\nconst dashboardRows = 4\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart().Dashboard({\n numberOfColumns: 1,\n numberOfRows: dashboardRows,\n // theme: Themes.darkGold,\n})\nconst theme = dashboard.getTheme()\n\n// NOTE: Only affects 1 country view (full drill down)\nlet showRelativeValuesState = true\n\nconst lutNewCasesPerMillion = new LUT({\n interpolate: true,\n steps: [\n { value: -1, color: ColorRGBA(0, 0, 0) },\n { value: -0.1, color: ColorRGBA(0, 0, 0) },\n ...regularColorSteps(0, 1000, theme.examples.badGoodColorPalette.reverse()),\n ],\n})\n\nconst lutPeopleVaccinatedPerHundred = new LUT({\n interpolate: true,\n steps: [\n { value: -1, color: ColorRGBA(0, 0, 0) },\n { value: -0.1, color: ColorRGBA(0, 0, 0) },\n ...regularColorSteps(0, 100, theme.examples.badGoodColorPalette.reverse()),\n ],\n})\n\nconst highValueThresholds = {\n new_cases_per_million: 1000,\n hosp_patients_per_million: 100,\n icu_patients_per_million: 50,\n}\n\nconst drillDownRoutes = {\n World: [\n {\n mapType: 'NorthAmerica',\n boundary: {\n bottomLeft: { x: 0.04, y: 0.52 },\n topRight: { x: 0.44, y: 0.93 },\n },\n },\n {\n mapType: 'SouthAmerica',\n boundary: {\n bottomLeft: { x: 0.16, y: 0.14 },\n topRight: { x: 0.45, y: 0.5 },\n },\n },\n {\n mapType: 'Europe',\n boundary: {\n bottomLeft: { x: 0.45, y: 0.64 },\n topRight: { x: 0.6, y: 0.93 },\n },\n },\n {\n mapType: 'Africa',\n boundary: {\n bottomLeft: { x: 0.46, y: 0.15 },\n topRight: { x: 0.63, y: 0.64 },\n },\n },\n {\n mapType: 'Asia',\n boundary: {\n bottomLeft: { x: 0.59, y: 0.4 },\n topRight: { x: 0.95, y: 0.91 },\n },\n },\n ],\n}\n\nconst drillDownTip = dashboard\n .addUIElement(UILayoutBuilders.Column, dashboard.coordsRelative)\n .setOrigin(UIOrigins.RightTop)\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\nconst drillDownTipIn = drillDownTip\n .addElement(UIElementBuilders.TextBox)\n .setTextFont((font) => font.setSize(10))\n .setText('Left click to drill down at mouse location')\nconst drillDownTipOut = drillDownTip\n .addElement(UIElementBuilders.TextBox)\n .setTextFont((font) => font.setSize(10))\n .setText('Double left click to zoom out')\n\nconst drillDownOutButton = dashboard\n .addUIElement(UIElementBuilders.TextBox, dashboard.coordsRelative)\n .setOrigin(UIOrigins.LeftTop)\n .setText('Zoom out')\n .setTextFont((font) => font.setSize(20))\n .setDraggingMode(UIDraggingModes.notDraggable)\n .setMouseStyle(MouseStyles.Point)\n\ndashboard.onResize(() => {\n const dbBounds = dashboard.engine.container.getBoundingClientRect()\n drillDownTip.setPosition({ x: dbBounds.width - 8, y: dbBounds.height - 40 })\n drillDownOutButton.setPosition({ x: 8, y: dbBounds.height - 8 })\n})\n;(async () => {\n let covidData\n let vaccinationData\n let countriesData\n await Promise.all([\n new Promise(async (resolve) => {\n console.time('loading covid data')\n covidData = await fetch(\n new URL(document.head.baseURI).origin +\n new URL(document.head.baseURI).pathname +\n 'examples/assets/1111/owid-covid-data.json',\n ).then((r) => r.json())\n console.timeEnd('loading covid data')\n resolve()\n }),\n new Promise(async (resolve) => {\n console.time('loading covid vaccinations data')\n vaccinationData = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1111/vaccinations.json',\n ).then((r) => r.json())\n console.timeEnd('loading covid vaccinations data')\n resolve()\n }),\n new Promise(async (resolve) => {\n console.time('loading country locations data')\n countriesData = await fetch(\n new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1111/countries.json',\n ).then((r) => r.json())\n console.timeEnd('loading country locations data')\n resolve()\n }),\n ])\n\n let totalCasesTimelineView\n const newCasesHistoryDataTimeStart = new Date(2020, 10, 1).getTime()\n const activateTotalCasesTimelineView = () => {\n console.time('calculate new cases history')\n const newCasesHistoryDataMap = new Map()\n const vaccinatedHistoryDataMap = new Map()\n for (const countryCode of Object.keys(covidData)) {\n const countryCovidData = covidData[countryCode]\n for (let i = 0; i < countryCovidData.data.length; i += 1) {\n const sample = countryCovidData.data[i]\n const newCases = sample.new_cases\n if (newCases !== undefined) {\n const curSum = newCasesHistoryDataMap.get(sample.date)\n if (curSum) {\n newCasesHistoryDataMap.set(sample.date, curSum + newCases)\n } else {\n newCasesHistoryDataMap.set(sample.date, newCases)\n }\n }\n }\n\n const countryVaccinationData = vaccinationData.find((item) => item.iso_code === countryCode)\n for (let i = 0; i < countryVaccinationData.data.length; i += 1) {\n const sample = countryVaccinationData.data[i]\n const peopleVaccinatedPerHundred = sample.people_vaccinated_per_hundred\n if (peopleVaccinatedPerHundred !== undefined) {\n const cur = vaccinatedHistoryDataMap.get(sample.date)\n if (cur) {\n cur.count += 1\n cur.sum += peopleVaccinatedPerHundred\n } else {\n vaccinatedHistoryDataMap.set(sample.date, { count: 1, sum: peopleVaccinatedPerHundred })\n }\n }\n }\n }\n\n const newCasesHistoryDataXY = Array.from(newCasesHistoryDataMap.entries())\n .map(([dateIso, newCases]) => ({\n x: ISODateToTime(dateIso),\n y: newCases,\n }))\n .filter((point) => point.x >= newCasesHistoryDataTimeStart)\n .sort((a, b) => a.x - b.x)\n const vaccinatedPerHundredHistoryDataXY = Array.from(vaccinatedHistoryDataMap.entries())\n .map(([dateIso, value]) => ({\n x: ISODateToTime(dateIso),\n y: value.sum / value.count,\n }))\n .filter((point) => point.x >= newCasesHistoryDataTimeStart)\n .sort((a, b) => a.x - b.x)\n newCasesHistoryDataMap.clear()\n vaccinatedHistoryDataMap.clear()\n\n const timelineChart = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: 1,\n })\n .setTitle('Global CoVID daily new cases history')\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setMouseInteractions(false)\n\n const timeLineHighlighterAxis = timelineChart\n .addAxisX({ opposite: true })\n .setTickStrategy(AxisTickStrategies.Empty)\n .setStrokeStyle(emptyLine)\n .setMouseInteractions(false)\n const timeLineHighlighter = timeLineHighlighterAxis\n .addCustomTick(UIElementBuilders.PointableTextBox)\n .setMouseInteractions(true)\n .setAllocatesAxisSpace(false)\n .setTextFormatter((time) => new Date(time).toLocaleDateString('fin', {}))\n synchronizeAxisIntervals(timelineChart.getDefaultAxisX(), timeLineHighlighterAxis)\n\n timelineChart\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveX' } })\n .setCursorInterpolationEnabled(false)\n .add(newCasesHistoryDataXY)\n timelineChart\n .getDefaultAxisY()\n .setMouseInteractions(false)\n .setTitle('New daily cases')\n .setTitleFont((font) => font.setSize(12))\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setFormattingFunction(FormattingFunctions.NumericUnits))\n .fit(false)\n\n const axisVaccinated = timelineChart\n .addAxisY({ opposite: true })\n .setTitle('Vaccinated once (%)')\n .setTitleFont((font) => font.setSize(12))\n .setMouseInteractions(false)\n .setInterval({ start: 0, end: 100 })\n timelineChart\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveX' }, yAxis: axisVaccinated })\n .setCursorInterpolationEnabled(false)\n .add(vaccinatedPerHundredHistoryDataXY)\n .setStrokeStyle(\n new SolidLine({\n thickness: 2,\n fillStyle: new PalettedFill({\n lookUpProperty: 'y',\n lut: lutPeopleVaccinatedPerHundred,\n }),\n }),\n )\n\n timelineChart.getDefaultAxisX().setTickStrategy(AxisTickStrategies.DateTime).setMouseInteractions(false).fit(false)\n timeLineHighlighter.onMouseDrag((_, event) => {\n const locationAxis = timelineChart.translateCoordinate(event, timelineChart.coordsAxis)\n const displayTimeNew = Math.min(Math.max(locationAxis.x, newCasesHistoryDataTimeStart), tMax)\n timeLineHighlighter.setValue(displayTimeNew)\n if (totalCasesTimelineView.onChange) {\n totalCasesTimelineView.onChange(displayTimeNew)\n }\n })\n timeLineHighlighter.onMouseEnter((_, e) => {\n timelineChart.engine.setMouseStyle(MouseStyles.Horizontal)\n })\n timeLineHighlighter.onMouseLeave((_, e) => {\n timelineChart.engine.setMouseStyle(MouseStyles.Default)\n })\n console.timeEnd('calculate new cases history')\n\n totalCasesTimelineView = {\n chart: timelineChart,\n highlighter: timeLineHighlighter,\n onChange: () => {},\n deactivate: () => {\n timelineChart.dispose()\n totalCasesTimelineView = undefined\n },\n }\n return totalCasesTimelineView\n }\n\n let activeDisplayedTime = new Date(2022, 2, 11)\n let tMax = ISODateToTime(covidData['FIN'].data[covidData['FIN'].data.length - 1].date)\n let tLastMapViewChange = 0\n\n const activateMapView = async (mapType) => {\n tLastMapViewChange = window.performance.now()\n totalCasesTimelineView = totalCasesTimelineView || activateTotalCasesTimelineView()\n\n // Drill down available\n drillDownTipIn.setVisible(true)\n if (mapType !== 'World') {\n // Return view available\n drillDownTipOut.setVisible(true)\n drillDownOutButton.setVisible(true)\n } else {\n drillDownTipOut.setVisible(false)\n drillDownOutButton.setVisible(false)\n }\n\n dashboard.setRowHeight(0, 4).setRowHeight(1, 1)\n for (let i = 2; i < dashboardRows; i += 1) {\n dashboard.setRowHeight(i, 0)\n }\n\n const mapChart = dashboard\n .createMapChart({\n columnIndex: 0,\n rowIndex: 0,\n type: mapType,\n })\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setMouseInteractions(false)\n .setPadding({ top: 40 })\n\n const mapChartXY = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n })\n .setTitle('')\n .setBackgroundFillStyle(transparentFill)\n .setSeriesBackgroundFillStyle(transparentFill)\n .setSeriesBackgroundStrokeStyle(emptyLine)\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setMouseInteractions(false)\n\n mapChartXY.forEachAxis((axis) => axis.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine))\n\n mapChart.onViewChange((view) => {\n mapChartXY.setPadding({\n left: view.margin.left,\n right: view.margin.right,\n top: view.margin.top,\n bottom: view.margin.bottom,\n })\n mapChartXY.getDefaultAxisX().setInterval({\n start: view.longitudeRange.start,\n end: view.longitudeRange.end,\n })\n mapChartXY.getDefaultAxisY().setInterval({\n start: view.latitudeRange.start,\n end: view.latitudeRange.end,\n })\n })\n\n mapChart.setFillStyle(\n new PalettedFill({\n lut: lutPeopleVaccinatedPerHundred,\n }),\n )\n\n const scatterSeries = mapChartXY\n .addPointSeries({ pointShape: PointShape.Circle })\n .setIndividualPointSizeEnabled(true)\n .setIndividualPointValueEnabled(true)\n .setPointFillStyle(new PalettedFill({ lut: lutNewCasesPerMillion }))\n .setMouseInteractions(false)\n\n const setDisplayTime = (time, updateTimeLineBand = false) => {\n activeDisplayedTime = time\n const timeNumber = time.getTime()\n const timeIso = dateToIsoString(time)\n\n mapChart.setTitle(`CoVID vaccinations & new cases | ${time.toLocaleDateString('fin', {})}`)\n\n scatterSeries.clear()\n\n mapChart.invalidateRegionValues((region, prev) => {\n const countryCode = region.ISO_A3\n const countryCovidData = covidData[countryCode]\n const countryVaccinationData = vaccinationData.find((item) => item.iso_code === countryCode)\n const countryInformation = countriesData.find((item) => item.cca3 === countryCode)\n if (countryCovidData && countryVaccinationData && countryInformation) {\n const covidSample = countryCovidData.data.find((sample) => sample.date === timeIso)\n const smoothedNewCasesPerMillion = covidSample && covidSample.new_cases_smoothed_per_million\n\n let peopleVaccinatedPerHundred\n for (let i = countryVaccinationData.data.length - 1; i >= 0; i -= 1) {\n const vaccinationSample = countryVaccinationData.data[i]\n if (vaccinationSample.people_vaccinated_per_hundred !== undefined) {\n const sampleDateTime = ISODateToTime(vaccinationSample.date)\n if (sampleDateTime <= timeNumber) {\n peopleVaccinatedPerHundred = vaccinationSample.people_vaccinated_per_hundred\n break\n }\n }\n }\n\n if (smoothedNewCasesPerMillion !== undefined && peopleVaccinatedPerHundred !== undefined) {\n // Add point to scatter chart.\n const latitude = countryInformation.latlng[0]\n const longitude = countryInformation.latlng[1]\n const pointSize =\n smoothedNewCasesPerMillion === 0\n ? 0\n : clampNumber((25 * smoothedNewCasesPerMillion) / 1000, mapType === 'World' ? 1 : 5, 25)\n scatterSeries.add({\n countryCode,\n smoothedNewCasesPerMillion,\n peopleVaccinatedPerHundred,\n x: longitude,\n y: latitude,\n value: smoothedNewCasesPerMillion,\n size: pointSize,\n })\n\n // Return value is used for map region coloring.\n return peopleVaccinatedPerHundred\n }\n }\n return -1\n })\n\n if (updateTimeLineBand && totalCasesTimelineView) {\n // Update displayed time line position.\n totalCasesTimelineView.highlighter.setValue(time.getTime())\n }\n }\n setDisplayTime(activeDisplayedTime, true)\n\n let shouldUpdateTimeRange\n totalCasesTimelineView.onChange = (value) => {\n shouldUpdateTimeRange = new Date(value)\n }\n const intervalUpdateTimeRange = setInterval(() => {\n if (shouldUpdateTimeRange) {\n setDisplayTime(shouldUpdateTimeRange)\n shouldUpdateTimeRange = undefined\n }\n }, 1000 / 60)\n\n const container = document.getElementById('chart-container') || document.body\n const containerOverlayCursor = document.createElement('div')\n container.append(containerOverlayCursor)\n const chartOverlayCursor = lightningChart()\n .ChartXY({\n container: containerOverlayCursor,\n theme,\n })\n .setTitle('')\n .setPadding({ left: 0, bottom: 0, right: 0, top: 14 })\n .setMouseInteractions(false)\n .setBackgroundFillStyle(theme.cursorResultTableFillStyle)\n chartOverlayCursor\n .setBackgroundFillStyle(emptyFill)\n .setBackgroundStrokeStyle(emptyLine)\n .setSeriesBackgroundFillStyle(emptyFill)\n .setSeriesBackgroundStrokeStyle(emptyLine)\n chartOverlayCursor.engine.setBackgroundFillStyle(emptyFill)\n chartOverlayCursor.getDefaultAxisY().dispose()\n chartOverlayCursor.getDefaultAxisX().setAnimationScroll(false)\n const chartOverlayUi = chartOverlayCursor\n .addUIElement(UILayoutBuilders.Column)\n .setPosition({ x: 0, y: 100 })\n .setOrigin(UIOrigins.LeftTop)\n .setBackground((background) => background.setStrokeStyle(emptyLine).setFillStyle(emptyFill))\n const ChartOverlayItem = (text) => chartOverlayUi.addElement(UIElementBuilders.TextBox).setText(text)\n const chartOverlayTitle = ChartOverlayItem('')\n if (!theme.isDark) {\n chartOverlayTitle.setTextFillStyle(new SolidFill({ color: ColorCSS('rgb(255,255,255)') }))\n }\n const ChartOverlaySeries = (colorCss, label, highValue, format, dataSet) => {\n const fill = new SolidFill({ color: ColorCSS(colorCss) })\n const yAxis = chartOverlayCursor\n .addAxisY()\n .setInterval({ start: 0, end: highValue, stopAxisAfter: false })\n .setScrollStrategy(AxisScrollStrategies.expansion)\n return {\n series: chartOverlayCursor\n .addLineSeries({ yAxis, dataPattern: { pattern: 'ProgressiveX' } })\n .setCursorInterpolationEnabled(false)\n .setStrokeStyle((stroke) => stroke.setFillStyle(fill)),\n label: ChartOverlayItem(label).setTextFillStyle(fill),\n valueLabel: chartOverlayCursor\n .addUIElement(UIElementBuilders.TextBox, {\n x: chartOverlayCursor.getDefaultAxisX(),\n y: yAxis,\n })\n .setOrigin(UIOrigins.RightBottom)\n .setTextFillStyle(fill)\n .setText('')\n .setBackground((background) => background.setStrokeStyle(emptyLine).setFillStyle(emptyFill)),\n format,\n dataSet,\n }\n }\n const chartOverlaySeries = {\n people_vaccinated_per_hundred: ChartOverlaySeries(\n 'rgb(0, 255, 0)',\n 'Vaccinations',\n 100,\n (sample) =>\n sample.people_vaccinated_per_hundred !== undefined ? `${sample.people_vaccinated_per_hundred.toFixed(1)}%` : undefined,\n vaccinationData,\n ),\n new_cases_per_million: ChartOverlaySeries(\n 'rgb(255, 255, 0)',\n 'New cases',\n highValueThresholds.new_cases_per_million,\n (sample) => (sample.new_cases !== undefined ? String(sample.new_cases) : undefined),\n covidData,\n ),\n hosp_patients_per_million: ChartOverlaySeries(\n 'rgb(255, 127, 0)',\n 'Hospitalized',\n highValueThresholds.hosp_patients_per_million,\n (sample) => (sample.hosp_patients !== undefined ? String(sample.hosp_patients) : undefined),\n covidData,\n ),\n icu_patients_per_million: ChartOverlaySeries(\n 'rgb(255, 0, 0)',\n 'Severe cases',\n highValueThresholds.icu_patients_per_million,\n (sample) => (sample.icu_patients !== undefined ? String(sample.icu_patients) : undefined),\n covidData,\n ),\n }\n const overlayCursorWidth = 280\n const overlayCursorHeight = 200\n containerOverlayCursor.style.position = 'absolute'\n containerOverlayCursor.style.top = '0px'\n containerOverlayCursor.style.backgroundColor = 'rgba(0,0,0,0.7)'\n containerOverlayCursor.style.border = 'solid 8px transparent'\n containerOverlayCursor.style.borderRadius = '16px'\n containerOverlayCursor.style.width = `${overlayCursorWidth}px`\n containerOverlayCursor.style.height = `${overlayCursorHeight}px`\n containerOverlayCursor.style.transition = 'left 0.2s, top 0.2s, opacity 0.5s'\n containerOverlayCursor.style.opacity = '0.0'\n containerOverlayCursor.style.pointerEvents = 'none'\n chartOverlayCursor.forEachAxis((axis) =>\n axis.setTickStrategy(AxisTickStrategies.Empty).setStrokeStyle(emptyLine).setMouseInteractions(false),\n )\n\n let cursorTarget\n let cursorActiveCountry\n let cursorLastPointedCountry\n\n mapChart.onMapDataReady(() => {\n setTimeout(() => {\n cursorTarget = { countryCode: 'ITA', x: 12.83, y: 42.83 }\n }, 500)\n })\n\n mapChartXY.onSeriesBackgroundMouseMove((_, event) => {\n const nearest = scatterSeries.solveNearestFromScreen(event)\n if (nearest) {\n cursorTarget = nearest.location\n cursorLastPointedCountry = cursorTarget.countryCode\n }\n })\n mapChartXY.onSeriesBackgroundMouseLeave(() => {\n cursorActiveCountry = undefined\n cursorTarget = undefined\n })\n const intervalUpdateCursor = setInterval(() => {\n if (cursorTarget && cursorTarget.countryCode !== cursorActiveCountry) {\n const locationWebpage = mapChartXY.translateCoordinate(cursorTarget, mapChartXY.coordsAxis, mapChartXY.coordsClient)\n const containerBounds = container.getBoundingClientRect()\n containerOverlayCursor.style.left = `${Math.max(\n locationWebpage.clientX - (overlayCursorWidth + 10 + containerBounds.left),\n 10,\n )}px`\n containerOverlayCursor.style.top = `${Math.max(\n locationWebpage.clientY - (overlayCursorHeight + 10 + containerBounds.top),\n 10,\n )}px`\n containerOverlayCursor.style.opacity = '1.0'\n chartOverlayCursor.engine.layout()\n\n const showTimeHistoryDays = 30\n const countryCovidData = covidData[cursorTarget.countryCode]\n const countryVaccinationData = vaccinationData.find((item) => item.iso_code === cursorTarget.countryCode)\n const countryInformation = countriesData.find((item) => item.cca3 === cursorTarget.countryCode)\n chartOverlayTitle.setText(`${countryInformation.name.common} previous 4 weeks`)\n const checkISODateInRange = createISODateRangeMatcher(\n new Date(activeDisplayedTime.getTime() - showTimeHistoryDays * 24 * 60 * 60 * 1000),\n activeDisplayedTime,\n )\n const covidSamplesInRange = countryCovidData.data.filter((sample) => checkISODateInRange(sample.date))\n const vaccinationSamplesInRange = countryVaccinationData.data.filter((sample) => checkISODateInRange(sample.date))\n\n for (const key of Object.keys(chartOverlaySeries)) {\n const { series, valueLabel, dataSet, format } = chartOverlaySeries[key]\n const samplesInRange = dataSet === covidData ? covidSamplesInRange : vaccinationSamplesInRange\n const data = samplesInRange\n .map((sample) => ({\n x: ISODateToTime(sample.date),\n y: sample[key] !== undefined ? sample[key] : NaN,\n }))\n .filter((sample) => !Number.isNaN(sample.y))\n series.clear().add(data)\n\n let lastValue\n for (let i = data.length - 1; i >= 0; i -= 1) {\n lastValue = data[i]\n if (!Number.isNaN(lastValue.y)) {\n break\n }\n }\n\n valueLabel.setText('')\n if (lastValue !== undefined) {\n let valueLabelText\n for (let i = samplesInRange.length - 1; i >= 0; i -= 1) {\n valueLabelText = format(samplesInRange[i])\n if (valueLabelText) break\n }\n if (valueLabelText) {\n const valueLabelPosition = { x: lastValue.x, y: lastValue.y }\n valueLabel.setText(valueLabelText).setPosition(valueLabelPosition)\n }\n }\n }\n\n cursorActiveCountry = cursorTarget.countryCode\n }\n cursorTarget = undefined\n if (!cursorActiveCountry) {\n containerOverlayCursor.style.opacity = '0.0'\n }\n }, 1000 / 60)\n\n detectMouseClicks(\n mapChartXY.onSeriesBackgroundMouseClick.bind(mapChartXY),\n mapChartXY.onSeriesBackgroundMouseDoubleClick.bind(mapChartXY),\n (e) => {\n if (window.performance.now() - tLastMapViewChange < 750) {\n return\n }\n // Attempt drill down at mouse location.\n const locationRelative = mapChartXY.translateCoordinate(e, mapChartXY.coordsRelative)\n const chartSize = mapChartXY.getSizePixels()\n const locationPercentage = { x: locationRelative.x / chartSize.x, y: locationRelative.y / chartSize.y }\n const routes = drillDownRoutes[mapType] || []\n // Attempt to drill down to a smaller map view.\n for (const route of routes) {\n if (\n locationPercentage.x >= route.boundary.bottomLeft.x &&\n locationPercentage.x <= route.boundary.topRight.x &&\n locationPercentage.y >= route.boundary.bottomLeft.y &&\n locationPercentage.y <= route.boundary.topRight.y\n ) {\n disposeChart()\n activateMapView(route.mapType)\n return\n }\n }\n\n // Drill down to nearest country\n if (cursorLastPointedCountry) {\n disposeChart()\n activateCountryView(cursorLastPointedCountry, mapType, showRelativeValuesState)\n }\n },\n (e) => {\n if (window.performance.now() - tLastMapViewChange > 2000 && mapType !== 'World') {\n disposeChart()\n activateMapView('World')\n }\n },\n )\n\n const subDrillDownOutButtonClick = drillDownOutButton.onMouseClick((_, e) => {\n if (mapType !== 'World' && window.performance.now() - tLastMapViewChange > 500) {\n disposeChart()\n activateMapView('World')\n }\n })\n\n let disposeChart = () => {\n clearInterval(intervalUpdateCursor)\n clearInterval(intervalUpdateTimeRange)\n mapChart.dispose()\n mapChartXY.dispose()\n chartOverlayCursor.dispose()\n containerOverlayCursor.remove()\n drillDownOutButton.offMouseClick(subDrillDownOutButtonClick)\n disposeChart = () => {}\n }\n }\n\n const activateCountryView = (countryCode, returnView, showRelativeValues) => {\n if (totalCasesTimelineView) {\n totalCasesTimelineView.deactivate()\n }\n\n drillDownTipIn.setVisible(false)\n drillDownTipOut.setVisible(true)\n drillDownOutButton.setVisible(true)\n\n const countryCovidData = covidData[countryCode]\n const countryVaccinationData = vaccinationData.find((item) => item.iso_code === countryCode)\n const countryInformation = countriesData.find((item) => item.cca3 === countryCode)\n\n const marginLeft = 80\n\n const Trend = (property, dataSet, title, titleY, maxY, format) => ({\n property,\n dataSet,\n title,\n titleY,\n maxY,\n format,\n })\n const trends = [\n Trend(\n 'people_vaccinated_per_hundred',\n countryVaccinationData,\n 'Vaccination rate (at least 1 vaccine)',\n 'Vaccinated (%)',\n 100,\n (value) => `${value.toFixed(1)}% received at least 1 vaccine`,\n ),\n Trend(\n showRelativeValues ? 'new_cases_per_million' : 'new_cases',\n countryCovidData,\n showRelativeValues ? 'New cases (relative to population)' : 'New cases',\n showRelativeValues ? 'per 1 million citizens' : 'New cases',\n showRelativeValues ? highValueThresholds.new_cases_per_million : undefined,\n showRelativeValues\n ? (value) => `${value.toFixed(0)} new cases per 1 million citizens`\n : (value) => `${value.toFixed(0)} new cases`,\n ),\n Trend(\n showRelativeValues ? 'hosp_patients_per_million' : 'hosp_patients',\n countryCovidData,\n showRelativeValues ? 'Hospital patients (relative to population)' : 'Hospital patients',\n showRelativeValues ? 'per 1 million citizens' : 'Hospital patients',\n showRelativeValues ? highValueThresholds.hosp_patients_per_million : undefined,\n showRelativeValues\n ? (value) => `${value.toFixed(0)} hospital patients per 1 million citizens`\n : (value) => `${value.toFixed(0)} hospital patients`,\n ),\n Trend(\n showRelativeValues ? 'icu_patients_per_million' : 'icu_patients',\n countryCovidData,\n showRelativeValues ? 'Intensive hospital care patients (relative to population)' : 'Intensive hospital care patients',\n showRelativeValues ? 'per 1 million citizens' : 'Intensive care patients',\n showRelativeValues ? highValueThresholds.icu_patients_per_million : undefined,\n showRelativeValues\n ? (value) => `${value.toFixed(0)} intensive care patients per 1 million citizens`\n : (value) => `${value.toFixed(0)} intensive care patients`,\n ),\n ].map((trend, iTrend, _trends) => {\n const chart = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: iTrend,\n })\n .setTitle(trend.title)\n .setPadding({ left: 0 })\n\n if (iTrend === 0) {\n const dashboardTitle = chart\n .addUIElement(UIElementBuilders.TextBox, chart.coordsRelative)\n .setText(`${countryInformation.name.common}`)\n .setTextFont((font) => font.setSize(22))\n .setBackground((background) => background.setFillStyle(emptyFill).setStrokeStyle(emptyLine))\n\n chart.onResize(() => {\n dashboardTitle.setPosition({ x: 140, y: chart.getSizePixels().y }).setOrigin(UIOrigins.LeftTop)\n })\n\n // Add selector for displaying relative / actual values.\n const selector = chart\n .addUIElement(UIElementBuilders.TextBox)\n .setPosition({ x: 100, y: 100 })\n .setOrigin(UIOrigins.RightTop)\n .setMargin({ top: 14, right: 24 })\n .setDraggingMode(UIDraggingModes.notDraggable)\n selector.onMouseEnter((_) => chart.engine.setMouseStyle(MouseStyles.Point))\n selector.onMouseLeave((_) => chart.engine.setMouseStyle(MouseStyles.Default))\n const setState = (displayRelative) => {\n if (displayRelative !== showRelativeValuesState) {\n showRelativeValuesState = displayRelative\n // Reload view\n disposeChart()\n activateCountryView(countryCode, returnView, displayRelative)\n }\n selector.setText(displayRelative ? 'Show actual values' : 'Show relative values')\n }\n selector.onMouseClick((_) => setState(!showRelativeValuesState))\n setState(showRelativeValuesState)\n }\n\n const axisX = chart.getDefaultAxisX().setAnimationScroll(false)\n if (iTrend < _trends.length - 1) {\n axisX\n .setMouseInteractions(false)\n .setThickness(0)\n .setStrokeStyle(emptyLine)\n .setTickStrategy(AxisTickStrategies.DateTime, (ticks) =>\n ticks\n .setGreatTickStyle(emptyTick)\n .setMajorTickStyle((major) => major.setLabelFillStyle(transparentFill).setTickStyle(emptyLine))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(transparentFill).setTickStyle(emptyLine)),\n )\n } else {\n axisX.setTickStrategy(AxisTickStrategies.DateTime)\n }\n\n const axisY = chart\n .getDefaultAxisY()\n .setTitle(trend.titleY || '')\n .setTitleFont((font) => font.setSize(12))\n .setThickness({ min: marginLeft })\n if (trend.maxY !== undefined) {\n axisY.setInterval({ start: 0, end: trend.maxY, stopAxisAfter: false }).setScrollStrategy(AxisScrollStrategies.expansion)\n }\n\n const series = chart\n .addLineSeries({\n dataPattern: { pattern: 'ProgressiveX' },\n })\n .setName(`${countryInformation.name.common}`)\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((builder, _, x, y, dataPoint) =>\n builder.addRow(`${countryInformation.name.common}`).addRow(axisX.formatValue(dataPoint.x)).addRow(trend.format(y)),\n )\n const dataXY = trend.dataSet.data\n .map((sample) => ({\n x: ISODateToTime(sample.date),\n y: sample[trend.property],\n }))\n .filter((point) => point.y !== undefined && point.x >= newCasesHistoryDataTimeStart)\n series.add(dataXY)\n\n const averageData = averagesData && averagesData[trend.property]\n let seriesAverage\n if (averageData) {\n seriesAverage = chart\n .addLineSeries({\n dataPattern: { pattern: 'ProgressiveX' },\n })\n .setName('Global average')\n .setCursorInterpolationEnabled(false)\n .setCursorResultTableFormatter((builder, _, x, y, dataPoint) =>\n builder.addRow(`Global average`).addRow(axisX.formatValue(dataPoint.x)).addRow(trend.format(y)),\n )\n .add(averageData)\n const styleNormal = series.getStrokeStyle()\n seriesAverage.setStrokeStyle(styleNormal.setFillStyle(styleNormal.getFillStyle().setA(100)))\n }\n\n return { ...trend, chart, series, seriesAverage }\n })\n\n synchronizeAxisIntervals(...trends.map((trend) => trend.chart.getDefaultAxisX()))\n\n for (let i = 0; i < dashboardRows; i += 1) {\n dashboard.setRowHeight(i, i < trends.length ? 1 : 0)\n }\n\n const returnPreviousView = () => {\n if (disposeChart) {\n disposeChart()\n }\n activateMapView(returnView)\n }\n trends.forEach((trend) => {\n detectMouseClicks(\n trend.chart.onSeriesBackgroundMouseClick.bind(trend.chart),\n trend.chart.onSeriesBackgroundMouseDoubleClick.bind(trend.chart),\n (e) => {},\n returnPreviousView,\n )\n detectMouseClicks(\n trend.chart.onBackgroundMouseClick.bind(trend.chart),\n trend.chart.onBackgroundMouseDoubleClick.bind(trend.chart),\n (e) => {},\n returnPreviousView,\n )\n })\n\n const subDrillDownOutButtonClick = drillDownOutButton.onMouseClick(() => returnPreviousView())\n\n let disposeChart = () => {\n trends.forEach((trend) => {\n trend.chart.dispose()\n })\n drillDownOutButton.offMouseClick(subDrillDownOutButtonClick)\n disposeChart = undefined\n }\n\n tLastMapViewChange = window.performance.now()\n }\n\n let averagesData\n console.time('calculate global averages')\n averagesData = {\n new_cases_per_million: [],\n hosp_patients_per_million: [],\n icu_patients_per_million: [],\n }\n for (const key of Object.keys(averagesData)) {\n const dataMap = new Map()\n for (const countryCode of Object.keys(covidData)) {\n const countryData = covidData[countryCode]\n if (!countryData) {\n continue\n }\n for (let i = 0; i < countryData.data.length; i += 1) {\n const sample = countryData.data[i]\n const curValue = sample[key]\n if (curValue !== undefined) {\n const cur = dataMap.get(sample.date)\n if (cur) {\n cur.count += 1\n cur.sum += curValue\n } else {\n dataMap.set(sample.date, { count: 1, sum: curValue })\n }\n }\n }\n }\n const dataXY = Array.from(dataMap.entries())\n .map(([dateIso, newCases]) => ({\n x: ISODateToTime(dateIso),\n y: newCases.sum / newCases.count,\n }))\n .sort((a, b) => a.x - b.x)\n .filter((point) => point.x >= newCasesHistoryDataTimeStart)\n averagesData[key] = dataXY\n }\n console.timeEnd('calculate global averages')\n\n activateMapView('World')\n})()\n\nconst createISODateRangeMatcher = (dateStart, dateEnd) => {\n const yStart = dateStart.getFullYear()\n const mStart = dateStart.getMonth()\n const dStart = dateStart.getDate()\n const yEnd = dateEnd.getFullYear()\n const mEnd = dateEnd.getMonth()\n const dEnd = dateEnd.getDate()\n const tMonth = 31\n const tYear = tMonth * 12\n const tStart = yStart * tYear + mStart * tMonth + dStart\n const tEnd = yEnd * tYear + mEnd * tMonth + dEnd\n return (isoDate) => {\n const y = Number(isoDate.substring(0, 4))\n const m = Number(isoDate.substring(5, 7)) - 1\n const d = Number(isoDate.substring(8, 10))\n const t = y * tYear + m * tMonth + d\n const result = t >= tStart && t <= tEnd\n return result\n }\n}\n\nconst ISODateToTime = (isoString) => {\n const y = Number(isoString.substring(0, 4))\n const m = Number(isoString.substring(5, 7)) - 1\n const d = Number(isoString.substring(8, 10))\n return new Date(y, m, d).getTime()\n}\n\nconst dateToIsoString = (date) => {\n return `${date.getFullYear()}-${integerToFixedLengthString(date.getMonth() + 1, 2)}-${integerToFixedLengthString(date.getDate(), 2)}`\n}\n\nconst integerToFixedLengthString = (num, len) => {\n let str = String(num)\n while (str.length < len) {\n str = `0${str}`\n }\n return str\n}\n\nconst detectMouseClicks = (onMouseClick, onMouseDoubleClick, handleSingleClick, handleDoubleClick) => {\n let tLastDoubleClick = 0\n onMouseClick((_, e) => {\n setTimeout(() => {\n if (window.performance.now() - tLastDoubleClick >= 500) {\n handleSingleClick(e)\n }\n }, 200)\n })\n onMouseDoubleClick((_, e) => {\n tLastDoubleClick = window.performance.now()\n handleDoubleClick(e)\n })\n}\n\nconst clampNumber = (num, min, max) => Math.min(Math.max(num, min), max)\n","url":null,"readme":"LightningChart JS example which showcases combination of `MapChart` and `ChartXY` features to implement a multi-dimensional data visualization. Amount of new CoVID cases in each country are displayed with a bubble (size and color represents number of new cases), while country color represents the vaccination coverage in the country (1 or more vaccines).\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/pic1.png)\n\nThe global number of daily cases as well as average vaccination coverage is displayed at the bottom. The active date that is displayed in the main chart above can be changed by dragging on the slider.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/pic2.png)\n\nBy placing mouse cursor above the main chart, a popup chart will be displayed over the nearest country from the mouse location. This chart shows the previous 4 weeks data from the active date. Depending on availability, the following data will be shown:\n\n- Vaccination coverage (1 vaccination, % of country population)\n- New CoVID cases (graph displays number relative to population, while label displays actual number of cases)\n- Hospitalized CoVID patients (graph displays number relative to population, while label displays actual number of patients)\n- Intensive care CoVID patients (graph displays number relative to population, while label displays actual number of patients)\n\nThe idea behind measurements relative to population is that the readings can be compared between countries, even if they might have different number of citizens.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/pic3.png)\n\n**Drill-down to data**\n\nBy left-clicking once, you can drill down around the mouse location. For example, clicking around the Europe area will zoom the map view into just Europe. Further more, you can drill down into a single country to show the full historical progression of that country's CoVID data.\n\nIn this view you can also compare a single country's data to the calculated average from available global data.\n\n[//]: # 'IMPORTANT: The assets will not show before README.md is built - relative path is different!'\n\n![](./assets/pic4.png)\n\nZooming back out can be done by double left-clicking.\n\n**Data sources**\n\nGeneral CoVID data is from the openly accessible _Owid Covid dataset_ found in [GitHub](https://github.com/owid/covid-19-data/tree/master/public/data).\n\nCoVID Vaccine data is referenced from the work of [Hasell, J., Mathie, E., Beltekia, D. et al. A cross-country database of COVID-19 testing. Sci Data 7, 345 (2020).](https://doi.org/10.1038/s41597-020-00688-8)\n\nContains information from [World countries by Modammed Le Doze](https://github.com/mledoze/countries), which is made available here under the [Open Database License (ODbL)](https://github.com/mledoze/countries/blob/master/LICENSE).\n\n**More map examples**:\n\n- [Data visualization over LightningChart JS Map Charts](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1103-mapChartVizXY.html)\n- [Data visualization over Google Maps](https://blog.arction.com/easy-geospatial-data-visualization-with-lightningchart-js-and-google)\n- [Simple Countries Visualization](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1101-mapChartDynamicColor.html)\n- [Data visualization over static map picture](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1110-geoChartUsaTemperature.html)\n","image":"covidDrillDownDashboard"},{"id":"lcjs-example-1300-dataGridCrypto","title":"JavaScript Data Grid Crypto Dashboard","tags":["datagrid","dashboard"],"description":"Example of Data Grid in Cryptocurrency Dashboard use case with drilldown.","metaDescription":"Example of Data Grid in Cryptocurrency Dashboard use case with drilldown.","src":"const lcjs = require('@lightningchart/lcjs')\nconst { AxisTickStrategies, emptyTick, FormattingFunctions, SolidLine, emptyFill, SolidFill, lightningChart, Themes } = lcjs\n\nconst highlightIntensity = 0.2 // [0, 1]\nconst assetsUrl = new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1300'\nconst exampleContainer = document.getElementById('chart') || document.body\nif (exampleContainer === document.body) {\n exampleContainer.style.width = '100vw'\n exampleContainer.style.height = '100vh'\n exampleContainer.style.margin = '0px'\n}\nexampleContainer.style.display = 'flex'\nexampleContainer.style.flexDirection = 'row'\nconst containerDataGrid = document.createElement('div')\ncontainerDataGrid.style.width = '60%'\ncontainerDataGrid.style.height = '100%'\nexampleContainer.append(containerDataGrid)\nconst containerDrilldown = document.createElement('div')\ncontainerDrilldown.style.width = '40%'\ncontainerDrilldown.style.height = '100%'\nexampleContainer.append(containerDrilldown)\n\nlet license = undefined\ntry {\n license = LCJS_LICENSE\n} catch (e) {}\n\nconst lc = lightningChart()\n\n/**\n * Calculate delta between open and close for given time range (1 hour, 1 day, etc.) from list of data points.\n */\nconst calcDataAtAGlance = (dataPoints, tStart, tEnd) => {\n const dataPointsOut = []\n const dataPointsLen = dataPoints.length\n for (let i = 0; i < dataPointsLen; i += 1) {\n const { date, rate } = dataPoints[i]\n if (date >= tStart && date <= tEnd) {\n dataPointsOut.push({ x: date, y: rate })\n }\n }\n let delta = 0\n if (dataPointsOut.length >= 1) {\n const rateOpen = dataPointsOut[0].y\n const rateClose = dataPointsOut[dataPointsOut.length - 1].y\n delta = (100 * rateClose) / rateOpen - 100\n }\n return { dataPoints: dataPointsOut, delta }\n}\n\nconst setDrillDown = (() => {\n let activeDrillDown\n\n return (coinInfo, coinData) => {\n if (activeDrillDown) {\n if (activeDrillDown.info === coinInfo) {\n return\n }\n activeDrillDown.dispose()\n }\n\n const { name } = coinInfo\n\n const chart = lc\n .ChartXY({\n container: containerDrilldown,\n defaultAxisX: { type: 'linear-highPrecision' },\n // theme: Themes.darkGold\n })\n .setTitle(name)\n chart\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.DateTime)\n .setIntervalRestrictions((state) => ({\n startMin: state.dataMin,\n endMax: state.dataMax,\n }))\n chart.getDefaultAxisY().dispose()\n const axisRate = chart.addAxisY({ iStack: 3 }).setTitle(`Rate $`).setMargins(10, 0)\n const seriesRate = chart\n .addPointLineAreaSeries({ dataPattern: 'ProgressiveX', yAxis: axisRate })\n .setAreaFillStyle(emptyFill)\n .setName(`${name} Rate $`)\n .appendJSON(coinData.map((p) => ({ x: p.date, y: p.rate })))\n .setCursorResultTableFormatter((builder, series, dataPoint) =>\n builder\n .addRow(series.getName())\n .addRow(timeAxis.formatValue(dataPoint.x))\n .addRow(`$${series.axisY.formatValue(dataPoint.y)}`),\n )\n\n const axisVolume = chart\n .addAxisY({ iStack: 2 })\n .setTitle(`Volume $`)\n .setMargins(10, 10)\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setFormattingFunction(FormattingFunctions.NumericUnits))\n const seriesVolume = chart\n .addAreaSeries({ yAxis: axisVolume })\n .setName(`${name} Volume $`)\n .add(coinData.map((p) => ({ x: p.date, y: p.volume })))\n .setCursorResultTableFormatter((builder, series, x, high, low) =>\n builder\n .addRow(series.getName())\n .addRow(timeAxis.formatValue(x))\n .addRow(`$${(high / 10 ** 9).toFixed(3)} B`),\n )\n\n const axisLiquidity = chart\n .addAxisY({ iStack: 1 })\n .setTitle(`Liquidity $`)\n .setMargins(10, 10)\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setFormattingFunction(FormattingFunctions.NumericUnits))\n const seriesLiquidity = chart\n .addPointLineAreaSeries({ dataPattern: 'ProgressiveX', yAxis: axisLiquidity })\n .setAreaFillStyle(emptyFill)\n .setName(`${name} Liquidity $`)\n .add(coinData.map((p) => ({ x: p.date, y: p.liquidity })))\n .setCursorResultTableFormatter((builder, series, dataPoint) =>\n builder\n .addRow(series.getName())\n .addRow(timeAxis.formatValue(dataPoint.x))\n .addRow(`$${series.axisY.formatValue(dataPoint.y)}`),\n )\n\n const axisCap = chart\n .addAxisY({ iStack: 0 })\n .setTitle(`Market Cap $`)\n .setMargins(0, 10)\n .setTickStrategy(AxisTickStrategies.Numeric, (ticks) => ticks.setFormattingFunction(FormattingFunctions.NumericUnits))\n const seriesCap = chart\n .addPointLineAreaSeries({ dataPattern: 'ProgressiveX', yAxis: axisCap })\n .setAreaFillStyle(emptyFill)\n .setName(`${name} Market Cap $`)\n .add(coinData.map((p) => ({ x: p.date, y: p.cap })))\n .setCursorResultTableFormatter((builder, series, dataPoint) =>\n builder\n .addRow(series.getName())\n .addRow(timeAxis.formatValue(dataPoint.x))\n .addRow(`$${series.axisY.formatValue(dataPoint.y)}`),\n )\n\n chart.forEachAxis((axis) => axis.setAnimationScroll(false))\n const timeAxis = chart.getDefaultAxisX()\n const axesY = [axisRate, axisVolume, axisLiquidity, axisCap]\n axesY.forEach((axis) => axis.setChartInteractionZoomByWheel(false).setChartInteractionPanByDrag(false).setMouseInteractions(false))\n\n const dispose = () => {\n chart.dispose()\n }\n\n activeDrillDown = { info: coinInfo, dispose }\n }\n})()\n\nsetTimeout(async () => {\n const dataGrid = lc.DataGrid({\n container: containerDataGrid,\n // theme: Themes.darkGold\n })\n\n const gridColHighlight = 0\n const gridColCoin = 1\n const gridColPrice = 3\n const gridColMarketCap = 4\n const gridColVolume = 5\n const gridColAllTimeHigh = 6\n const gridCol1h = 7\n const gridCol24h = 8\n const gridCol1w = 9\n\n const theme = dataGrid.getTheme()\n const fontHeader = theme.header2Font\n const fontSymbol = theme.header1Font\n const fontSymbolLong = theme.header3Font\n const textFillHeader = theme.chartTitleFillStyle\n const textFillGood = theme.examples.positiveTextFillStyle\n const textFillBad = theme.examples.negativeTextFillStyle\n const backgroundFillGood = theme.examples.positiveBackgroundFillStyle\n const backgroundFillBad = theme.examples.negativeBackgroundFillStyle\n const areaFillGood = theme.examples.positiveAreaFillStyle\n const areaFillBad = theme.examples.negativeAreaFillStyle\n const strokeGood = new SolidLine({ fillStyle: theme.examples.positiveFillStyle, thickness: 2 })\n const strokeBad = new SolidLine({ fillStyle: theme.examples.negativeFillStyle, thickness: 2 })\n const bgHighlightFill = new SolidFill({ color: theme.examples.highlightDataGridColor })\n const bgNormalFill = theme.examples.dataGridCellBackgroundFillStyle\n\n dataGrid\n .setTitle('Crypto Watch')\n .setCellsBorders({})\n .setCellsPaddings(0)\n .setCellContent(gridColHighlight, 0, ' ')\n .setCellContent(gridColCoin, 0, 2, 1, 'Coin')\n .setCellContent(gridColPrice, 0, 'Price')\n .setCellContent(gridCol1h, 0, '1h')\n .setCellContent(gridCol24h, 0, '24h')\n .setCellContent(gridCol1w, 0, '1 week')\n .setCellContent(gridColMarketCap, 0, 'Market Cap')\n .setCellContent(gridColVolume, 0, 'Volume')\n .setCellContent(gridColAllTimeHigh, 0, 'All-time High')\n .setColumnWidth(gridColHighlight, 6)\n .setColumnWidth(gridCol1h, 100)\n .setColumnWidth(gridCol24h, 100)\n .setColumnWidth(gridCol1w, 100)\n .setRowTextFont(0, fontHeader)\n .setRowBorders(0, { bottom: true })\n .setRowTextFillStyle(0, textFillHeader)\n\n const coinsInfo = await fetch(`${assetsUrl}/coins-list.json`).then((r) => r.json())\n const coinsData = new Array(coinsInfo.length).fill(0)\n\n const tNow = Date.UTC(2023, 9, 15, 24, 0, 0)\n\n for (let iCoin = 0; iCoin < coinsInfo.length; iCoin += 1) {\n const coinInfo = coinsInfo[iCoin]\n const { code, name, rate, cap, volume, allTimeHighUSD } = coinInfo\n\n const coinData = await fetch(`${assetsUrl}/${code}.json`).then((r) => r.json())\n coinsData[iCoin] = coinData\n const coinRowTop = 1 + iCoin * 2\n const coinRowBottom = coinRowTop + 1\n\n const coinIconUrl = `${assetsUrl}/${code}.png`\n const coinIconImage = new Image()\n coinIconImage.crossOrigin = '*'\n coinIconImage.src = coinIconUrl\n const icon = dataGrid.engine.addCustomIcon(coinIconImage, { height: 32 })\n\n const dataGlance1h = calcDataAtAGlance(coinData, tNow - 1 * 60 * 60 * 1000, tNow)\n const dataGlance24h = calcDataAtAGlance(coinData, tNow - 24 * 60 * 60 * 1000, tNow)\n const dataGlance1w = calcDataAtAGlance(coinData, tNow - 7 * 24 * 60 * 60 * 1000, tNow)\n\n dataGrid\n .setRowHeight(coinRowTop, 30)\n .setRowHeight(coinRowBottom, 30)\n // NOTE: First column just used for highlighting active row.\n .setCellContent(gridColHighlight, coinRowTop, 1, 2, ' ')\n .setCellContent(gridColCoin, coinRowTop, 1, 2, icon)\n .setCellPadding(gridColCoin, coinRowTop, { left: 5, right: 5 })\n .setCellPadding(gridColCoin, coinRowTop, { left: 5 })\n .setCellContent(gridColCoin + 1, coinRowTop, 1, 1, code)\n .setCellTextFont(gridColCoin + 1, coinRowTop, fontSymbol)\n .setCellTextFillStyle(gridColCoin + 1, coinRowTop, textFillHeader)\n .setCellContentAlignment(gridColCoin + 1, coinRowTop, 'left-bottom')\n .setCellContent(gridColCoin + 1, coinRowBottom, 1, 1, name)\n .setCellContentAlignment(gridColCoin + 1, coinRowBottom, 'left-top')\n .setCellTextFont(gridColCoin + 1, coinRowBottom, fontSymbolLong)\n .setCellTextFillStyle(gridColCoin + 1, coinRowBottom, textFillHeader)\n .setCellContent(gridColPrice, coinRowTop, 1, 2, `$${rate.toFixed(2)}`)\n .setCellContent(gridColMarketCap, coinRowTop, 1, 2, `$${(cap / 10 ** 9).toFixed(2)}B`)\n .setCellContent(gridColVolume, coinRowTop, 1, 2, `$${(volume / 10 ** 9).toFixed(2)}B`)\n .setCellContent(gridColAllTimeHigh, coinRowTop, 1, 2, `$${allTimeHighUSD.toFixed(2)}`)\n .setCellContent(gridCol1h, coinRowTop, `${dataGlance1h.delta >= 0 ? '+' : ''}${dataGlance1h.delta.toFixed(2)}%`)\n .setCellTextFillStyle(gridCol1h, coinRowTop, dataGlance1h.delta > 0 ? textFillGood : textFillBad)\n\n .setCellContent(gridCol1h, coinRowBottom, 'yo bro')\n .setCellContent(gridCol1h, coinRowBottom, {\n type: 'spark-area',\n data: dataGlance1h.dataPoints,\n strokeStyle: dataGlance1h.delta > 0 ? strokeGood : strokeBad,\n fillStyle: dataGlance1h.delta > 0 ? areaFillGood : areaFillBad,\n })\n .setCellBackgroundFillStyle(gridCol1h, coinRowTop, dataGlance1h.delta > 0 ? backgroundFillGood : backgroundFillBad)\n .setCellBackgroundFillStyle(gridCol1h, coinRowBottom, dataGlance1h.delta > 0 ? backgroundFillGood : backgroundFillBad)\n .setCellContent(gridCol24h, coinRowTop, `${dataGlance24h.delta >= 0 ? '+' : ''}${dataGlance24h.delta.toFixed(2)}%`)\n .setCellTextFillStyle(gridCol24h, coinRowTop, dataGlance24h.delta > 0 ? textFillGood : textFillBad)\n .setCellContent(gridCol24h, coinRowBottom, {\n type: 'spark-area',\n data: dataGlance24h.dataPoints,\n strokeStyle: dataGlance24h.delta > 0 ? strokeGood : strokeBad,\n fillStyle: dataGlance24h.delta > 0 ? areaFillGood : areaFillBad,\n })\n .setCellBackgroundFillStyle(gridCol24h, coinRowTop, dataGlance24h.delta > 0 ? backgroundFillGood : backgroundFillBad)\n .setCellBackgroundFillStyle(gridCol24h, coinRowBottom, dataGlance24h.delta > 0 ? backgroundFillGood : backgroundFillBad)\n .setCellContent(gridCol1w, coinRowTop, `${dataGlance1w.delta >= 0 ? '+' : ''}${dataGlance1w.delta.toFixed(2)}%`)\n .setCellTextFillStyle(gridCol1w, coinRowTop, dataGlance1w.delta > 0 ? textFillGood : textFillBad)\n .setCellContent(gridCol1w, coinRowBottom, {\n type: 'spark-area',\n data: dataGlance1w.dataPoints,\n strokeStyle: dataGlance1w.delta > 0 ? strokeGood : strokeBad,\n fillStyle: dataGlance1w.delta > 0 ? areaFillGood : areaFillBad,\n })\n .setCellBackgroundFillStyle(gridCol1w, coinRowTop, dataGlance1w.delta > 0 ? backgroundFillGood : backgroundFillBad)\n .setCellBackgroundFillStyle(gridCol1w, coinRowBottom, dataGlance1w.delta > 0 ? backgroundFillGood : backgroundFillBad)\n .setRowBorders(coinRowBottom, { bottom: true })\n .setColumnBorders(gridColAllTimeHigh, { right: true })\n .setColumnBorders(gridCol1h, { right: true })\n .setColumnBorders(gridCol24h, { right: true })\n }\n\n let selectedCoinIndex = 0\n dataGrid.onCellMouseEnter((cell, event) => {\n const iCoin = Math.floor((cell.row - 1) / 2)\n if (iCoin < 0) {\n return\n }\n dataGrid\n .setRowHighlight(1 + iCoin * 2, highlightIntensity)\n .setRowHighlight(1 + iCoin * 2 + 1, highlightIntensity)\n .setCellBackgroundFillStyle(gridColHighlight, 1 + iCoin * 2, bgHighlightFill)\n })\n dataGrid.onCellMouseLeave((cell, event) => {\n const iCoin = Math.floor((cell.row - 1) / 2)\n dataGrid\n .setRowHighlight(1 + iCoin * 2, selectedCoinIndex === iCoin ? highlightIntensity : 0)\n .setRowHighlight(1 + iCoin * 2 + 1, selectedCoinIndex === iCoin ? highlightIntensity : 0)\n .setCellBackgroundFillStyle(gridColHighlight, 1 + iCoin * 2, selectedCoinIndex === iCoin ? bgHighlightFill : bgNormalFill)\n })\n dataGrid.onCellMouseClick((cell, event) => {\n const iCoin = Math.floor((cell.row - 1) / 2)\n if (iCoin < 0) {\n return\n }\n dataGrid\n .setRowHighlight(1 + selectedCoinIndex * 2, false)\n .setRowHighlight(1 + selectedCoinIndex * 2 + 1, false)\n .setCellBackgroundFillStyle(gridColHighlight, 1 + selectedCoinIndex * 2, bgNormalFill)\n selectedCoinIndex = iCoin\n dataGrid\n .setRowHighlight(1 + iCoin * 2, highlightIntensity)\n .setRowHighlight(1 + iCoin * 2 + 1, highlightIntensity)\n .setCellBackgroundFillStyle(gridColHighlight, 1 + iCoin * 2, bgHighlightFill)\n setDrillDown(coinsInfo[iCoin], coinsData[iCoin])\n })\n\n dataGrid\n .setRowHighlight(1 + selectedCoinIndex * 2, highlightIntensity)\n .setRowHighlight(1 + selectedCoinIndex * 2 + 1, highlightIntensity)\n .setCellBackgroundFillStyle(gridColHighlight, 1 + selectedCoinIndex * 2, bgHighlightFill)\n setDrillDown(coinsInfo[selectedCoinIndex], coinsData[selectedCoinIndex])\n}, 1000)\n","url":null,"readme":"Example showcasing LightningChart Data Grid in a cryptocurrency dashboard use case.\n\nIn this example, we can see a handful of the commonly used features of Data Grid:\n\n- Icons\n - Currencies are identified with Icons.\n- Spark Charts\n - A lot of data can be put into small spaces with these small miniature charts.\n - In this case, for each currency the valuation history is displayed for the last hour, day and week.\n- Drill down\n - Clicking on a Data Grid row changes the drill down view on the right.\n- Highlighting\n - Actively focused row is highlighted.\n\nData Grid is a dynamic component, meaning that all its cell content can be changed at any point during runtime.\nFor example, this cryptocurrency dashboard could be updated every every couple seconds, displaying the latest changes in real-time.\n\nTo learn more of Data Grid, click [here](https://lightningchart.com/js-charts/datagrid/)\n\nThe data used in this example is from [Live coin watch](https://www.livecoinwatch.com/)\n","image":"dataGridCrypto","showNew":true},{"id":"lcjs-example-1301-dataGridMonitoring","title":"JavaScript Monitoring Data Grid","tags":["datagrid","dashboard"],"description":"Example of Data Grid in real-time monitoring use case.","metaDescription":"Example of Data Grid in real-time monitoring use case.","src":"const lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\n\nconst { AxisScrollStrategies, AxisTickStrategies, lightningChart, LegendBoxBuilders, Themes } = lcjs\nconst { createProgressiveTraceGenerator } = xydata\n\nlet license = undefined\ntry {\n license = LCJS_LICENSE\n} catch (e) {}\n\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart({\n license: license,\n}).Dashboard({\n // theme: Themes.darkGold\n numberOfRows: 1,\n numberOfColumns: 2,\n})\n\nconst chartXY = dashboard\n .createChartXY({\n columnIndex: 0,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n })\n .setTitle('ChartXY')\n\nconst timeOriginDate = new Date()\ntimeOriginDate.setHours(0)\ntimeOriginDate.setMinutes(0)\ntimeOriginDate.setSeconds(0)\nconst timeOrigin = timeOriginDate.getTime()\nchartXY\n .getDefaultAxisX()\n .setTickStrategy(AxisTickStrategies.Time, (ticks) =>\n ticks.setTimeOrigin(((timeOriginDate.getHours() * 60 + timeOriginDate.getMinutes()) * 60 + timeOriginDate.getSeconds()) * 1000),\n )\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 10 * 1000, stopAxisAfter: false }))\n .setAnimationScroll(false)\n\nconst seriesSMA = chartXY\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n automaticColorIndex: 3,\n })\n .setDataCleaning({ minDataPointCount: 1 })\n .setName('Moving average')\n\nconst seriesValue = chartXY\n .addLineSeries({\n dataPattern: {\n pattern: 'ProgressiveX',\n },\n automaticColorIndex: 0,\n })\n .setDataCleaning({ minDataPointCount: 1 })\n .setName('Value')\n\nconst legend = chartXY.addLegendBox(LegendBoxBuilders.HorizontalLegendBox).add(chartXY)\n\nconst dataGrid = dashboard\n .createDataGrid({\n columnIndex: 1,\n rowIndex: 0,\n columnSpan: 1,\n rowSpan: 1,\n })\n .setTitle('DataGrid')\n .setColumnWidth(0, { min: 140 })\n .setColumnWidth(1, { min: 140 })\n .setColumnWidth(2, { min: 140 })\n\n// Stream live timestamp data into series.\n\n// Application displays timestamps as offset from when application started (starts at 00:00:00).\nconst dataGridContent = [['Time', 'Value', 'Moving Average']]\n\nconst smaPeriodSize = 50\nconst lastNSamples = []\n\ncreateProgressiveTraceGenerator()\n .setNumberOfPoints(10 * 1000)\n .generate()\n .setStreamBatchSize(1)\n .setStreamInterval(20)\n .toStream()\n .forEach((p) => {\n const sample = {\n // TimeTickStrategy interprets values as milliseconds (UNIX timestamp).\n // Exactly same as JavaScript Date APIs.\n x: Date.now() - timeOrigin,\n y: p.y,\n }\n\n lastNSamples.push(sample.y)\n if (lastNSamples.length > smaPeriodSize) {\n lastNSamples.shift()\n }\n const sma = lastNSamples.reduce((prev, cur) => prev + cur, 0) / lastNSamples.length\n\n // Add new data point to XY line series.\n seriesValue.add(sample)\n seriesSMA.add({ x: sample.x, y: sma })\n\n // Add new Row into DataGrid for the data point.\n const sampleDateTime = new Date(sample.x + timeOrigin)\n dataGridContent.splice(1, 0, [\n `${sampleDateTime.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n hour12: false,\n })}:${milliSeconds(sampleDateTime)}`,\n `${sample.y.toFixed(2)}`,\n `${sma.toFixed(2)}`,\n ])\n\n // Limit number of rows.\n dataGridContent.length = Math.min(dataGridContent.length, 25)\n\n dataGrid.removeCells().setTableContent(dataGridContent)\n })\n\nconst milliSeconds = (date) => {\n let str = String(date.getMilliseconds())\n while (str.length < 3) {\n str = `0${str}`\n }\n return str\n}\n","url":null,"readme":"Example showcasing use of LightningChart JS Data Grid in a real-time monitoring use case.\n\nThis application simulates real-time data coming in at high speed.\nData is then displayed both in a scrolling line chart and a Data Grid.\n\nAt such high input rate, the information may be very difficult to spot from the Data Grid. To aid this, the Data Grid cells may be color coded similarly to a _heat map_. For example, for potentially problematic values the cell text or background could be colored red.\n\nIn this kind of case, the Data Grid allows displaying data that traditional line charts can not, for example supplementary measurements like temperature, streaming latency, etc.\n\nFor more information about LightningChart JS Data Grid, click [here](https://lightningchart.com/js-charts/datagrid/)\n","image":"dataGridMonitoring"},{"id":"lcjs-example-1302-dataGridMonitoringHeatmap","title":"JavaScript Monitoring Data Grid Heatmap","tags":["datagrid","dashboard"],"description":"Example of Data Grid in real-time monitoring use case with dynamic cell coloring heatmap","metaDescription":"Example of Data Grid in real-time monitoring use case with dynamic cell coloring heatmap","src":"const lcjs = require('@lightningchart/lcjs')\nconst xydata = require('@lightningchart/xydata')\n\nconst {\n AxisScrollStrategies,\n AxisTickStrategies,\n emptyLine,\n synchronizeAxisIntervals,\n lightningChart,\n LegendBoxBuilders,\n UIElementBuilders,\n UIOrigins,\n Themes,\n} = lcjs\nconst { createProgressiveTraceGenerator } = xydata\n\nconst exampleTrends = [\n {\n name: 'Trend #1',\n },\n {\n name: 'Trend #2',\n },\n {\n name: 'Trend #3',\n },\n]\nconst exampleTrendsCount = exampleTrends.length\nconst exampleDataCount = 50 * 1000\n\nlet license = undefined\ntry {\n license = LCJS_LICENSE\n} catch (e) {}\n\n// NOTE: Using `Dashboard` is no longer recommended for new applications. Find latest recommendations here: https://lightningchart.com/js-charts/docs/basic-topics/grouping-charts/\nconst dashboard = lightningChart({\n license: license,\n})\n .Dashboard({\n // theme: Themes.darkGold\n numberOfColumns: 1,\n numberOfRows: 2,\n })\n .setRowHeight(0, 1)\n .setRowHeight(1, 0.4)\nconst chartXY = dashboard.createChartXY({ columnIndex: 0, rowIndex: 0 }).setTitle('Real-Time Chart + DataGrid')\nconst dataGrid = dashboard\n .createDataGrid({ columnIndex: 0, rowIndex: 1 })\n .setTitle('')\n .setColumnContent(0, ['', ...exampleTrends.map((trend) => trend.name)])\n .setRowContent(0, ['', 'Latest value', 'Previous value', 'value 15 s'])\n\nconst seriesXYList = exampleTrends.map((trend) =>\n chartXY\n .addLineSeries({ dataPattern: { pattern: 'ProgressiveX' } })\n .setDataCleaning({ minDataPointCount: 1 })\n .setName(trend.name),\n)\nconst axisX = chartXY\n .getDefaultAxisX()\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setDefaultInterval((state) => ({ end: state.dataMax, start: (state.dataMax ?? 0) - 60 * 1000, stopAxisAfter: false }))\n .setTickStrategy(AxisTickStrategies.Time)\n\nconst axisXTop = chartXY\n .addAxisX({ opposite: true })\n .setTickStrategy(AxisTickStrategies.Empty)\n .setStrokeStyle(emptyLine)\n .setMouseInteractions(false)\nsynchronizeAxisIntervals(axisX, axisXTop)\nconst indicator15s = axisXTop.addCustomTick(UIElementBuilders.AxisTickMajor).setTextFormatter((_) => '-15 s')\n\nconst legend = chartXY\n .addLegendBox(LegendBoxBuilders.HorizontalLegendBox, { x: chartXY.getDefaultAxisX(), y: chartXY.getDefaultAxisY() })\n .add(chartXY)\nconst positionLegend = () => {\n legend.setOrigin(UIOrigins.CenterBottom).setPosition({\n x: (chartXY.getDefaultAxisX().getInterval().start + chartXY.getDefaultAxisX().getInterval().end) / 2,\n y: chartXY.getDefaultAxisY().getInterval().start,\n })\n}\nchartXY.forEachAxis((axis) => axis.onIntervalChange(positionLegend))\n\nconst theme = dashboard.getTheme()\nconst textFillGood = theme.examples.positiveTextFillStyle\nconst textFillBad = theme.examples.negativeTextFillStyle\nconst bgFillGood = theme.examples.positiveBackgroundFillStyle\nconst bgFillBad = theme.examples.negativeBackgroundFillStyle\n\nPromise.all(\n new Array(exampleTrendsCount).fill(0).map((_) =>\n createProgressiveTraceGenerator()\n .setNumberOfPoints(exampleDataCount)\n .generate()\n .toPromise()\n .then((data) => data.map((xy) => 100 + xy.y)),\n ),\n).then((exampleData) => {\n const trendsHistory = exampleTrends.map(() => ({\n previous: 0,\n previous15s: 0,\n }))\n const tStart = Date.now()\n\n const streamOneSample = (sample, isFirst) => {\n const tNow = Date.now()\n\n seriesXYList.forEach((series, iTrend) => series.add({ x: tNow - tStart, y: sample[iTrend] }))\n\n if (isFirst) {\n trendsHistory.forEach((trendHistory, iTrend) => {\n trendHistory.previous15s = sample[iTrend]\n })\n setInterval(() => {\n trendsHistory.forEach((trendHistory, iTrend) => {\n trendHistory.previous15s = trendHistory.previous\n })\n indicator15s.setValue(Date.now() - tStart)\n }, 1000 * 15)\n }\n\n sample.forEach((value, iTrend) => {\n const trendHistory = trendsHistory[iTrend]\n const current = value\n const previous = trendHistory.previous\n const previous15s = trendHistory.previous15s\n dataGrid\n // Current\n .setCellContent(1, iTrend + 1, `${current.toFixed(1)}`)\n .setCellTextFillStyle(1, iTrend + 1, current > previous ? textFillGood : textFillBad)\n .setCellBackgroundFillStyle(1, iTrend + 1, current > previous ? bgFillGood : bgFillBad)\n // Previous\n .setCellContent(2, iTrend + 1, `${previous.toFixed(1)}`)\n .setCellTextFillStyle(2, iTrend + 1, previous > previous15s ? textFillGood : textFillBad)\n .setCellBackgroundFillStyle(2, iTrend + 1, previous > previous15s ? bgFillGood : bgFillBad)\n // Previous 15 s\n .setCellContent(3, iTrend + 1, `${previous15s.toFixed(1)}`)\n\n trendHistory.previous = current\n })\n }\n\n let iSample = 0\n const sub = setInterval(() => {\n streamOneSample(\n new Array(exampleTrendsCount).fill(0).map((_, iTrend) => exampleData[iTrend][iSample]),\n iSample === 0,\n )\n\n iSample += 1\n if (iSample >= exampleDataCount) {\n clearInterval(sub)\n }\n }, 50)\n})\n","url":null,"readme":"Example showcasing use of LightningChart JS Data Grid in a real-time monitoring use case.\n\nThis application simulates real-time data coming in at high speed.\nData is then displayed both in a scrolling line chart and a Data Grid.\n\nMore specifically, this example highlights the use of Data Grid text and background coloring to highlight the meaning of data. For example, red color may indicate a bad value. Human eye is quite bad at perceiving meaning of trend data (like in line charts), whereas brightly colored indicators can be very fast to understand. However, the use is very case specific.\n\nFor more information about LightningChart JS Data Grid, click [here](https://lightningchart.com/js-charts/datagrid/)\n","image":"dataGridMonitoringHeatmap"},{"id":"lcjs-example-1400-histogramGaussian","title":"JavaScript Histogram of Gaussian Distribution.","tags":["bar","histogram"],"description":"Example of a Histogram visualization using the Bar Chart.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * A histogram of a normally distributed data.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, AxisTickStrategies, BarChartTypes, BarChartSorting, Themes } = lcjs\n\nconst numberOfBins = 100\nconst numberOfDataPoints = 50000\n\n// Function for generating normally distributed data\nconst generateGaussianRandom = (length) => {\n const samples = []\n for (let i = 0; i < length; i++) {\n let u = 0,\n v = 0,\n s = 0\n while (s === 0 || s >= 1) {\n u = Math.random() * 2 - 1\n v = Math.random() * 2 - 1\n s = u * u + v * v\n }\n const temp = Math.sqrt((-2 * Math.log(s)) / s)\n const sample = u * temp\n samples.push(sample)\n }\n return samples\n}\n\n// Function for calculating the histogram bins from 1D numerical array\nconst calculateHistogramBins = (data, numberOfBins) => {\n const minValue = Math.min(...data)\n const maxValue = Math.max(...data)\n const binSize = (maxValue - minValue) / numberOfBins\n\n // Calculate bin intervals\n const bins = []\n for (let i = 0; i < numberOfBins; i++) {\n const binStart = minValue + i * binSize\n const binEnd = minValue + (i + 1) * binSize\n bins.push({\n binStart: Math.round(binStart * 100) / 100,\n binEnd: Math.round(binEnd * 100) / 100,\n values: Array(),\n })\n }\n bins[numberOfBins - 1].binEnd = maxValue\n\n // Map data to bins\n data.forEach((value) => {\n const binIndex = Math.floor((value - minValue) / binSize)\n if (binIndex >= 0 && binIndex < numberOfBins) {\n bins[binIndex].values.push(value)\n }\n })\n\n // Create input data for bar chart\n const barChartData = []\n bins.forEach((interval) => {\n barChartData.push({\n category: `${(interval.binStart + (interval.binStart === minValue ? 0 : 0.01)).toFixed(2)}—${\n interval.binEnd < 0 ? `(${interval.binEnd.toFixed(2)})` : interval.binEnd.toFixed(2)\n }`,\n value: interval.values.length,\n })\n })\n return barChartData\n}\n\n// Generate the data\nconst values = generateGaussianRandom(numberOfDataPoints)\nconst histogramData = calculateHistogramBins(values, numberOfBins)\n\nconst barChart = lightningChart()\n .BarChart({\n // theme: Themes.darkGold\n type: BarChartTypes.Vertical,\n })\n .setTitle('Histogram')\n .setSorting(BarChartSorting.Disabled)\n .setValueLabels(undefined)\n .setData(histogramData)\n .setCursorResultTableFormatter((builder, category, value, bar) =>\n builder.addRow('Range:', '', category).addRow('Amount of values:', '', bar.chart.valueAxis.formatValue(value)),\n )\n\nconst barDiv = barChart.engine.container\n\nconst inputDiv = document.createElement('div')\nbarDiv.append(inputDiv)\ninputDiv.style.position = 'absolute'\ninputDiv.style.top = '0'\n\nconst label = document.createElement('label')\ninputDiv.append(label)\nlabel.innerHTML = 'Number of bins:'\nlabel.style.position = 'relative'\n\nconst binInput = document.createElement('input')\ninputDiv.append(binInput)\nbarChart.setTitleMargin({ top: 25, bottom: -10 })\nbinInput.type = 'number'\nbinInput.min = '1'\nbinInput.max = '1000'\nbinInput.value = '100'\nbinInput.style.position = 'relative'\nbinInput.style.height = '30px'\n\nbinInput.addEventListener('input', () => {\n const inputValue = parseInt(binInput.value)\n if (Number.isInteger(inputValue) && inputValue > 0 && inputValue <= 1000) {\n barChart.setData([])\n const histogramData = calculateHistogramBins(values, inputValue)\n barChart.setData(histogramData).setSorting(BarChartSorting.Disabled)\n }\n})\n\n// Enable grid lines\nbarChart.valueAxis.setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setGridStrokeStyle(barChart.getTheme().xAxisNumericTicks.majorTickStyle.gridStrokeStyle))\n .setMinorTickStyle((tickStyle) =>\n tickStyle.setGridStrokeStyle(barChart.getTheme().yAxisNumericTicks.minorTickStyle.gridStrokeStyle),\n ),\n)\n\n// Set same color for all bars\nconst bars = barChart.getBars()\nconst fillSTyle = bars[0].getFillStyle()\nbars.forEach((bar) => {\n bar.setFillStyle(fillSTyle)\n})\n","url":null,"readme":"Example showcasing LightningChart Histogram visualization using Bar Chart.\n\nBar Chart can be used as a histogram by calculating the bins manually using the following function:\n\n```js\nconst calculateHistogramBins = (data, numberOfBins) => {\n const minValue = Math.min(...data)\n const maxValue = Math.max(...data)\n const binSize = (maxValue - minValue) / numberOfBins\n\n // Calculate bin intervals\n const bins = []\n for (let i = 0; i < numberOfBins; i++) {\n const binStart = minValue + i * binSize\n const binEnd = minValue + (i + 1) * binSize\n bins.push({\n binStart: parseFloat(binStart.toFixed(2)),\n binEnd: parseFloat(binEnd.toFixed(2)),\n values: Array(),\n })\n }\n bins[numberOfBins - 1].binEnd = maxValue\n\n // Map data to bins\n data.forEach((value) => {\n const binIndex = Math.floor((value - minValue) / binSize)\n if (binIndex >= 0 && binIndex < numberOfBins) {\n bins[binIndex].values.push(value)\n }\n })\n\n // Create input data for bar chart\n const barChartData = []\n bins.forEach((interval) => {\n barChartData.push({\n category: `${(interval.binStart + (interval.binStart === minValue ? 0 : 0.01)).toFixed(2)}—${\n interval.binEnd < 0 ? `(${interval.binEnd.toFixed(2)})` : interval.binEnd.toFixed(2)\n }`,\n value: interval.values.length,\n })\n })\n return barChartData\n}\n```\n\nIn this example, a normally distributed dataset is generated by the [Box–Muller transform method](https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform):\n\n```js\nconst generateGaussianRandom = (length) => {\n const samples = []\n for (let i = 0; i < length; i++) {\n let u = 0,\n v = 0,\n s = 0\n while (s === 0 || s >= 1) {\n u = Math.random() * 2 - 1\n v = Math.random() * 2 - 1\n s = u * u + v * v\n }\n const temp = Math.sqrt((-2 * Math.log(s)) / s)\n const sample = u * temp\n samples.push(sample)\n }\n return samples\n}\n```\n\nIn order to preserve the bell curve shape, automatic sorting has to be turned off by `barChart.setSorting(BarChartSorting.Disabled)`\n\nThe number of histogram bins can be changed dynamically by the user using the HTML number input. The chart updates automatically from these interactions.\n","image":"histogramGaussian"},{"id":"lcjs-example-1401-histogramPopulation","title":"JavaScript Histogram of world population.","tags":["bar","histogram"],"description":"Example of a dynamic Histogram.","metaDescription":"LightningChart JS Interactive Examples. Fastest 2D & 3D JavaScript Charts: JS chart examples, covid-19 tracker chart, racing bar charts, mosaic chart, 2D range bar, grouped bar charts. And more!","src":"/*\n * Histogram of world population by age per year.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, BarChartTypes, BarChartSorting, Themes } = lcjs\n\nconst barChart = lightningChart()\n .BarChart({\n // theme: Themes.darkGold\n type: BarChartTypes.Vertical,\n })\n .setSorting(BarChartSorting.Disabled)\n .setValueLabels(undefined)\n .setCursorResultTableFormatter((builder, category, value, bar) =>\n builder.addRow('Age:', '', category).addRow('Population:', '', `${bar.chart.valueAxis.formatValue(value)} thousand`),\n )\nbarChart.valueAxis.setTitle('Population (thousands)')\nbarChart.categoryAxis.setTitle('Age')\n\n// Create HTML slider for selecting year\nconst barDiv = barChart.engine.container\nconst slider = document.createElement('input')\nbarDiv.append(slider)\nbarChart.setTitleMargin({ top: 25, bottom: -10 })\nslider.type = 'range'\nslider.min = '1950'\nslider.max = '2021'\nslider.value = '1950'\nslider.style.width = '98%'\nbarDiv.style.textAlign = 'center'\nslider.style.position = 'absolute'\nslider.style.top = '0'\nslider.style.left = '1%'\nslider.addEventListener('input', () => {\n animationIsOn = false\n displayYear(slider.value)\n})\nslider.addEventListener('change', () => {\n currentYear = slider.value\n displayYear(slider.value)\n})\n\n// Event for space key to pause and continue the animation\ndocument.addEventListener('keydown', (event) => {\n if (event.key === ' ') {\n animationIsOn = !animationIsOn\n if (animationIsOn) {\n if (currentYear == 2021) currentYear = 1950\n iterateYear()\n }\n }\n})\n\nconst displayYear = (year) => {\n barChart.setData(populationData[`${year}`])\n barChart.setTitle(`${year}`)\n}\n\nlet currentYear = 1950\nlet animationIsOn = true\n// Function to move forward in years\nconst iterateYear = () => {\n if (!animationIsOn) return\n slider.value = currentYear\n displayYear(currentYear)\n if (currentYear < 2021) {\n currentYear++\n setTimeout(() => iterateYear(), 250)\n } else {\n animationIsOn = false\n }\n}\n\n// Fetch the dataset\nlet populationData\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1401/population.json')\n .then((r) => r.json())\n .then((data) => {\n populationData = data\n displayYear(1950)\n\n // Set same color for all bars\n const bars = barChart.getBars()\n const fillSTyle = bars[0].getFillStyle()\n bars.forEach((bar) => {\n bar.setFillStyle(fillSTyle)\n })\n\n setTimeout(() => iterateYear(), 1000)\n })\n","url":null,"readme":"Example showcasing LightningChart Histogram visualization using Bar Chart.\n\nIn this example, a world population dataset is visualized. The dataset is from [United Nations](https://population.un.org/wpp/Download/Standard/CSV/) and it includes world population by age per year.\n\nThis example includes a HTML slider input to select the year to be visualized. The chart updates automatically from these interactions. The automatic slider progression animation can be paused and replayed by pressing the space bar.\n","image":"histogramPopulation"},{"id":"lcjs-example-1501-staticMeshModel","title":"Static 3D Mesh Model.","tags":["meshmodel","3d"],"description":"Example of a static 3D Mesh Model.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * Static 3D Mesh Model\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst obj = require('webgl-obj-loader')\n\nconst { lightningChart, Themes } = lcjs\n\nconst chart3D = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold,\n })\n .setTitle('Asteroid 3D Model')\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1501/asteroid.obj')\n .then((response) => response.text())\n .then((data) => {\n console.log(data, 'data')\n\n const modelParsed = new obj.Mesh(data)\n console.log(modelParsed, 'modelParsed')\n\n const meshModel = chart3D\n .addMeshModel()\n .setScale(0.2)\n .setModelRotation({ x: 45, y: 0, z: 0 })\n\n .setModelGeometry({\n vertices: modelParsed.vertices,\n indices: modelParsed.indices,\n normals: modelParsed.vertexNormals,\n })\n })\n","url":null,"readme":"Example showcasing LightningChart 3D model visualization using Mesh Model Chart.\n\nTo create a Mesh Model chart, you can use the following line of code:\n\n```javascript\nconst meshModel = chart3D.addMeshModel()\n```\n\nTo render a 3D mesh model on this chart, you need to prepare the necessary data, including vertices, indices, and optionally, normals. These data can come from any 3D modeling software, such as Blender or similar tools.\n\nIn our examples, we consistently export 3D models to the .OBJ file format. To process this data into the required normals, vertices, and indices, we rely on the [webgl-obj-loader NPM library](https://www.npmjs.com/package/webgl-obj-loader) .\n\nOnce you've got your 3D model data ready in the correct format, you can easily render your model on the Mesh Model chart. This is done by using the '.setModelGeometry' function, as demonstrated in the following code:\n\n```javascript\nmeshModel.setModelGeometry({\n vertices: modelParsed.vertices,\n indices: modelParsed.indices,\n normals: modelParsed.vertexNormals,\n})\n```\n","image":"staticMeshModel","showNew":true},{"id":"lcjs-example-1502-dynamicMeshModel","title":"Dynamic coloring of 3D Mesh Model.","tags":["meshmodel","realtime","3d","palette"],"description":"Example of realtime coloring a 3D Mesh Model.","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"/*\n * Histogram of world population by age per year.\n */\n\nconst lcjs = require('@lightningchart/lcjs')\nconst obj = require('webgl-obj-loader')\n\nconst { lightningChart, PalettedFill, ColorRGBA, AxisTickStrategies, LUT, emptyFill, Themes } = lcjs\n\nconst chart = lightningChart()\n .Chart3D({\n // theme: Themes.darkGold,\n })\n .setBoundingBox({ x: 0.7, y: 0.5, z: 1 })\n .setTitle('Real-Time Airplane Temperature')\n\nchart\n .getDefaultAxes()\n .forEach((axis) =>\n axis.setTickStrategy(AxisTickStrategies.Numeric, (ticks) =>\n ticks\n .setMajorTickStyle((major) => major.setLabelFillStyle(emptyFill))\n .setMinorTickStyle((minor) => minor.setLabelFillStyle(emptyFill)),\n ),\n )\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1502/air.obj')\n .then((response) => response.text())\n .then((data) => {\n const modelParsed = new obj.Mesh(data)\n\n const model = chart\n .addMeshModel()\n .setScale(0.0025)\n .setModelGeometry({ vertices: modelParsed.vertices, indices: modelParsed.indices, normals: modelParsed.vertexNormals })\n .setHighlightOnHover(false)\n .setName('Airplane')\n\n const palette = new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n units: '°C',\n interpolate: true,\n steps: [\n { value: 0, color: ColorRGBA(0, 150, 255) },\n { value: 20, color: ColorRGBA(0, 255, 0) },\n\n { value: 40, color: ColorRGBA(200, 255, 0) },\n { value: 50, color: ColorRGBA(255, 255, 0) },\n { value: 60, color: ColorRGBA(255, 200, 0) },\n\n { value: 100, color: ColorRGBA(255, 130, 0) },\n { value: 120, color: ColorRGBA(255, 0, 0) },\n ],\n }),\n })\n\n model.setFillStyle(palette)\n\n const sensors = [\n // Engines close to the body\n { initValue: 90, value: 100, x: -0.252, y: -0.175, z: -0.25 },\n { initValue: 90, value: 100, x: 0.252, y: -0.175, z: -0.25 },\n\n // Engines far from the body\n { initValue: 110, value: 100, x: -0.52, y: -0.145, z: -0.07 },\n { initValue: 110, value: 100, x: 0.52, y: -0.145, z: -0.07 },\n\n // Nose of the plane\n { initValue: 20, value: 20, x: 0, y: -0.1, z: -1 },\n\n // Back of the plane\n { initValue: 50, value: 50, x: 0, y: -0.04, z: 0.97 },\n\n // Body ?\n { initValue: 20, value: 20, x: 0, y: -0.1, z: -0.5 },\n { initValue: 20, value: 20, x: 0, y: -0.1, z: 0 },\n { initValue: 0, value: 0, x: 0, y: -0.1, z: 0.5 },\n ]\n\n // Skip first frame to avoid possible initial lag\n requestAnimationFrame(() => {\n // Initialize an empty array to store information about each vertex's relationship with sensors.\n const vertexCoordSensorWeights = []\n\n // Set vertex values using a callback function.\n model.setVertexValues((coordsWorld) => {\n const vertexValues = []\n\n // Loop through the world coordinates of each vertex.\n for (let i = 0; i < coordsWorld.length; i += 1) {\n // Convert the vertex's world coordinates into axis coordinates.\n const locAxis = chart.translateCoordinate(coordsWorld[i], chart.coordsWorld, chart.coordsAxis)\n\n // Create an array to store sensor weights.\n const sensorWeights = new Array(sensors.length).fill(0)\n let sumOfWeights = 0\n\n // Calculate distances and weights for each sensor.\n sensors.forEach((sensor, i2) => {\n const locationDeltaX = sensor.x - locAxis.x\n const locationDeltaY = sensor.y - locAxis.y\n const locationDeltaZ = sensor.z - locAxis.z\n const dist = Math.sqrt(locationDeltaX ** 2 + locationDeltaY ** 2 + locationDeltaZ ** 2)\n const weight = dist !== 0 ? 1 / dist ** 3 : 1\n sensorWeights[i2] = weight\n sumOfWeights += weight\n })\n\n // Store sum of weights and sensor weights for each vertex.\n vertexCoordSensorWeights.push({ sumOfWeights, sensorWeights })\n\n // Calculate vertex value based on sensor values and weights.\n const vertexValue = sensors.reduce((prev, cur, i2) => prev + cur.value * sensorWeights[i2], 0) / sumOfWeights || 20\n\n // Push the vertex value to the array.\n vertexValues.push(vertexValue)\n }\n\n // Return the array of vertex values.\n return vertexValues\n })\n\n // Animation frame function.\n const frame = () => {\n // Update sensor values for animation.\n sensors.forEach((sensor, i) => {\n sensor.value = sensor.initValue + 10 * Math.sin(window.performance.now() / 500)\n })\n\n const vertexValues = []\n\n // Update vertex values using a callback function.\n model.setVertexValues((vertex) => {\n for (let i = 0; i < vertex.length; i += 1) {\n const { sumOfWeights, sensorWeights } = vertexCoordSensorWeights[i]\n\n // Calculate vertex value based on sensor values and weights.\n const vertexValue = sensors.reduce((prev, cur, i2) => prev + cur.value * sensorWeights[i2], 0) / sumOfWeights || 20\n\n // Push the vertex value to the array.\n vertexValues.push(vertexValue)\n }\n\n // Return the updated array of vertex values.\n return vertexValues\n })\n\n // Request the next animation frame.\n requestAnimationFrame(frame)\n }\n\n // Start the animation.\n frame()\n })\n\n const legend = chart.addLegendBox().add(chart)\n })\n","url":null,"readme":"This example demonstrates how to visualize 3D mesh models with customized coloring using the setVertexValues() method and PalettedFill.\n\nTo apply color to your 3D model using PalettedFill, you'll need to set values for each vertex.\n\nFirst, every vertex of the model is iterated, and a weight for every sensor is calculated for that vertex.\n\nThis weight essentially describes how close to the vertex every sensor is.\n\nThen, the sensor values are changed in real-time, and the vertex values are re-interpolated every time they do to update the colors.\n\nThis can be achieved by calling the setVertexValues() method, which accepts a callback function as an argument. This callback function should take a vertex as a parameter and return an array of colored values based on your criteria.\n\n![distance to each vertices](./assets/schema.png)\n","image":"dynamicMeshModel","showNew":true},{"id":"lcjs-example-1503-eegMeshModel","title":"EEG data visualization with 3D Mesh Model.","tags":["meshmodel","3d","line","dashboard","palette"],"description":"Visualization of EEG data with 3D Mesh Model and line charts","metaDescription":"LightningChart JS Interactive Examples. High-performance 3D JavaScript Charts: Fast 3D Charts, Scientific charts for real-time monitoring. Many 3D JavaScript chart examples with API-links.","src":"const lcjs = require('@lightningchart/lcjs')\nconst objLoader = require('webgl-obj-loader')\n\nconst {\n lightningChart,\n SolidFill,\n ColorRGBA,\n AxisTickStrategies,\n AxisScrollStrategies,\n PointStyle3D,\n PalettedFill,\n LUT,\n emptyLine,\n AutoCursorModes,\n emptyFill,\n LegendBoxBuilders,\n Themes,\n} = lcjs\n\nconst exampleContainer = document.getElementById('chart') || document.body\nif (exampleContainer === document.body) {\n exampleContainer.style.width = '100vw'\n exampleContainer.style.height = '100vh'\n exampleContainer.style.margin = '0px'\n}\nexampleContainer.style.display = 'flex'\nexampleContainer.style.flexDirection = 'row'\nconst containerTrends = document.createElement('div')\ncontainerTrends.style.width = '50%'\ncontainerTrends.style.height = '100%'\nexampleContainer.append(containerTrends)\nconst containerModel = document.createElement('div')\ncontainerModel.style.width = '50%'\ncontainerModel.style.height = '100%'\nexampleContainer.append(containerModel)\n\nconst sensors = [\n { x: 0 * 2, y: 0.52 * 2, z: 0.21 * 2, value: 120, name: 'AF3', history: [] },\n { x: 0 * 2, y: 0.55 * 2, z: 0 * 2, value: 120, name: 'AF4', history: [] },\n { x: 0.05 * 2, y: 0.4 * 2, z: -0.28 * 2, value: 120, name: 'F5', history: [] },\n { x: 0.45, y: 0.7, z: -0.2, value: 120, name: 'F6', history: [] },\n { x: 0.5, y: 0.7, z: 0.3, value: 120, name: 'FC5', history: [] },\n { x: 0.16 * 2, y: 0.4 * 2, z: 0.3 * 2, value: 120, name: 'FC6', history: [] },\n { x: -0.05 * 2, y: 0.4 * 2, z: -0.28 * 2, value: 120, name: 'T7', history: [] },\n { x: -0.45, y: 0.7, z: -0.2, value: 120, name: 'CP5', history: [] },\n { x: -0.5, y: 0.7, z: 0.3, value: 120, name: 'CP6', history: [] },\n { x: -0.16 * 2, y: 0.4 * 2, z: 0.3 * 2, value: 120, name: 'O2', history: [] },\n]\n\nconst lc = lightningChart()\n\nconst palette = new PalettedFill({\n lookUpProperty: 'value',\n lut: new LUT({\n interpolate: true,\n steps: [\n { value: -500, color: ColorRGBA(255, 0, 255), label: '' },\n { value: 0, color: ColorRGBA(0, 0, 255), label: '' },\n { value: 500, color: ColorRGBA(0, 150, 255), label: '' },\n { value: 1000, color: ColorRGBA(0, 100, 100), label: '' },\n { value: 1500, color: ColorRGBA(0, 255, 150), label: '' },\n { value: 2000, color: ColorRGBA(0, 255, 0), label: '' },\n { value: 4000, color: ColorRGBA(155, 150, 0), label: '' },\n { value: 9000, color: ColorRGBA(255, 0, 0), label: '' },\n ],\n }),\n})\n\nconst chart3D = lc\n .Chart3D({\n container: containerModel,\n // theme: Themes.darkGold\n })\n .setTitle('')\n .setSeriesBackgroundFillStyle(emptyFill)\n .setSeriesBackgroundStrokeStyle(emptyLine)\n\nconst chart = lc\n .ChartXY({\n container: containerTrends,\n // theme: Themes.darkGold\n })\n .setAutoCursorMode(AutoCursorModes.disabled)\n .setMouseInteractions(false)\n .setTitle('')\nconst axisX = chart\n .getDefaultAxisX()\n .setScrollStrategy(AxisScrollStrategies.progressive)\n .setInterval({ start: 0, end: 15000, stopAxisAfter: false })\n .setTickStrategy(AxisTickStrategies.Time)\n\nchart.getDefaultAxisY().dispose()\nconst channels = sensors.map((info, i) => {\n const iStack = sensors.length - (i + 1)\n const axisY = chart\n .addAxisY({ iStack })\n .setTitle(info.name)\n .setTitleRotation(0)\n .setStrokeStyle(emptyLine)\n .setInterval({ start: -5000, end: 9500, stopAxisAfter: false })\n .setScrollStrategy(AxisScrollStrategies.expansion)\n .setTickStrategy(AxisTickStrategies.Empty)\n .setMouseInteractions(false)\n\n // Series for displaying new data.\n const series = chart\n .addPointLineAreaSeries({\n automaticColorIndex: i,\n dataPattern: 'ProgressiveX',\n yAxis: axisY,\n })\n .setName(info.name)\n .setAreaFillStyle(emptyFill)\n .setMaxSampleCount(100_000)\n\n return {\n axisY,\n series,\n }\n})\n\nchart3D\n .getDefaultAxes()\n .forEach((axis) =>\n axis\n .setMouseInteractions(false)\n .setInterval({ start: -1, end: 1 })\n .setTickStrategy(AxisTickStrategies.Empty)\n .setStrokeStyle(emptyLine),\n )\nchart3D.setCameraAutomaticFittingEnabled(false).setCameraLocation({ x: 0.5, y: 0.4, z: 1 })\n\nconst sensorSeries = chart3D\n .addPointSeries({ individualLookupValuesEnabled: true })\n .add(sensors)\n .setPointStyle(\n new PointStyle3D.Triangulated({\n fillStyle: palette,\n size: 10,\n shape: 'sphere',\n }),\n )\nconst brainSeries = chart3D\n .addMeshModel()\n .setScale(0.26)\n .setModelLocation({ x: 0, y: 0, z: 0 })\n .setModelAlignment({\n x: 0,\n y: -1,\n z: 0.2,\n })\n .setName('Brain')\nconst headSeries = chart3D\n .addMeshModel()\n .setName('Head')\n .setScale(2)\n .setFillStyle(new SolidFill({ color: ColorRGBA(255, 255, 255, 90) }))\n .setBackfaceCullingMode('cull-back')\n\nconst loadBinaryFile = async (url) => {\n const result = await fetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + url)\n const blob = await result.blob()\n const arrayBuffer = await blob.arrayBuffer()\n const originalArray = new Int16Array(arrayBuffer)\n const chunkSize = 50000\n const arrayOfArrays = []\n for (let i = 0; i < originalArray.length; i += chunkSize) {\n const chunk = originalArray.slice(i, i + chunkSize)\n arrayOfArrays.push(chunk)\n }\n return arrayOfArrays\n}\n\nPromise.all([\n fetchFile('examples/assets/1503/brain.obj'),\n fetchFile('examples/assets/1503/head.obj'),\n loadBinaryFile('examples/assets/1503/CutData3.bin'),\n]).then((results) => {\n const brain = new objLoader.Mesh(results[0])\n const head = new objLoader.Mesh(results[1])\n const EEGdata = results[2]\n\n brainSeries.setModelGeometry({ vertices: brain.vertices, indices: brain.indices, normals: brain.vertexNormals }).setFillStyle(palette)\n headSeries.setModelGeometry({ vertices: head.vertices, indices: head.indices, normals: head.vertexNormals }).setMouseInteractions(false)\n\n const vertexCoordSensorWeights = []\n brainSeries.setVertexValues((coordsWorld) => {\n const vertexValues = []\n for (let i = 0; i < coordsWorld.length; i += 1) {\n const locAxis = chart3D.translateCoordinate(coordsWorld[i], chart3D.coordsWorld, chart3D.coordsAxis)\n\n const sensorWeights = new Array(sensors.length).fill(0)\n let sumOfWeights = 0\n sensors.forEach((sensor, i2) => {\n const locationDeltaX = sensor.x - locAxis.x\n const locationDeltaY = sensor.y - locAxis.y\n const locationDeltaZ = sensor.z - locAxis.z\n const dist = Math.sqrt(locationDeltaX ** 2 + locationDeltaY ** 2 + locationDeltaZ ** 2)\n const weight = dist !== 0 ? 1 / dist ** 3 : 1\n sensorWeights[i2] = weight\n sumOfWeights += weight\n })\n vertexCoordSensorWeights.push({ sumOfWeights, sensorWeights })\n const vertexValue = sensors.reduce((prev, cur, i2) => prev + cur.value * sensorWeights[i2], 0) / sumOfWeights\n vertexValues.push(vertexValue)\n }\n return vertexValues\n })\n\n // Stream data into series.\n let tStart = window.performance.now()\n let pushedDataCount = 0\n\n const dataPointsPerSecond = 1000 // 1000 Hz\n const xStep = 1000 / dataPointsPerSecond\n const streamData = (timestamp) => {\n const tNow = window.performance.now()\n const shouldBeDataPointsCount = Math.floor((dataPointsPerSecond * (tNow - tStart)) / 1000)\n const newDataPointsCount = Math.min(shouldBeDataPointsCount - pushedDataCount, 1000)\n if (newDataPointsCount > 0) {\n const seriesNewDataPoints = []\n for (let i = 0; i < sensors.length; i++) {\n const dataSet = EEGdata[i]\n const newDataPoints = []\n for (let iDp = 0; iDp < newDataPointsCount; iDp++) {\n const x = (pushedDataCount + iDp) * xStep\n const iData = (pushedDataCount + iDp) % dataSet.length\n const y = dataSet[iData]\n const point = { x, y }\n newDataPoints.push(point)\n }\n seriesNewDataPoints[i] = newDataPoints\n\n // Calculate average sensor value from last 100 samples ~ 100 ms this is used to smoothen the brain coloring\n sensors[i].history.push(...newDataPoints.map((p) => p.y))\n while (sensors[i].history.length > 100) {\n sensors[i].history.shift()\n }\n const avg = sensors[i].history.reduce((prev, cur) => prev + cur, 0) / sensors[i].history.length\n sensors[i].value = avg\n }\n\n channels.forEach((channel, iChannel) => channel.series.add(seriesNewDataPoints[iChannel]))\n pushedDataCount += newDataPointsCount\n\n sensorSeries.clear().add(sensors)\n const vertexValues = []\n brainSeries.setVertexValues((vertex) => {\n for (let i = 0; i < vertex.length; i += 1) {\n const { sumOfWeights, sensorWeights } = vertexCoordSensorWeights[i]\n const vertexValue = sensors.reduce((prev, cur, i2) => prev + cur.value * sensorWeights[i2], 0) / sumOfWeights || 20\n vertexValues.push(vertexValue)\n }\n return vertexValues\n })\n }\n requestAnimationFrame(streamData)\n }\n streamData()\n\n const legend = chart3D.addLegendBox(LegendBoxBuilders.HorizontalLegendBox).add(brainSeries)\n})\n\nfunction fetchFile(url) {\n return fetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + url).then((response) => {\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}`)\n }\n return response.text()\n })\n}\n","url":null,"readme":"This example demonstrates real-time visualization of brain activity and EEG data.\n\nIt involves 10 sensors, each recording 1,000 points per second. The brain is colored by interpolating between sensor values.\nEach sensor receives data from raw measurements, smoothed using a 100 ms running average.\n\nFor more information on dynamic mesh coloring, you can refer to our [dynamic mesh model example](https://lightningchart.com/lightningchart-js-interactive-examples/examples/lcjs-example-1503-dynamicMeshModel.html)\n\nTo further explore this use case, you can calculate the power spectral density for each raw sensor feed.\nHowever, this process can be resource-intensive and is typically not suitable for frontend execution. For a similar example from our .NET product line, visit [https://lightningchart.com/blog/eeg-chart/].\n","image":"eegMeshModel","showNew":true},{"id":"lcjs-example-1504-TreeMap","title":"JavaScript TreeMapChart","tags":["treemap"],"description":"Simple overview of the TreeMapChart.","metaDescription":"JavaScript Treemap example created with LightningChart JS. Supports high-performance visualization of hierarchical data. Treemap graph component for JS data applications.","src":"const lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, Themes } = lcjs\n\nconst chart = lightningChart().TreeMapChart({\n // theme: Themes.darkGold\n})\nchart.setTitle('Sector Distribution of Leading Global Companies')\nchart.setData([\n {\n name: 'TECHNOLOGY',\n children: [\n { name: 'MSFT', value: 60.34 },\n { name: 'AAPL', value: 52.75 },\n { name: 'ORCL', value: 31.25 },\n { name: 'ADBE', value: 81.71 },\n { name: 'NVDA', value: 252.82 },\n { name: 'AVGO', value: 104.86 },\n { name: 'CRM', value: 104.83 },\n { name: 'INTU', value: 66.01 },\n ],\n },\n {\n name: 'COMMUNICATION SERVICES',\n children: [\n { name: 'GOOG', value: 63.0 },\n { name: 'META', value: 206.14 },\n { name: 'NFLX', value: 75.84 },\n { name: 'DIS', value: 7.27 },\n ],\n },\n {\n name: 'CONSUMER CYCLICAL',\n children: [\n { name: 'AMZN', value: 85.7 },\n { name: 'TSLA', value: 120.46 },\n { name: 'MCD', value: 11.84 },\n { name: 'HD', value: 9.76 },\n ],\n },\n {\n name: 'FINANCIAL',\n children: [\n { name: 'V', value: 27.01 },\n { name: 'JPM', value: 28.42 },\n { name: 'BAC', value: 12.75 },\n { name: 'BRK-B', value: 17.54 },\n ],\n },\n])\n","url":null,"readme":"Simple overview of a TreeMap chart.\n\nThis type of chart is particularly useful for presenting hierarchical data in a way that's easy to understand at a glance. It can be used for financial analysis, showing market trends, or comparing the size and performance of companies within and across sectors, for example.\n\nThis chart is interactive, enabling users to click on node to drill down for more detailed information.\n\nBelow is a sample snippet for generating a TreeMap Chart using predefined data with LightningChart JS:\n\n```js\nconst treeMapChart = lightningChart().TreeMapChart()\ntreeMapChart.setData(data)\n```\n","image":"TreeMap","showNew":true},{"id":"lcjs-example-1505-TreeMapDrilldown","title":"TreeMapChart drill down","tags":["treemap"],"description":"Drilldown TreeMapChart.","metaDescription":"JavaScript Treemap example created with LightningChart JS. Supports high-performance visualization of hierarchical data. Treemap graph component for JS data applications.","src":"const lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, Themes } = lcjs\n\nconst chart = lightningChart()\n .TreeMapChart({\n // theme: Themes.darkGold\n })\n .setTitle('Python installation file sizes - Click on Node to drilldown')\n .setCursorResultTableFormatter((builder, node) => {\n builder.addRow(node.name)\n if (node.value < 2_000) builder.addRow(node.value.toFixed(0), 'B')\n else if (node.value < 2_000_000) builder.addRow((node.value / 1000).toFixed(1), 'KB')\n else if (node.value < 2_000_000_000) builder.addRow((node.value / 1000_000).toFixed(1), 'MB')\n return builder\n })\n\nfetch(new URL(document.head.baseURI).origin + new URL(document.head.baseURI).pathname + 'examples/assets/1505/file-sizes.json')\n .then((r) => r.json())\n .then((fileSizes) => {\n chart.setData(fileSizes)\n })\n","url":null,"readme":"The TreeMap chart enables users to navigate through layers of data, uncovering details.\nThis feature ensures that users can easily track their position within the data hierarchy and navigate back to broader overviews without losing context, with the help of navigation paths at the top of the chart.\n\nAdditionally, you can disable the drill-down feature or limit the number of visible node levels:\n\n```js\n// Show only 1 level of child nodes\nchart.setDisplayedLevelsCount(1)\n\n// Disable drill-down interaction\nchart.setDrillDownEnabled(false)\n```\n","image":"TreeMapDrildown","showNew":true},{"id":"lcjs-example-1506-TreeMapDynamic","title":"TreeMapChart Dynamic","tags":["treemap","realtime"],"description":"Dynamic TreeMapChart.","metaDescription":"JavaScript Treemap example created with LightningChart JS. Supports high-performance visualization of hierarchical data. Treemap graph component for JS data applications.","src":"const lcjs = require('@lightningchart/lcjs')\n\nconst { lightningChart, Themes } = lcjs\n\nconst chart = lightningChart().TreeMapChart({\n // theme: Themes.darkGold\n})\nchart.setTitle('Marketplace Product Segmentation')\n\nconst data = [\n {\n name: 'Electronics',\n children: [\n {\n name: 'Mobile Phones',\n children: [\n {\n name: 'Smartphones',\n children: [\n {\n name: 'Android',\n children: [\n { name: 'High-End', value: 10 },\n { name: 'Mid-Range', value: 10 },\n { name: 'Budget', value: 5 },\n ],\n },\n {\n name: 'iOS',\n children: [\n { name: 'Latest', value: 15 },\n { name: 'Older Models', value: 10 },\n ],\n },\n ],\n },\n { name: 'Feature Phones', value: 10 },\n ],\n },\n {\n name: 'Laptops',\n children: [\n { name: 'Ultrabooks', value: 20 },\n { name: 'Gaming Laptops', value: 10 },\n ],\n },\n {\n name: 'Cameras',\n children: [\n { name: 'DSLR', value: 10 },\n { name: 'Mirrorless', value: 5 },\n { name: 'Point & Shoot', value: 5 },\n ],\n },\n {\n name: 'Television & Video',\n children: [\n { name: 'LED TVs', value: 15 },\n { name: 'Projectors', value: 10 },\n { name: 'Streaming Devices', value: 5 },\n ],\n },\n ],\n },\n {\n name: 'Clothing',\n children: [\n {\n name: 'Men',\n children: [\n { name: 'Shirts', value: 10 },\n { name: 'Pants', value: 10 },\n {\n name: 'Accessories',\n children: [\n { name: 'Watches', value: 5 },\n { name: 'Hats', value: 5 },\n ],\n },\n ],\n },\n {\n name: 'Women',\n children: [\n { name: 'Dresses', value: 12 },\n { name: 'Outerwear', value: 8 },\n { name: 'Tops', value: 10 },\n { name: 'Bottoms', value: 10 },\n ],\n },\n {\n name: 'Children',\n children: [\n { name: 'Boys', value: 5 },\n { name: 'Girls', value: 5 },\n { name: 'Baby', value: 10 },\n ],\n },\n ],\n },\n {\n name: 'Home & Kitchen',\n children: [\n {\n name: 'Furniture',\n children: [\n { name: 'Sofas', value: 10 },\n { name: 'Chairs', value: 10 },\n { name: 'Tables', value: 5 },\n ],\n },\n {\n name: 'Decor',\n children: [\n { name: 'Vases', value: 5 },\n { name: 'Wall Art', value: 5 },\n { name: 'Ornaments', value: 5 },\n ],\n },\n {\n name: 'Kitchen Supplies',\n children: [\n { name: 'Cookware', value: 10 },\n { name: 'Appliances', value: 15 },\n { name: 'Utensils', value: 5 },\n ],\n },\n ],\n },\n {\n name: 'Books',\n children: [\n {\n name: 'Fiction',\n children: [\n { name: 'Fantasy', value: 5 },\n { name: 'Sci-Fi', value: 5 },\n { name: 'Mystery', value: 5 },\n ],\n },\n {\n name: 'Non-Fiction',\n children: [\n { name: 'Biographies', value: 5 },\n { name: 'Self-help', value: 5 },\n { name: 'History', value: 5 },\n ],\n },\n {\n name: \"Children's Books\",\n children: [\n { name: 'Storybooks', value: 5 },\n { name: 'Learning', value: 5 },\n ],\n },\n ],\n },\n {\n name: 'Toys & Games',\n children: [\n {\n name: 'Toys',\n children: [\n { name: 'Educational', value: 5 },\n { name: 'Action Figures', value: 5 },\n { name: 'Dolls', value: 5 },\n { name: 'Building Sets', value: 5 },\n ],\n },\n {\n name: 'Games',\n children: [\n { name: 'Board Games', value: 5 },\n { name: 'Video Games', value: 10 },\n { name: 'Puzzles', value: 5 },\n { name: 'Card Games', value: 5 },\n ],\n },\n ],\n },\n {\n name: 'Health & Beauty',\n children: [\n {\n name: 'Personal Care',\n children: [\n { name: 'Skincare', value: 10 },\n { name: 'Haircare', value: 10 },\n { name: 'Oral Care', value: 5 },\n ],\n },\n {\n name: 'Makeup',\n children: [\n { name: 'Face', value: 5 },\n { name: 'Eyes', value: 5 },\n { name: 'Lips', value: 5 },\n ],\n },\n {\n name: 'Healthcare',\n children: [\n { name: 'Supplements', value: 10 },\n { name: 'Equipment', value: 5 },\n { name: 'Medication', value: 5 },\n ],\n },\n ],\n },\n {\n name: 'Sports & Outdoors',\n children: [\n {\n name: 'Exercise & Fitness',\n children: [\n { name: 'Cardio Equipment', value: 10 },\n { name: 'Strength Training', value: 10 },\n { name: 'Yoga', value: 5 },\n ],\n },\n {\n name: 'Outdoor Recreation',\n children: [\n { name: 'Camping & Hiking', value: 10 },\n { name: 'Cycling', value: 10 },\n { name: 'Fishing', value: 5 },\n ],\n },\n {\n name: 'Team Sports',\n children: [\n { name: 'Soccer', value: 5 },\n { name: 'Basketball', value: 5 },\n { name: 'Baseball', value: 5 },\n ],\n },\n ],\n },\n]\n\nchart.setData(data).setDrillDownEnabled(false)\n\nchart.setCursorResultTableFormatter((builder, node) => {\n return builder.addRow(node.name).addRow(node.value.toFixed(1))\n})\n\nfunction randomizeValues(data) {\n data.forEach((item) => {\n if ('value' in item) {\n item.value *= 1.0 + 5 * Math.random()\n } else if ('children' in item) {\n randomizeValues(item.children)\n }\n })\n}\n\nsetTimeout(() => {\n randomizeValues(data)\n chart.setData(data)\n setInterval(() => {\n randomizeValues(data)\n chart.setData(data)\n }, 5000)\n}, 2000)\n","url":null,"readme":"This example showcases the dynamic, real-time behavior of the Treemap chart,\nperfect for visualizing hierarchical data such as organizational structures or financial metrics.\n\nTo update the chart, simply modify a node's value and pass the updated object to the chart using the setData method.\n\nYou have control over the chart's animations.\nAdjust the speed or disable them entirely to suit your viewing preference:\n\n```js\n// To decrease the speed\nchart.setAnimationValues(true, 0.2)\n\n// To disable animation\nchart.setAnimationValues(false)\n```\n","image":"TreeMapDynamic","showNew":true},{"id":"showcase 1","title":"Real-time scrolling","tags":null,"description":"Scrolling of large quantitities of random data in real-time, across multiple channels.","metaDescription":"","src":null,"url":"https://arction.github.io/lcjs-showcase-streamingData/","readme":"Scrolling of large quantitities of random data in real-time, across multiple channels.\n\nRendered frames-per-second (FPS) and incoming data points-per-second (PPS) are displayed on Chart.\n","image":"streaming-data-demo"},{"id":"showcase 2","title":"Static data speed test","tags":null,"description":"Measures the time (in milliseconds) required to visualize a Line Chart with 5 000 000 data points.","metaDescription":"","src":null,"url":"https://arction.github.io/lcjs-showcase-renderingSpeed/","readme":"Measures the time (in milliseconds) required to visualize a Line Chart with 5 000 000 data points.\n\nResult is shown on Chart.\n","image":"rendering-speed-demo"},{"id":"showcase 3","title":"Audio visualization","tags":null,"description":"The audio data is extracted in realtime using Web Audio API's.","metaDescription":"","src":null,"url":"https://arction.github.io/lcjs-showcase-audio/","readme":"The audio data is extracted in realtime using Web Audio API's.\n\nThe Web Audio API has an .createAnalyser() method that can be used to create a new AnalyzerNode. The AnalyzerNode has methods to get time-domain data (waveform) and frequency data which is data from Fast Fourier transform on the audio signal.\n\nThe time-domain data is shown as is on the Time Domain chart. That same data is also pushed to the Waveform history chart. This chart displays the last 1 million samples of the audio input.\n","image":"audio-visualisation-demo"}]
["xy","line","legendbox","scatter","point","spline","point-line","datapattern","step","point-cluster","rectangle","axis","realtime","datacleaning","customtick","time","high-precision","polygon","points","palette","date-time","dashboard","ui","cursor","interactions","image","heatmap","logarithmic","bar","column","group","dashed","band","constantline","3d","area","zoomband","range","spider","radar","web","radial","gauge","pie","donut","funnel","pyramid","sliced","box","whiskers","violin","marker","html","spectrogram","audio","surface","mesh","lidar","polar","map","datagrid","histogram","meshmodel","treemap"]