diff --git a/.gitignore b/.gitignore index b31a349ad..e878845f5 100644 --- a/.gitignore +++ b/.gitignore @@ -187,3 +187,7 @@ temp/gh-pages /.fsdocs /tmp/watch /output +/src/Plotly.NET.ImageExport/.local-chromium +/src/Plotly.NET.ImageExport/testrenders +/src/Plotly.NET.Interactive/.local-chromium/ +/docs/.local-chromium/ diff --git a/Plotly.NET.sln b/Plotly.NET.sln index da7661dcc..9568ab057 100644 --- a/Plotly.NET.sln +++ b/Plotly.NET.sln @@ -51,6 +51,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "content", "content", "{60FB82C0-F472-494E-BCF7-7B3C54212406}" ProjectSection(SolutionItems) = preProject docs\0_0_basics.fsx = docs\0_0_basics.fsx + docs\0_1_image-export.fsx = docs\0_1_image-export.fsx docs\1_0_axis-styling.fsx = docs\1_0_axis-styling.fsx docs\1_1_errorbars.fsx = docs\1_1_errorbars.fsx docs\1_2_multiple-charts.fsx = docs\1_2_multiple-charts.fsx @@ -102,6 +103,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "img", "img", "{CDB973F2-0F6 docs\img\logo.png = docs\img\logo.png EndProjectSection EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Plotly.NET.ImageExport", "src\Plotly.NET.ImageExport\Plotly.NET.ImageExport.fsproj", "{6CFC629E-1A0C-4EF3-8495-BA00A356A381}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -127,6 +130,12 @@ Global {0F135E3B-B0E1-42A9-B180-18C0221DC7B8}.Dotnet|Any CPU.Build.0 = Debug|Any CPU {0F135E3B-B0E1-42A9-B180-18C0221DC7B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F135E3B-B0E1-42A9-B180-18C0221DC7B8}.Release|Any CPU.Build.0 = Release|Any CPU + {6CFC629E-1A0C-4EF3-8495-BA00A356A381}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CFC629E-1A0C-4EF3-8495-BA00A356A381}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CFC629E-1A0C-4EF3-8495-BA00A356A381}.Dotnet|Any CPU.ActiveCfg = Debug|Any CPU + {6CFC629E-1A0C-4EF3-8495-BA00A356A381}.Dotnet|Any CPU.Build.0 = Debug|Any CPU + {6CFC629E-1A0C-4EF3-8495-BA00A356A381}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6CFC629E-1A0C-4EF3-8495-BA00A356A381}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build.fsx.lock b/build.fsx.lock index cfe87901e..73316be79 100644 --- a/build.fsx.lock +++ b/build.fsx.lock @@ -144,11 +144,11 @@ NUGET FSharp.Core (>= 4.7.2) FParsec (1.1.1) FSharp.Core (>= 4.3.4) - FSharp.Compiler.Service (39.0) - FSharp.Core (5.0.1) - Microsoft.Build.Framework (>= 16.6) - Microsoft.Build.Tasks.Core (>= 16.6) - Microsoft.Build.Utilities.Core (>= 16.6) + FSharp.Compiler.Service (40.0) + FSharp.Core (5.0.2) + Microsoft.Build.Framework (>= 16.9) + Microsoft.Build.Tasks.Core (>= 16.9) + Microsoft.Build.Utilities.Core (>= 16.9) System.Buffers (>= 4.5.1) System.Collections.Immutable (>= 5.0) System.Diagnostics.Process (>= 4.3) @@ -173,7 +173,7 @@ NUGET FSharp.Control.Reactive (5.0.2) FSharp.Core (>= 4.7.2) System.Reactive (>= 5.0) - FSharp.Core (5.0.1) + FSharp.Core (5.0.2) Microsoft.Build (16.10) Microsoft.Build.Framework (16.10) System.Security.Permissions (>= 4.7) @@ -213,27 +213,27 @@ NUGET System.Security.AccessControl (>= 5.0) System.Security.Principal.Windows (>= 5.0) Mono.Posix.NETStandard (1.0) - MSBuild.StructuredLogger (2.1.500) + MSBuild.StructuredLogger (2.1.507) Microsoft.Build (>= 16.4) Microsoft.Build.Framework (>= 16.4) Microsoft.Build.Tasks.Core (>= 16.4) Microsoft.Build.Utilities.Core (>= 16.4) Newtonsoft.Json (13.0.1) - NuGet.Common (5.9.1) - NuGet.Frameworks (>= 5.9.1) - NuGet.Configuration (5.9.1) - NuGet.Common (>= 5.9.1) + NuGet.Common (5.10) + NuGet.Frameworks (>= 5.10) + NuGet.Configuration (5.10) + NuGet.Common (>= 5.10) System.Security.Cryptography.ProtectedData (>= 4.4) - NuGet.Frameworks (5.9.1) - NuGet.Packaging (5.9.1) + NuGet.Frameworks (5.10) + NuGet.Packaging (5.10) Newtonsoft.Json (>= 9.0.1) - NuGet.Configuration (>= 5.9.1) - NuGet.Versioning (>= 5.9.1) + NuGet.Configuration (>= 5.10) + NuGet.Versioning (>= 5.10) System.Security.Cryptography.Cng (>= 5.0) System.Security.Cryptography.Pkcs (>= 5.0) - NuGet.Protocol (5.9.1) - NuGet.Packaging (>= 5.9.1) - NuGet.Versioning (5.9.1) + NuGet.Protocol (5.10) + NuGet.Packaging (>= 5.10) + NuGet.Versioning (5.10) Octokit (0.50) runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) diff --git a/docs/0_1_image-export.fsx b/docs/0_1_image-export.fsx new file mode 100644 index 000000000..6df06f805 --- /dev/null +++ b/docs/0_1_image-export.fsx @@ -0,0 +1,185 @@ +(** +--- +title: Static image export +category: General +categoryindex: 1 +index: 2 +--- +*) + + +(*** hide ***) + +(*** condition: prepare ***) +#r "nuget: Newtonsoft.JSON, 12.0.3" +#r "nuget: PuppeteerSharp" +#r "../bin/Plotly.NET/netstandard2.0/Plotly.NET.dll" +#r "../bin/Plotly.NET.ImageExport/netstandard2.0/Plotly.NET.ImageExport.dll" + +(*** condition: ipynb ***) +#if IPYNB +#r "nuget: Plotly.NET, {{fsdocs-package-version}}" +#r "nuget: Plotly.NET.Interactive, {{fsdocs-package-version}}" +#r "nuget: Plotly.NET.ImageExport, {{fsdocs-package-version}}" +#endif // IPYNB + + +(** +[![Binder]({{root}}img/badge-binder.svg)](https://mybinder.org/v2/gh/plotly/Plotly.NET/gh-pages?filepath={{fsdocs-source-basename}}.ipynb)  +[![Script]({{root}}img/badge-script.svg)]({{root}}{{fsdocs-source-basename}}.fsx)  +[![Notebook]({{root}}img/badge-notebook.svg)]({{root}}{{fsdocs-source-basename}}.ipynb) + +# Static image export + +### Table of contents + +- [Saving static images](#Saving-static-images) +- [Generating URIs for static chart images](#Generating-URIs-for-static-chart-images) +- [Including static images in dotnet interactive notebooks](#Including-static-images-in-dotnet-interactive-notebooks) + +As Plotly.NET generates static html pages that contain charts rendered by plotly.js, static image export needs a lot more overhead under the hood +than you might expect. The underlying renderer needs to execute javascript, leading to the usage of headless browsers. + +The package `Plotly.NET.ImageExport` contains extensions for Plotly.NET to render static images. It is designed with extensibility in mind and +it is very easy to add a new rendering engine. The current engines are provided: + +| Rendering engine | Type | Prerequisites | +|-|-|-| +| [PuppeteerSharp](https://github.com/hardkoded/puppeteer-sharp) | headless browser | [read more here](https://github.com/hardkoded/puppeteer-sharp#prerequisites) | + +## Saving static images + +By referencing the `Plotly.NET.ImageExport` package, you get access to: + + - jpg via `Chart.SaveJPG` + - png via `Chart.SavePNG` + - svg via `Chart.SaveSVG` + +(and Extensions for C# style fluent interfaces by opening the `GenericChartExtensions` namespace) + +The parameters for all three functions are exactly the same. +*) + +open Plotly.NET +open Plotly.NET.ImageExport + +let exampleChart = + Chart.Histogram2dContour( + [1.;2.;2.;4.;5.], + [1.;2.;2.;4.;5.] + ) + +(***do-not-eval***) +exampleChart +|> Chart.saveJPG( + "/your/path/without/extension/here", + Width=300, + Height=300 +) + +(*** condition: ipynb ***) +#if IPYNB +let imgString = $"""""" +DisplayExtensions.DisplayAs(imgString,"text/html") +#endif // IPYNB + +(***hide***) +$"""""" +(***include-it-raw***) + +(** +## Generating URIs for static chart images + +By referencing the `Plotly.NET.ImageExport` package, you get access to: + + - jpg via `Chart.toBase64JPGString` + - png via `Chart.toBase64PNGString` + - svg via `Chart.toSVGString` + +(and Extensions for C# style fluent interfaces by opening the `GenericChartExtensions` namespace) + +*) + +let base64JPG = + exampleChart + |> Chart.toBase64JPGString( + Width=300, + Height=300 + ) + +(** +It is very easy to construct a html tag that includes this image via a base64 uri. For SVGs, +not even that is necessary and just the SVG string can be used. +*) + +(***do-not-eval***) +$"""""" + +(*** condition: ipynb ***) +#if IPYNB +let imgString = $"""""" +DisplayExtensions.DisplayAs(imgString,"text/html") +#endif // IPYNB + +(***hide***) +$"""""" + +(***include-it-raw***) + +(** +SVGs can be included without the image tag: +*) + +let svgString = + exampleChart + |> Chart.toSVGString( + Width=300, + Height=300 + ) + +svgString.Substring(0,300) +|> printfn "%s" + +(***include-output***) + +(** +In fact, the images shown on this site are included just the same way. + +## Including static images in dotnet interactive notebooks + +To include the images in dotnet interactive, convert them to html tags as above and include them via +dotnet interactive's `DisplayAs` function. The content type for PNG/JPB is "text/html", and "image/svg+xml" for SVG. +*) + +let base64PNG = + exampleChart + |> Chart.toBase64PNGString( + Width=300, + Height=300 + ) + +let svgString2 = + exampleChart + |> Chart.toSVGString( + Width=300, + Height=300 + ) + +// DisplayExtensions.DisplayAs(base64PNG,"text/html") +// DisplayExtensions.DisplayAs(svgString,"image/svg+xml") + +(*** condition: ipynb ***) +#if IPYNB +DisplayExtensions.DisplayAs(base64PNG,"text/html") +DisplayExtensions.DisplayAs(svgString,"image/svg+xml") +#endif // IPYNB \ No newline at end of file diff --git a/src/Plotly.NET.ImageExport/ChartExtensions.fs b/src/Plotly.NET.ImageExport/ChartExtensions.fs new file mode 100644 index 000000000..b4c7dffbc --- /dev/null +++ b/src/Plotly.NET.ImageExport/ChartExtensions.fs @@ -0,0 +1,251 @@ +namespace Plotly.NET.ImageExport + +open System +open System.IO + +open Plotly.NET +open GenericChart +open System.Runtime.InteropServices +open System.Runtime.CompilerServices + +/// Extensions methods from Plotly.NET.ImageExport for the Chart module, supporting the fluent pipeline style +[] +module ChartExtensions = + + type internal RenderOptions + ( + ?EngineType: ExportEngine, + ?Width : int, + ?Height : int + ) = + member _.Engine = (defaultArg EngineType ExportEngine.PuppeteerSharp) |> ExportEngine.getEngine + member _.Width = defaultArg Width 600 + member _.Height = defaultArg Height 600 + + type Chart with + + /// + /// Returns an async function that converts a GenericChart to a base64 encoded JPG string + /// + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member toBase64JPGStringAsync + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + let opts = RenderOptions(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + fun (gChart:GenericChart) -> opts.Engine.RenderJPGAsync(opts.Width, opts.Height, gChart) + + /// + /// Returns a function that converts a GenericChart to a base64 encoded JPG string + /// + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member toBase64JPGString + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + fun (gChart:GenericChart) -> + gChart + |> Chart.toBase64JPGStringAsync(?EngineType=EngineType, ?Width=Width, ?Height=Height) + |> Async.RunSynchronously + + /// + /// Returns an async function that saves a GenericChart as JPG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member saveJPGAsync + ( + path: string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + let opts = RenderOptions(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + fun (gChart:GenericChart) -> opts.Engine.SaveJPGAsync(path, opts.Width, opts.Height, gChart) + + /// + /// Returns a function that saves a GenericChart as JPG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member saveJPG + ( + path: string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + fun (gChart:GenericChart) -> + gChart + |> Chart.saveJPGAsync(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + |> Async.RunSynchronously + + /// + /// Returns an async function that converts a GenericChart to a base64 encoded PNG string + /// + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member toBase64PNGStringAsync + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + let opts = RenderOptions(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + fun (gChart:GenericChart) -> opts.Engine.RenderPNGAsync(opts.Width, opts.Height, gChart) + + /// + /// Returns a function that converts a GenericChart to a base64 encoded PNG string + /// + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member toBase64PNGString + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + fun (gChart:GenericChart) -> + gChart + |> Chart.toBase64PNGStringAsync(?EngineType=EngineType, ?Width=Width, ?Height=Height) + |> Async.RunSynchronously + + /// + /// Returns an async function that saves a GenericChart as PNG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member savePNGAsync + ( + path: string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + let opts = RenderOptions(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + fun (gChart:GenericChart) -> opts.Engine.SavePNGAsync(path, opts.Width, opts.Height, gChart) + + + /// + /// Returns a function that saves a GenericChart as PNG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member savePNG + ( + path: string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + fun (gChart:GenericChart) -> + gChart + |> Chart.savePNGAsync(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + |> Async.RunSynchronously + + /// + /// Returns an async function that converts a GenericChart to a SVG string + /// + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member toSVGStringAsync + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + let opts = RenderOptions(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + fun (gChart:GenericChart) -> opts.Engine.RenderSVGAsync(opts.Width, opts.Height, gChart) + + /// + /// Returns a function that converts a GenericChart to a SVG string + /// + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member toSVGString + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + fun (gChart:GenericChart) -> + gChart + |> Chart.toSVGStringAsync(?EngineType=EngineType, ?Width=Width, ?Height=Height) + |> Async.RunSynchronously + + /// + /// Returns an async function that saves a GenericChart as SVG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member saveSVGAsync + ( + path: string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + let opts = RenderOptions(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + fun (gChart:GenericChart) -> opts.Engine.SaveSVGAsync(path, opts.Width, opts.Height, gChart) + + /// + /// Returns a function that saves a GenericChart as SVG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + static member saveSVG + ( + path: string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + fun (gChart:GenericChart) -> + gChart + |> Chart.saveSVGAsync(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + |> Async.RunSynchronously \ No newline at end of file diff --git a/src/Plotly.NET.ImageExport/ExportEngine.fs b/src/Plotly.NET.ImageExport/ExportEngine.fs new file mode 100644 index 000000000..3a0a2da8c --- /dev/null +++ b/src/Plotly.NET.ImageExport/ExportEngine.fs @@ -0,0 +1,12 @@ +namespace Plotly.NET.ImageExport + +///DU containing the available static image export engines for Plotly.NET +type ExportEngine = + /// Using this engine will use PuppeteerSharp with a Chromium headless browser to render GenericCharts from Plotly.NET. + | PuppeteerSharp + + static member getEngine (engineType: ExportEngine) = + match engineType with + ///This engine uses PuppeteerSharp to render GenericCharts as static images using a chromium headless browser. + | PuppeteerSharp -> + PuppeteerSharpRenderer() :> IGenericChartRenderer \ No newline at end of file diff --git a/src/Plotly.NET.ImageExport/GenericChartExtensions.fs b/src/Plotly.NET.ImageExport/GenericChartExtensions.fs new file mode 100644 index 000000000..604fc6f10 --- /dev/null +++ b/src/Plotly.NET.ImageExport/GenericChartExtensions.fs @@ -0,0 +1,224 @@ +namespace Plotly.NET.ImageExport + +open Plotly.NET +open GenericChart +open System +open System.Runtime.InteropServices +open System.Runtime.CompilerServices + +///Extension methods for providing a Plotly.NET.ImageExport fluent interface pattern for C# +[] +module GenericChartExtensions = + + type GenericChart with + + /// + /// Converts the GenericChart to a base64 encoded JPG string (async) + /// + /// + /// + /// + [] + [] + member this.ToBase64JPGStringAsync + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + this |> Chart.toBase64JPGStringAsync(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Converts the GenericChart to a base64 encoded JPG string + /// + /// + /// + /// + [] + [] + member this.ToBase64JPGString + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + this |> Chart.toBase64JPGString(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Saves the GenericChart as JPG image (async) + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + [] + member this.SaveJPGAsync + ( + path:string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + this |> Chart.saveJPGAsync(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Saves the GenericChart as JPG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + [] + member this.SaveJPG + ( + path:string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + this |> Chart.saveJPG(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Converts the GenericChart to a base64 encoded PNG string (async) + /// + /// + /// + /// + [] + [] + member this.ToBase64PNGStringAsync + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + this |> Chart.toBase64PNGStringAsync(?EngineType = EngineType, ?Width=Width, ?Height=Height) + + /// + /// Converts the GenericChart to a base64 encoded PNG string + /// + /// + /// + /// + [] + [] + member this.ToBase64PNGString + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + this |> Chart.toBase64PNGString(?EngineType = EngineType, ?Width=Width, ?Height=Height) + + /// + /// Saves the GenericChart as PNG image (async) + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + [] + member this.SavePNGAsync + ( + path:string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + this |> Chart.savePNG(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Saves the GenericChart as PNG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + [] + member this.SavePNG + ( + path:string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + this |> Chart.savePNG(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Converts the GenericChart to a SVG string (async) + /// + /// + /// + /// + [] + [] + member this.ToSVGStringAsync + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + this |> Chart.toSVGStringAsync(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Converts the GenericChart to a SVG string + /// + /// + /// + /// + [] + [] + member this.ToSVGString + ( + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + + this |> Chart.toSVGString(?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Saves the GenericChart as SVG image (async) + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + [] + member this.SaveSVGAsync + ( + path:string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + this |> Chart.saveSVGAsync(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + + /// + /// Saves the GenericChart as SVG image + /// + /// The path (without extension) where the image will be saved + /// The Render engine to use + /// width of the resulting image + /// height of the resulting image + [] + [] + member this.SaveSVG + ( + path:string, + [] ?EngineType: ExportEngine, + [] ?Width : int, + [] ?Height : int + ) = + this |> Chart.saveSVG(path, ?EngineType=EngineType, ?Width=Width, ?Height=Height) + \ No newline at end of file diff --git a/src/Plotly.NET.ImageExport/IGenericChartRenderer.fs b/src/Plotly.NET.ImageExport/IGenericChartRenderer.fs new file mode 100644 index 000000000..f366d9c15 --- /dev/null +++ b/src/Plotly.NET.ImageExport/IGenericChartRenderer.fs @@ -0,0 +1,36 @@ +namespace Plotly.NET.ImageExport +open Plotly.NET +/// +/// Interface for Engines that render Plotly.NET's GenericChart to static images. +/// +type IGenericChartRenderer = + + ///Async function that returns a base64 encoded string representing the input chart as JPG file with the given width and height + abstract member RenderJPGAsync: int * int * GenericChart.GenericChart -> Async + ///Function that returns a base64 encoded string representing the input chart as JPG file with the given width and height + abstract member RenderJPG: int * int * GenericChart.GenericChart -> string + + ///Async function that saves the input chart as JPG file with the given width and height at the given path + abstract member SaveJPGAsync: string * int * int * GenericChart.GenericChart -> Async + ///Function that saves the input chart as JPG file with the given width and height at the given path + abstract member SaveJPG: string * int * int * GenericChart.GenericChart -> unit + + ///Async function that returns a base64 encoded string representing the input chart as PNG file with the given width and height + abstract member RenderPNGAsync: int * int * GenericChart.GenericChart -> Async + ///Function that returns a base64 encoded string representing the input chart as PNG file with the given width and height + abstract member RenderPNG: int * int * GenericChart.GenericChart -> string + + ///Async function that saves the input chart as PNG file with the given width and height at the given path + abstract member SavePNGAsync: string * int * int * GenericChart.GenericChart -> Async + ///Function that saves the input chart as PNG file with the given width and height at the given path + abstract member SavePNG: string * int * int * GenericChart.GenericChart -> unit + + ///Async function that returns a string representing the input chart as SVG file with the given width and height + abstract member RenderSVGAsync: int * int * GenericChart.GenericChart -> Async + ///Function that returns string representing the input chart as SVG file with the given width and height + abstract member RenderSVG: int * int * GenericChart.GenericChart -> string + + ///Async function that saves the input chart as SVG file with the given width and height at the given path + abstract member SaveSVGAsync: string * int * int * GenericChart.GenericChart -> Async + ///Function that saves the input chart as SVG file with the given width and height at the given path + abstract member SaveSVG: string * int * int * GenericChart.GenericChart -> unit diff --git a/src/Plotly.NET.ImageExport/Playground.fsx b/src/Plotly.NET.ImageExport/Playground.fsx new file mode 100644 index 000000000..8f0975d50 --- /dev/null +++ b/src/Plotly.NET.ImageExport/Playground.fsx @@ -0,0 +1,165 @@ +#r "nuget: FSharp.Data" +#r "nuget: Deedle" +#r "nuget: FSharpAux" +#r "nuget: Newtonsoft.Json, 12.0.3" + +#load "../Plotly.NET/StyleParams.fs" +#load "../Plotly.NET/DynamicObj.fs" +#load "../Plotly.NET/Frame.fs" +#load "../Plotly.NET/Colors.fs" +#load "../Plotly.NET/StockData.fs" +#load "../Plotly.NET/Font.fs" +#load "../Plotly.NET/Pathbar.fs" +#load "../Plotly.NET/TreemapTiling.fs" +#load "../Plotly.NET/Colorbar.fs" +#load "../Plotly.NET/RangeSlider.fs" +#load "../Plotly.NET/Light.fs" +#load "../Plotly.NET/Legend.fs" +#load "../Plotly.NET/Contours.fs" +#load "../Plotly.NET/Dimensions.fs" +#load "../Plotly.NET/Domain.fs" +#load "../Plotly.NET/Line.fs" +#load "../Plotly.NET/WaterfallConnector.fs" +#load "../Plotly.NET/FunnelConnector.fs" +#load "../Plotly.NET/Box.fs" +#load "../Plotly.NET/Meanline.fs" +#load "../Plotly.NET/Marker.fs" +#load "../Plotly.NET/Hoverlabel.fs" +#load "../Plotly.NET/Axis.fs" +#load "../Plotly.NET/Bins.fs" +#load "../Plotly.NET/Cumulative.fs" +#load "../Plotly.NET/Scene.fs" +#load "../Plotly.NET/Selected.fs" +#load "../Plotly.NET/Shape.fs" +#load "../Plotly.NET/Error.fs" +#load "../Plotly.NET/Table.fs" +#load "../Plotly.NET/Trace.fs" +#load "../Plotly.NET/Trace3d.fs" +#load "../Plotly.NET/GeoProjection.fs" +#load "../Plotly.NET/Geo.fs" +#load "../Plotly.NET/MapboxLayerSymbol.fs" +#load "../Plotly.NET/MapboxLayer.fs" +#load "../Plotly.NET/Mapbox.fs" +#load "../Plotly.NET/LayoutGrid.fs" +#load "../Plotly.NET/Annotation.fs" +#load "../Plotly.NET/Layout.fs" +#load "../Plotly.NET/Template.fs" +#load "../Plotly.NET/Config.fs" +#load "../Plotly.NET/DisplayOptions.fs" +#load "../Plotly.NET/GenericChart.fs" +#load "../Plotly.NET/Chart.fs" +#load "../Plotly.NET/ChartExtensions.fs" +#load "../Plotly.NET/GenericChartExtensions.fs" +#load "../Plotly.NET/CandelstickExtension.fs" +#load "../Plotly.NET/SankeyExtension.fs" + +open Plotly.NET +open GenericChart + +open FSharp.Data +open Newtonsoft.Json +open System.Text +open System.IO +open Deedle +open FSharpAux + + +#r "nuget: PuppeteerSharp" + +open PuppeteerSharp + +#load "IGenericChartRenderer.fs" +#load "PuppeteerSharpRenderer.fs" +#load "ExportEngine.fs" +#load "ChartExtensions.fs" +#load "GenericChartExtensions.fs" + +open Plotly.NET.ImageExport +open GenericChartExtensions + +let x = [1.; 2.; 3.; 4.; 5.; 6.; 7.; 8.; 9.; 10.; ] +let y = [2.; 1.5; 5.; 1.5; 3.; 2.5; 2.5; 1.5; 3.5; 1.] +let xyz = Seq.zip3 x y x + +let simpleChart = Chart.Point([1.,1.]) + +let complexChart = + Chart.Grid( + [ + [Chart.Line(x,y); Chart.Line(x,y); Chart.Line(x,y)] + [Chart.Histogram2dContour(x,y); Chart.Point(x,y); Chart.Point(x,y)] + [Chart.Spline(x,y); Chart.Spline(x,y); Chart.Spline(x,y)] + ] + ) + +complexChart +|> Chart.Show + +simpleChart +|> Chart.saveJPG ( + __SOURCE_DIRECTORY__ + "/testrenders/simple", + EngineType = ExportEngine.PuppeteerSharp, + Width= 1000, + Height= 1000 +) + +open FSharp.Data +open Deedle + +let dataDensityMapbox = + Http.RequestString "https://raw.githubusercontent.com/plotly/datasets/master/earthquakes-23k.csv" + |> fun d -> Frame.ReadCsvString(d,true,separators=",") + +dataDensityMapbox.Print() + +let lonDensity = dataDensityMapbox.["Longitude"] |> Series.values +let latDensity = dataDensityMapbox.["Latitude"] |> Series.values +let magnitudes = dataDensityMapbox.["Magnitude"] |> Series.values + +let map = + Chart.DensityMapbox( + lonDensity, + latDensity, + Z = magnitudes, + Radius=8., + Colorscale=StyleParam.Colorscale.Viridis + ) + |> Chart.withMapbox( + Mapbox.init( + Style = StyleParam.MapboxStyle.StamenTerrain, + Center = (60.,30.) + ) + ) + + +map.SaveSVG(__SOURCE_DIRECTORY__ + "/testrenders/map") + +complexChart.SaveJPG (__SOURCE_DIRECTORY__ + "/testrenders/complex") + +simpleChart +|> Chart.savePNG (__SOURCE_DIRECTORY__ + "/testrenders/simple") + +complexChart + .WithTitle("soos") + .SavePNG(__SOURCE_DIRECTORY__ + "/testrenders/complex") + +simpleChart +|> Chart.saveSVG (__SOURCE_DIRECTORY__ + "/testrenders/simple") + +complexChart.SaveSVG (__SOURCE_DIRECTORY__ + "/testrenders/complex") + +let jpgString = + Chart.Point([1.,1.]) + + |> Chart.toBase64JPGString() + |> fun f -> File.WriteAllText(@"C:\Users\Kevin\source\repos\plotly\Plotly.NET\tests\Plotly.NET.Tests\data\testBase64JPG.txt", f) + +let pngString = + Chart.Point([1.,1.]) + |> Chart.toBase64PNGString() + |> fun f -> File.WriteAllText(@"C:\Users\Kevin\source\repos\plotly\Plotly.NET\tests\Plotly.NET.Tests\data\testBase64PNG.txt", f) + +let svgString = + Chart.Point([1.,1.]) + |> Chart.toSVGString() + |> fun f -> File.WriteAllText(@"C:\Users\Kevin\source\repos\plotly\Plotly.NET\tests\Plotly.NET.Tests\data\testSVGURI.txt", f) diff --git a/src/Plotly.NET.ImageExport/Plotly.NET.ImageExport.fsproj b/src/Plotly.NET.ImageExport/Plotly.NET.ImageExport.fsproj new file mode 100644 index 000000000..248a3dcba --- /dev/null +++ b/src/Plotly.NET.ImageExport/Plotly.NET.ImageExport.fsproj @@ -0,0 +1,43 @@ + + + + net5.0; netstandard2.0 + true + 3390;$(WarnOn) + + + + Kevin Schneider, F# open source contributors + An easily extensible library to render static images from Plotly.NET charts. + An easily extensible library to render static images from Plotly.NET charts. + MIT + https://plotly.net + logo.png + visualization charting plotly fsharp csharp jpg png svg image + https://github.com/plotly/Plotly.NET/ + git + https://github.com/plotly/Plotly.NET/blob/dev/LICENSE + https://github.com/plotly/Plotly.NET/blob/dev/RELEASE_NOTES.md + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Plotly.NET.ImageExport/PuppeteerSharpRenderer.fs b/src/Plotly.NET.ImageExport/PuppeteerSharpRenderer.fs new file mode 100644 index 000000000..426049204 --- /dev/null +++ b/src/Plotly.NET.ImageExport/PuppeteerSharpRenderer.fs @@ -0,0 +1,195 @@ +namespace Plotly.NET.ImageExport + +open Plotly.NET +open PuppeteerSharp + +open System +open System.IO +open System.Text +open System.Text.RegularExpressions + +type PuppeteerSharpRenderer() = + + /// adapted from the original C# implementation by @ilyalatt : https://github.com/ilyalatt/Plotly.NET.PuppeteerRenderer + /// + /// creates a full screen html site for the given chart + let toFullScreenHtml (gChart: GenericChart.GenericChart) = + + gChart + |> GenericChart.mapConfig(fun c -> + DynObj.setValue c "responsive" true + c + ) + |> GenericChart.mapLayout(fun l -> + DynObj.setValue l "width" "100%" + DynObj.setValue l "height" "100%" + l + ) + |> GenericChart.toChartHTML + |> fun html -> html.Replace("width: 600px; height: 600px;", "width: 100%; height: 100%;") + + /// adapted from the original C# implementation by @ilyalatt : https://github.com/ilyalatt/Plotly.NET.PuppeteerRenderer + /// + /// adds the necessary js function calls to render an image with plotly.js + let patchHtml width height (format: StyleParam.ImageFormat) html = + let regex = Regex(@"(Plotly\.newPlot\(.+?\))") + let patchedHtml = + regex.Replace( + html, + ( + fun (x:Match) -> + x.Result( + "$1" + + $".then(x => Plotly.toImage(x, {{ format: '{StyleParam.ImageFormat.toString format}', scale: 2, width: {width}, height: {height} }}))" + + ".then(img => window.plotlyImage = img)" + ) + ) + ) + patchedHtml + + /// adapted from the original C# implementation by @ilyalatt : https://github.com/ilyalatt/Plotly.NET.PuppeteerRenderer + /// + /// attempts to render a chart as static image of the given format with the given dimensions from the given html string + let tryRenderAsync (browser:Browser) (width: int) (height: int) (format: StyleParam.ImageFormat) (html: string) = + async { + let! page = browser.NewPageAsync() |> Async.AwaitTask + try + let! _ = page.SetContentAsync(patchHtml width height format html) |> Async.AwaitTask + let! imgHandle = page.WaitForExpressionAsync("window.plotlyImage") |> Async.AwaitTask + let! imgStr = imgHandle.JsonValueAsync() |> Async.AwaitTask + return imgStr + + finally + page.CloseAsync() |> Async.AwaitTask |> Async.RunSynchronously + } + + /// attempts to render a chart as static image of the given format with the given dimensions from the given html string + let tryRender (browser:Browser) (width: int) (height: int) (format: StyleParam.ImageFormat) (html: string) = + tryRenderAsync browser width height format html + |> Async.RunSynchronously + + /// Initalizes headless browser + let fetchAndLaunchBrowserAsync() = + async { + let browserFetcher = BrowserFetcher() + + let! revision = browserFetcher.DownloadAsync() |> Async.AwaitTask + + let launchOptions = LaunchOptions() + launchOptions.ExecutablePath <- revision.ExecutablePath + launchOptions.Timeout <- 60000 + + return! + Puppeteer.LaunchAsync(launchOptions) + |> Async.AwaitTask + } + + /// Initalizes headless browser + let fetchAndLaunchBrowser() = + fetchAndLaunchBrowserAsync() + |> Async.RunSynchronously + + /// skips the data type part of the given URI + let skipDataTypeString (base64:string) = + let imgBase64StartIdx =base64.IndexOf(",", StringComparison.Ordinal) + 1 + base64.Substring(imgBase64StartIdx) + + /// converst a base64 encoded string URI to a byte array + let getBytesFromBase64String (base64:string) = + base64 + |> skipDataTypeString + |> Convert.FromBase64String + + interface IGenericChartRenderer with + + member this.RenderJPGAsync (width:int, height: int, gChart:GenericChart.GenericChart) = + async { + use! browser = fetchAndLaunchBrowserAsync() + + return! + tryRenderAsync + browser + width + height + StyleParam.ImageFormat.JPEG + (gChart |> toFullScreenHtml) + } + + member this.RenderJPG (width:int, height: int, gChart:GenericChart.GenericChart) = + (this :> IGenericChartRenderer).RenderJPGAsync(width, height, gChart) + |> Async.RunSynchronously + + member this.SaveJPGAsync (path:string, width:int, height: int, gChart:GenericChart.GenericChart) = + async { + let! rendered = (this :> IGenericChartRenderer).RenderJPGAsync(width, height, gChart) + return + rendered + |> getBytesFromBase64String + |> fun base64 -> File.WriteAllBytes($"{path}.jpg", base64) + } + + member this.SaveJPG (path:string, width:int, height: int, gChart:GenericChart.GenericChart) = + (this :> IGenericChartRenderer).SaveJPGAsync(path, width, height, gChart) + |> Async.RunSynchronously + + member this.RenderPNGAsync (width:int, height: int, gChart:GenericChart.GenericChart) = + async { + use! browser = fetchAndLaunchBrowserAsync() + + return! + tryRenderAsync + browser + width + height + StyleParam.ImageFormat.PNG + (gChart |> toFullScreenHtml) + } + + member this.RenderPNG (width:int, height: int, gChart:GenericChart.GenericChart) = + (this :> IGenericChartRenderer).RenderPNGAsync(width, height, gChart) + |> Async.RunSynchronously + + member this.SavePNGAsync (path:string, width:int, height: int, gChart:GenericChart.GenericChart) = + async { + let! rendered = (this :> IGenericChartRenderer).RenderPNGAsync(width, height, gChart) + + return + rendered + |> getBytesFromBase64String + |> fun base64 -> File.WriteAllBytes($"{path}.png", base64) + } + + member this.SavePNG (path:string, width:int, height: int, gChart:GenericChart.GenericChart) = + (this :> IGenericChartRenderer).SavePNGAsync(path, width, height, gChart) + |> Async.RunSynchronously + + member this.RenderSVGAsync (width:int, height: int, gChart:GenericChart.GenericChart) = + async { + use! browser = fetchAndLaunchBrowserAsync() + + let! renderedString = + tryRenderAsync + browser + width + height + StyleParam.ImageFormat.SVG + (gChart |> toFullScreenHtml) + return + renderedString + |> fun svg -> System.Uri.UnescapeDataString(svg) + |> skipDataTypeString + } + + member this.RenderSVG (width:int, height: int, gChart:GenericChart.GenericChart) = + (this :> IGenericChartRenderer).RenderSVGAsync(width, height, gChart) + |> Async.RunSynchronously + + member this.SaveSVGAsync(path:string, width:int, height: int, gChart:GenericChart.GenericChart) = + async { + let! rendered = (this :> IGenericChartRenderer).RenderSVGAsync(width, height, gChart) + return rendered |> fun svg -> File.WriteAllText($"{path}.svg", svg) + } + + member this.SaveSVG (path:string, width:int, height: int, gChart:GenericChart.GenericChart) = + (this :> IGenericChartRenderer).SaveSVGAsync(path, width, height, gChart) + |> Async.RunSynchronously \ No newline at end of file diff --git a/src/Plotly.NET.Interactive/ExtensionVisualTest.ipynb b/src/Plotly.NET.Interactive/ExtensionVisualTest.ipynb index fb7d3ebd9..26e3a5ece 100644 --- a/src/Plotly.NET.Interactive/ExtensionVisualTest.ipynb +++ b/src/Plotly.NET.Interactive/ExtensionVisualTest.ipynb @@ -3,15 +3,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "dotnet_interactive": { - "language": "pwsh" - } - }, - "outputs": [], "source": [ "# notebook paths should be absolute - change this for your setup\r\n", - "$projectRootDir = \"/path/to/your/project/Plotly.NET\"\r\n", + "$projectRootDir = \"C:/Users/Kevin/source/repos/plotly/Plotly.NET\"\r\n", "cd $projectRootDir\r\n", "\r\n", "dotnet tool restore\r\n", @@ -19,74 +13,1506 @@ "\r\n", "# changing versions here if you try out a new version helps you to bust the nuget cache\r\n", "# you still have to restart your notebook kernel, though, if you already loaded a package\r\n", - "dotnet pack /p:PackageVersion=2.0.0-dev4 -o \"$projectRootDir/pkg\"\r\n", + "dotnet pack /p:PackageVersion=2.0.0-dev5 -o \"$projectRootDir/pkg\"\r\n", "\r\n", "ls \"$projectRootDir/pkg\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "dotnet_interactive": { - "language": "fsharp" - } - }, + ], "outputs": [ { "data": { - "text/html": "
Restore sources
  • C:/Users/grego/source/repos/Plotly.NET/pkg
" + "text/plain": [ + "Tool 'fake-cli' (version '5.20.4') was restored. Available commands: fake\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Tool 'paket' (version '5.257.0') was restored. Available commands: paket\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Tool 'fsharp.formatting.commandtool' (version '11.1.0') was restored. Available commands: fsdocs\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Restore was successful.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "The last restore is still up to date. Nothing left to do.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "run CopyBinaries\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Building project with version: LocalBuild\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Shortened DependencyGraph for Target CopyBinaries:\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "<== CopyBinaries\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " <== Clean\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " <== Build\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "The running order is:\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Group - 1\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Clean\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Group - 2\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Build\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Group - 3\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - CopyBinaries\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Starting target 'Clean'\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Finished (Success) 'Clean' in 00:00:00.1997738\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Starting target 'Build'\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Starting task 'DotNet:build': Plotly.NET.sln\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET> \"dotnet.exe\" msbuild /version /nologo (In: false, Out: true, Err: true)\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "16.10.1.27001\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET> \"dotnet.exe\" build Plotly.NET.sln --configuration Release /nodeReuse:False \"/bl:C:\\Users\\Kevin\\AppData\\Local\\Temp\\tmpBE44.tmp.binlog\" (In: false, Out: false, Err: false)\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Microsoft (R) Build Engine version 16.10.1+2fd48ab73 for .NET\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Copyright (C) Microsoft Corporation. All rights reserved.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Program Files\\dotnet\\sdk\\5.0.301\\MSBuild.dll -consoleloggerparameters:Summary -distributedlogger:Microsoft.DotNet.Tools.MSBuild.MSBuildLogger,C:\\Program Files\\dotnet\\sdk\\5.0.301\\dotnet.dll*Microsoft.DotNet.Tools.MSBuild.MSBuildForwardingLogger,C:\\Program Files\\dotnet\\sdk\\5.0.301\\dotnet.dll -maxcpucount -property:Configuration=Release -restore -verbosity:m /bl:C:\\Users\\Kevin\\AppData\\Local\\Temp\\tmpBE44.tmp.binlog /nodeReuse:False Plotly.NET.sln\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Determining projects to restore...\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj (in 310 ms).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.ImageExport\\Plotly.NET.ImageExport.fsproj (in 745 ms).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.Interactive\\Plotly.NET.Interactive.fsproj (in 815 ms).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\tests\\Plotly.NET.Tests\\Plotly.NET.Tests.fsproj (in 1.45 sec).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(39,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(40,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(41,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(42,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\bin\\Release\\netstandard2.0\\Plotly.NET.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(39,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(40,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(41,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(42,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\bin\\Release\\net5.0\\Plotly.NET.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET.Interactive -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.Interactive\\bin\\Release\\net5.0\\Plotly.NET.Interactive.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET.ImageExport -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.ImageExport\\bin\\Release\\net5.0\\Plotly.NET.ImageExport.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET.Tests -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\tests\\Plotly.NET.Tests\\bin\\Release\\net5.0\\Plotly.NET.Tests.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Build succeeded.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(39,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(40,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(41,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(42,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(39,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(40,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(41,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(42,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " 16 Warning(s)\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " 0 Error(s)\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Time Elapsed 00:00:33.10\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Fsc: C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Fsc: C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Fsc: C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(39,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Fsc: C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(40,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Fsc: C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(41,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Fsc: C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(42,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Finished (Success) 'DotNet:build' in 00:00:35.1270633\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Finished (Success) 'Build' in 00:00:35.1342112\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Starting target 'CopyBinaries'\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "(\"C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\bin\\Release\",\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " \"bin\\Plotly.NET\")\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "(\"C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.ImageExport\\bin\\Release\",\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " \"bin\\Plotly.NET.ImageExport\")\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "(\"C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.Interactive\\bin\\Release\",\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " \"bin\\Plotly.NET.Interactive\")\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Finished (Success) 'CopyBinaries' in 00:00:00.4017069\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "---------------------------------------------------------------------\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Build Time Report\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "---------------------------------------------------------------------\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Target Duration\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "------ --------\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Clean 00:00:00.1951835\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Build 00:00:35.1340651\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "CopyBinaries 00:00:00.4015674\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Total: 00:00:35.8823875\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Status: Ok\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "---------------------------------------------------------------------\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\build.fsx (141,12)-(141,26): FSharpErrorSeverity.Warning FS1182: The value 'standardParams' is unused\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Performance:\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Cli parsing: 322 milliseconds\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Packages: 94 milliseconds\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Script analyzing: 36 milliseconds\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Script running: 36 seconds\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Script cleanup: 23 milliseconds\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " - Runtime: 37 seconds\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Microsoft (R) Build Engine version 16.10.1+2fd48ab73 for .NET\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Copyright (C) Microsoft Corporation. All rights reserved.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Determining projects to restore...\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj (in 390 ms).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.ImageExport\\Plotly.NET.ImageExport.fsproj (in 593 ms).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.Interactive\\Plotly.NET.Interactive.fsproj (in 700 ms).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Restored C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\tests\\Plotly.NET.Tests\\Plotly.NET.Tests.fsproj (in 1.5 sec).\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(39,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(40,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(41,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(42,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Chart.fs(616,9): warning FS0044: This construct is deprecated. Use the constructors with the mandatory mode argument for full functionality [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\bin\\Debug\\netstandard2.0\\Plotly.NET.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(32,50): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(39,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(40,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(41,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\CandelstickExtension.fs(42,74): warning FS0044: This construct is deprecated. this type will be removed in favor of the 'StockData' type in 2.0. [C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\Plotly.NET.fsproj]\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET\\bin\\Debug\\net5.0\\Plotly.NET.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Successfully created package 'C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\pkg\\Plotly.NET.2.0.0-dev5.nupkg'.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Successfully created package 'C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\pkg\\Plotly.NET.2.0.0-dev5.snupkg'.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET.Interactive -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.Interactive\\bin\\Debug\\net5.0\\Plotly.NET.Interactive.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Successfully created package 'C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\pkg\\Plotly.NET.Interactive.2.0.0-dev5.nupkg'.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Successfully created package 'C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\pkg\\Plotly.NET.Interactive.2.0.0-dev5.snupkg'.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Plotly.NET.ImageExport -> C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\src\\Plotly.NET.ImageExport\\bin\\Debug\\net5.0\\Plotly.NET.ImageExport.dll\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Successfully created package 'C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\pkg\\Plotly.NET.ImageExport.2.0.0-dev5.nupkg'.\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + " Directory: C:\\Users\\Kevin\\source\\repos\\plotly\\Plotly.NET\\pkg\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Mode LastWriteTime Length Name\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "---- ------------- ------ ----\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "-a--- 7/9/2021 2:40 PM 856987 Plotly.NET.2.0.0-dev5.nupkg\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "-a--- 7/9/2021 2:40 PM 83819 Plotly.NET.2.0.0-dev5.snupkg\r\n" + ] }, - "output_type": "unknown" + "metadata": {}, + "output_type": "display_data" }, { "data": { - "text/plain": "Installed package Plotly.NET.Interactive version 2.0.0-dev4" + "text/plain": [ + "-a--- 7/9/2021 2:40 PM 51671 Plotly.NET.ImageExport.2.0.0-dev5.nupkg\r\n" + ] }, - "output_type": "unknown" + "metadata": {}, + "output_type": "display_data" }, { "data": { - "text/plain": "Installed package Plotly.NET version 2.0.0-dev4" + "text/plain": [ + "-a--- 7/9/2021 2:40 PM 41265 Plotly.NET.Interactive.2.0.0-dev5.nupkg\r\n" + ] }, - "output_type": "unknown" + "metadata": {}, + "output_type": "display_data" }, { "data": { - "text/markdown": "Loading extensions from `Plotly.NET.Interactive.dll`" + "text/plain": [ + "-a--- 7/9/2021 2:40 PM 2684 Plotly.NET.Interactive.2.0.0-dev5.snupkg\r\n" + ] }, - "output_type": "unknown" + "metadata": {}, + "output_type": "display_data" }, { "data": { - "text/markdown": "Added Kernel Extension including formatters for GenericChart" + "text/plain": [ + "\r\n" + ] }, - "output_type": "unknown" + "metadata": {}, + "output_type": "display_data" } ], - "source": [ - "// be advised, that you always should set absolute paths for local nuget packages - change this to reflect your own setup\r\n", - "#i \"nuget: /path/to/your/project/Plotly.NET/pkg\"\r\n", - "#r \"nuget: Plotly.NET, 2.0.0-dev4\"\r\n", - "#r \"nuget: Plotly.NET.Interactive, 2.0.0-dev4\"" - ] + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + } + } }, { "cell_type": "code", "execution_count": null, - "metadata": { - "dotnet_interactive": { - "language": "fsharp" - } - }, + "source": [ + "// be advised, that you always should set absolute paths for local nuget packages - change this to reflect your own setup\r\n", + "#i \"nuget: C:/Users/Kevin/source/repos/plotly/Plotly.NET/pkg\"\r\n", + "#r \"nuget: Plotly.NET, 2.0.0-dev5\"\r\n", + "#r \"nuget: Plotly.NET.ImageExport, 2.0.0-dev5\"\r\n", + "#r \"nuget: Plotly.NET.Interactive, 2.0.0-dev5\"" + ], "outputs": [ { "data": { - "text/html": "
\r\n\r\n" + "text/html": [ + "
Restore sources
  • C:/Users/Kevin/source/repos/plotly/Plotly.NET/pkg
Installed Packages
  • fsharp.core, 5.0.0
  • humanizer.core, 2.2.0
  • microsoft.aspnetcore.html.abstractions, 2.2.0
  • microsoft.aspnetcore.webutilities, 2.0.2
  • microsoft.bcl.asyncinterfaces, 5.0.0
  • microsoft.codeanalysis.common, 3.9.0
  • microsoft.codeanalysis.csharp, 3.9.0
  • microsoft.codeanalysis.csharp.workspaces, 3.9.0
  • microsoft.codeanalysis.visualbasic, 3.9.0
  • microsoft.codeanalysis.visualbasic.workspaces, 3.9.0
  • microsoft.codeanalysis.workspaces.common, 3.9.0
  • microsoft.dotnet.interactive, 1.0.0-beta.21330.2
  • microsoft.dotnet.interactive.formatting, 1.0.0-beta.21330.2
  • microsoft.extensions.dependencyinjection.abstractions, 2.0.0
  • microsoft.extensions.logging, 2.0.2
  • microsoft.extensions.logging.abstractions, 2.0.2
  • microsoft.extensions.options, 2.0.2
  • microsoft.extensions.primitives, 2.0.0
  • microsoft.net.http.headers, 2.0.2
  • newtonsoft.json, 12.0.3
  • nuget.frameworks, 5.0.0
  • Plotly.NET, 2.0.0-dev5
  • Plotly.NET.ImageExport, 2.0.0-dev5
  • Plotly.NET.Interactive, 2.0.0-dev5
  • puppeteersharp, 4.0.0
  • sharpziplib, 1.3.1
  • system.commandline, 2.0.0-beta1.21308.1
  • system.commandline.rendering, 0.3.0-alpha.20427.1
  • system.composition.attributedmodel, 1.0.31
  • system.composition.convention, 1.0.31
  • system.composition.hosting, 1.0.31
  • system.composition.runtime, 1.0.31
  • system.composition.typedparts, 1.0.31
  • system.io.pipelines, 5.0.0
  • system.reactive, 5.0.0
  • system.text.encodings.web, 5.0.1
  • system.text.json, 5.0.2
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Loading extensions from `Plotly.NET.Interactive.dll`" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Added Kernel Extension including formatters for Plotly.NET charts." + ] }, - "output_type": "unknown" + "metadata": {}, + "output_type": "display_data" } ], + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + } + } + }, + { + "cell_type": "code", + "execution_count": null, "source": [ "open Plotly.NET\r\n", "\r\n", @@ -95,7 +1521,112 @@ "\r\n", "List.zip xs ys\r\n", "|> Chart.Point" - ] + ], + "outputs": [ + { + "data": { + "text/html": [ + "
\r\n", + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + } + } + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "open Plotly.NET\r\n", + "open Plotly.NET.ImageExport\r\n", + "\r\n", + "let chartJPEG = \r\n", + " Chart.Point([1.,2.])\r\n", + " |> Chart.toBase64JPGString(Width=400, Height=400)\r\n", + "\r\n", + "let chartPNG = \r\n", + " Chart.Point([1.,2.])\r\n", + " |> Chart.toBase64PNGString(Width=400, Height=400)\r\n", + "\r\n", + "let chartSVG = \r\n", + " Chart.Point([1.,2.])\r\n", + " |> Chart.toSVGString(Width=400, Height=400)\r\n", + "\r\n", + "let imageHtml chartImage = $\"\"\"\r\n", + "\"\"\"\r\n", + "\r\n", + "DisplayExtensions.DisplayAs(imageHtml chartJPEG,\"text/html\")\r\n", + "DisplayExtensions.DisplayAs(imageHtml chartPNG,\"text/html\")\r\n", + "DisplayExtensions.DisplayAs(chartSVG,\"image/svg+xml\")\r\n" + ], + "outputs": [ + { + "data": { + "text/html": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\r\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": "00.511.5211.522.53" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + } + } } ], "metadata": { diff --git a/src/Plotly.NET.Interactive/Untitled-1.html b/src/Plotly.NET.Interactive/Untitled-1.html new file mode 100644 index 000000000..3117e262b --- /dev/null +++ b/src/Plotly.NET.Interactive/Untitled-1.html @@ -0,0 +1,243 @@ + \ No newline at end of file diff --git a/src/Plotly.NET/GenericChart.fs b/src/Plotly.NET/GenericChart.fs index a6294be79..8b6e9edf7 100644 --- a/src/Plotly.NET/GenericChart.fs +++ b/src/Plotly.NET/GenericChart.fs @@ -392,8 +392,15 @@ module GenericChart = let mapLayout f gChart = match gChart with | Chart (trace, layout, config, displayOpts) -> Chart (trace,f layout,config, displayOpts) - | MultiChart (traces, layout, config, displayOpts) -> MultiChart (traces,f layout,config, displayOpts) /// + | MultiChart (traces, layout, config, displayOpts) -> MultiChart (traces,f layout,config, displayOpts) + + /// + let mapConfig f gChart = + match gChart with + | Chart (trace, layout, config, displayOpts) -> Chart (trace, layout, f config, displayOpts) + | MultiChart (traces, layout, config, displayOpts) -> MultiChart (traces, layout, f config, displayOpts) + /// let mapDisplayOptions f gChart = match gChart with | Chart (trace, layout, config, displayOpts) -> Chart (trace, layout, config, f displayOpts) diff --git a/src/Plotly.NET/Plotly.NET.fsproj b/src/Plotly.NET/Plotly.NET.fsproj index 30f3a8f20..5848525ee 100644 --- a/src/Plotly.NET/Plotly.NET.fsproj +++ b/src/Plotly.NET/Plotly.NET.fsproj @@ -84,7 +84,6 @@ - diff --git a/src/Plotly.NET/TestScript.fsx b/src/Plotly.NET/TestScript.fsx deleted file mode 100644 index 496b1c612..000000000 --- a/src/Plotly.NET/TestScript.fsx +++ /dev/null @@ -1,69 +0,0 @@ -//#I "./bin/Debug" -//#r "./bin/Debug/netstandard2.0/Newtonsoft.Json.dll" -#r @"..\..\bin\Plotly.NET\netstandard2.0\Plotly.NET.dll" -#r "netstandard" - -open Plotly.NET - - -let x = seq [1.; 2.; 3.; 4.; 5.; 6.; 7.; 8.; 9.; 10.; ] // 9.; 8.; 7.; 6.; 5.; 4.; 3.; 2.; 1.] -let y = seq [5.; 2.5; 5.; 7.5; 5.; 2.5; 7.5; 4.5; 5.5; 5.] -let y' = seq [2.; 1.5; 5.; 1.5; 3.; 2.5; 2.5; 1.5; 3.5; 1.] - -Chart.Spline(x,y',Name="spline") -|> Chart.withConfig - (Config.init - ( - Autosizable = true, - ShowEditInChartStudio = true, - ToImageButtonOptions = - ToImageButtonOptions.init - ( - Format = StyleParam.ImageFormat.SVG, - Filename = "SOOOOS" - ) - ) - ) -|> Chart.Show -//|> Chart.withYError(Options.Error(Array=[1.; 2.; 3.; 4.; 5.; 6.; 7.; 8.; 9.; 10.; ])) - - -//|> Chart.withLineStyle(Width=2,Dash=StyleParam.DrawingStyle.Dot) -//|> Chart.withLineOption(Options.Line(Width=10)) -//|> Chart.withX_AxisStyle("x axis title") -//|> Chart.withY_AxisStyle("y axis title") -//|> layoutJson -//|> GenericChart.toChartHtmlWithSize 500 500 - -//|> Chart.ShowAsImage StyleParam.ImageFormat.SVG - -let dims' = - [ - Dimensions.init(["Cat1";"Cat1";"Cat1";"Cat1";"Cat2";"Cat2";"Cat3"],Label="A") - Dimensions.init([0;1;0;1;0;0;0],Label="B",TickText=["YES","NO"]) - ] - -Chart.ParallelCategories(dims=dims',Color=[0.;1.;0.;1.;0.;0.;0.],Colorscale = StyleParam.Colorscale.Blackbody) -|> Chart.Show - -let data3d = List.zip3 [0 .. 15] [0 .. 15] [0 .. 15] -let data2d = List.zip [0 .. 15] [0 .. 15] - -[ - Chart.Point (data2d) - Chart.Scatter3d(xyz=data3d,mode = StyleParam.Mode.Markers) - Chart.Scatter3d(xyz=data3d,mode = StyleParam.Mode.Markers) - Chart.Scatter3d(xyz=data3d,mode = StyleParam.Mode.Markers) - Chart.Scatter3d(xyz=data3d,mode = StyleParam.Mode.Markers) -] -|> Chart.Stack 2 -|> Chart.Show - - - - - - - - - diff --git a/tests/Plotly.NET.Tests/BasicHtmlGeneration.fs b/tests/Plotly.NET.Tests/BasicHtmlGeneration.fs index cae1ce2b7..f1096b334 100644 --- a/tests/Plotly.NET.Tests/BasicHtmlGeneration.fs +++ b/tests/Plotly.NET.Tests/BasicHtmlGeneration.fs @@ -1,4 +1,4 @@ -module Tests +module Tests.Core open Expecto open Plotly.NET diff --git a/tests/Plotly.NET.Tests/ImageExport.fs b/tests/Plotly.NET.Tests/ImageExport.fs new file mode 100644 index 000000000..731d6d7b4 --- /dev/null +++ b/tests/Plotly.NET.Tests/ImageExport.fs @@ -0,0 +1,34 @@ +module Tests.ImageExport + +open Expecto +open Plotly.NET +open Plotly.NET.ImageExport + +open System.IO + +let testBase64JPG = File.ReadAllText (__SOURCE_DIRECTORY__ + "/data/testBase64JPG.txt") +let testBase64PNG = File.ReadAllText (__SOURCE_DIRECTORY__ + "/data/testBase64PNG.txt") + +let testChart = Chart.Point([1.,1.]) + +//[] +//let jpgTests = +// testList "ImageExport_JPG" [ +// testCase "Chart.toBase64JPGString should create valid base64 JPG string" ( fun () -> +// Expect.equal +// (testChart |> Chart.toBase64JPGString()) +// testBase64JPG +// "Nope" +// ) +// ] + +//[] +//let pngTests = +// testList "ImageExport_PNG" [ +// testCase "Chart.toBase64PNGString should create valid base64 PNG string" ( fun () -> +// Expect.equal +// (testChart |> Chart.toBase64PNGString()) +// testBase64PNG +// "Nope" +// ) +// ] \ No newline at end of file diff --git a/tests/Plotly.NET.Tests/Main.fs b/tests/Plotly.NET.Tests/Main.fs index 11e78d2f3..1f34e91d4 100644 --- a/tests/Plotly.NET.Tests/Main.fs +++ b/tests/Plotly.NET.Tests/Main.fs @@ -3,4 +3,4 @@ open Expecto [] let main argv = - Tests.runTestsInAssembly defaultConfig argv + Tests.runTestsInAssemblyWithCLIArgs [] argv diff --git a/tests/Plotly.NET.Tests/Plotly.NET.Tests.fsproj b/tests/Plotly.NET.Tests/Plotly.NET.Tests.fsproj index 34f460526..2df61741f 100644 --- a/tests/Plotly.NET.Tests/Plotly.NET.Tests.fsproj +++ b/tests/Plotly.NET.Tests/Plotly.NET.Tests.fsproj @@ -7,6 +7,7 @@ + @@ -19,5 +20,6 @@ + diff --git a/tests/Plotly.NET.Tests/data/testBase64JPG.txt b/tests/Plotly.NET.Tests/data/testBase64JPG.txt new file mode 100644 index 000000000..6b0561973 --- /dev/null +++ b/tests/Plotly.NET.Tests/data/testBase64JPG.txt @@ -0,0 +1 @@ +data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//9k= \ No newline at end of file diff --git a/tests/Plotly.NET.Tests/data/testBase64PNG.txt b/tests/Plotly.NET.Tests/data/testBase64PNG.txt new file mode 100644 index 000000000..250a6560b --- /dev/null +++ b/tests/Plotly.NET.Tests/data/testBase64PNG.txt @@ -0,0 +1 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAASwCAYAAADrIbPPAAAgAElEQVR4XuzdT+yvaVkm+JcAQgenreqKFdPAwsE/C6OzkAhtoq6IGqOmQhtXMxttOik3E49DLBUXEoRgSHRhYtu7ITEz9Exk4UJTu5rEQSkXo2FnNYuCif/QagJBAkrnnDREbKDO+9b3d1/P+14fkk46zXm/93N/rudOPblTnH7ZF77whS9s/kOAAAECBAgQIECAAAECBAgQIEBgUYGXWWAtmoxjESBAgAABAgQIECBAgAABAgQIPBCwwHIRCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHCBAgQIAAAQIECBAgQIAAAQIElhawwFo6HocjQIAAAQIECBAgQIAAAQIECBCwwHIHXrLA5z//+e0jH/nI9vTTT2/PPvvs9olPfOLBbz7yyCPb933f921vfetbt9e+9rUvuY4fIECAAAECBAgQIECAAAECBDoFLLA6c79Z13//93+/vetd79o+9KEPfdXffNWrXrX9zM/8zPZDP/RD28te9rKb1fZDBAgQIECAAAECBAgQIECAQIeABVZHznfW5f0F1jvf+c4H/wbWj//4j28//MM/vD3++OMP6n3sYx/bfuu3fmv78Ic/vL3mNa/Z3vve927f9m3fdmdn8cMECBAgQIAAAQIECBAgQIDANQUssK6Z61hX9xdYH/zgB7e3vOUt22OPPfbf1X3hhRe2p556avvzP//z7Sd/8ie3n/7pnx47m0IECBAgQIAAAQIECBAgQIDANQQssK6R49Jd/MZv/Mb2e7/3e9v3f//3bz//8z+/vfKVr1z6vA5HgAABAgQIECBAgAABAgQIrCVggbVWHpc8zRcXWPf/La179+5tL3/5yy/Zp6YIECBAgAABAgQIECBAgACBuxGwwLobV7/63wS++Hdk/fEf/7H/CaFbQYAAAQIECBAgQIAAAQIECBwSsMA6xOajhxX40z/90+0XfuEXtle84hX+EveHRfPnCBAgQIAAAQIECBAgQIAAgS8TsMByIe5M4K//+q+3d7zjHdtzzz23/eiP/uj25JNPPlhk+Q8BAgQIECBAgAABAgQIECBAYI+ABdYeLX/2oQU+/elPb+95z3u2D33oQ9sb3vCG7Z3vfOf2jd/4jQ/9vT9IgAABAgQIECBAgAABAgQIEPiigAWWu3BzgfvLq9/8zd/cnn766e3xxx/ffuVXfuXBEuuf/+f+X+p+/z/3/5z/ECBwtwJ/93d/96DAo48+ereF/DoBApt5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MVUPHTqUrrvuunT++ecvPl119tlnn7K35mJx5ZVXpocffjhdf/316c1vfvPiawRYxRwDG5mBgAv+DJrkFYsRMG/FtNJGZiBg3mbQJK9IgACBgQQEWANB1vqYu+66a/HbB7du3ZquvfbatHbt2lMonnrqqUXIdd999y1+RtaOHTsEWLUeGPvOJuCCn41e4QoFzFuFTbflbALmLRu9wgQIEAgXEGCFk5dVUIBVVj/tplwBF/xye2tn0xMwb9PriTcqV8C8ldtbOyNAgMAPCgiwnIleAkMEWL1ewGICBAgQIECAAAECBAgQCBG49957Q+ooQmA5AQGWc9FLoE+A1RRe+jlYvV7CYgIECBAgQIAAAQIECBAYXUCANTqxAi8hIMByPHoJHDx4cPHD2y+88MK0d+/etH79+lOe92I/xL1XYYsJECBAgAABAgQIECBAgACBagQEWNW0epyNPvjgg2n37t1p48aNad++femcc845pdCRI0fSVVddlY4ePboIuTZv3jzOy3gqAQIECBAgQIAAAQIECBAgUKSAAKvItsZtaiXh1AMPPJD27NmzCLc+9alPpde85jVxL6gSAQIECBAgQIAAAQIECBAgMHsBAdbsW5h3AydOnEi33HJLOnDgQLrkkkvSRz7ykbRmzZrnX+qZZ55J+/fvT823Gm7bti3t2rUrrV69Ou9Lq06AAAECBAgQIECAAAECBAjMSkCANat2TfNlm28jYO4RVgAAGI1JREFUbD5hdfz48fTBD34wXXrppWndunXp2LFj6fbbb0933nlnOuOMM9INN9zg2wen2UJvRYAAAQIECBAgQIAAAQIEJi0gwJp0e+bxcs8991y6++6702233ZaeffbZU166+cTV5ZdfnrZv355WrVo1j015SwIECBAgQIAAAQIECBAgQGAyAgKsybRi3i/ShFiHDx9On/vc59JDDz2Unn766cWnsLZs2ZJ27tyZNm3aJLyad4u9PQECBAgQIECAAAECBAgQyCYgwMpGX2fh73//++lLX/pS+ou/+Iv07//+7+mHfuiH0ute97rFp7Oan6H18pe/vE4YuyawAoH/+Z//SX/zN3+TvvjFL6Zvfetbi088nnvuuentb3/74lt3N2zYsIKnLP8lv/3bv52+/OUvn3b91q1b07XXXpvWrl172q/1BQRqFWj+jvut3/qtxaePd+zYUSuD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DwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYXEGCNb6wCAQIECBAgQIAAAQIECBAgQIBADwEBVg88SwkQIECAAAECBAgQIECAAAECBMYX+H8wJo/tPQXuQQAAAABJRU5ErkJggg== \ No newline at end of file