From 69df3e854c6ac9db9df8a238a21e343525d66408 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Apr 2026 09:43:12 +0200 Subject: [PATCH 01/13] Release: v1.0 = core rewrite, CI/CD, docs, and test suite overhaul (#166) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Overview Promotes `preview/1.0` to `release/1.0` in preparation for the 1.0 release. This batch brings in a full rewrite of the library's core, docs, CI/CD pipeline, and test suite accumulated since the last preview snapshot. ## What's included ### 🏗️ CI/CD & Workflows - **New workflows**: `bump-version`, `promote-branch` with source-branch enforcement, auto merge-to-main on release - **Branch protection**: new `lock`/`unlock` composite actions; `preview/**` and `release/**` branches are now automatically locked after creation - **Fix**: removed invalid `administration` permission from `release.yml` that caused workflow parse failures (#158) - **Fix**: corrected pull-request-finding logic in promote workflow - **Docs publishing**: URL-aware version switcher via `docs-versioning` template; `versions.json` manifest; reworked `generate-docs` job (#157) ### 📚 Documentation - New `/docs` developer guides: local development, testing conventions, benchmarks, composite actions catalogue, CI workflow reference, branch strategy, versioning pipeline, API doc generation, extensibility guide (#155) - Updated API reference YAMLs for version 1.0 - Fixed grammar, TOC typo, and outdated API references in docs - Updated `CONTRIBUTING.md` with links to all new docs articles - Flushed `PublicAPI.Unshipped.txt` ### 🔧 Source (library) - Refactored internal structure: `CoordinateDelta`, `CoordinateVariance`, `Pow10`, `Defaults`, `ExceptionGuard`, logging helpers - Updated `PolylineEncoder`, `PolylineDecoder`, `PolylineEncoding`, `PolylineEncodingOptions`, `PolylineEncodingOptionsBuilder` - Public API cleanup; `.editorconfig` updated (primary constructors disabled) ### ✅ Tests - Reorganized test files into proper namespace folders (`Abstraction/`, `Extensions/`, `Internal/`) - Added new test classes for `CoordinateDelta`, `CoordinateVariance`, `Pow10`, `ExceptionGuard`, `LogDebugExtensions`, `LogWarningExtensions`, `InvalidPolylineException`, `PolylineEncodingOptionsBuilder`, and encoder/decoder extensions - Removed stale/duplicate test files ### 🛠️ Build & Config - Cleaned up `PolylineAlgorithm.slnx`, `Directory.Build.props`, benchmarks config - Updated `.gitignore` to exclude dynamically generated `api-reference/_docs/` - Misc cleanup (removed junk files, updated `AGENTS.md`) --- .editorconfig | 276 ++ .gitattributes | 53 +- .github/ISSUE_TEMPLATE/bug_report.md | 38 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .../documentation/docfx-build/action.yml | 45 + .../documentation/docfx-metadata/action.yml | 65 + .github/actions/git/push-changes/action.yml | 99 + .../github/branch-protection/lock/action.yml | 40 + .../branch-protection/unlock/action.yml | 21 + .../actions/github/create-release/action.yml | 40 + .../github/write-file-to-summary/action.yml | 25 + .../actions/nuget/publish-package/action.yml | 61 + .github/actions/source/compile/action.yml | 74 + .github/actions/source/format/action.yml | 73 + .../actions/testing/code-coverage/action.yml | 73 + .../actions/testing/test-report/action.yml | 60 + .github/actions/testing/test/action.yml | 84 + .../versioning/extract-version/action.yml | 51 + .../versioning/format-version/action.yml | 66 + .github/dependabot.yml | 14 + .github/workflows/build.yml | 258 ++ .github/workflows/bump-version.yml | 156 + .github/workflows/codeql.yml | 97 - .github/workflows/dotnet.yml | 28 - .github/workflows/promote-branch.yml | 227 ++ .github/workflows/publish-documentation.yml | 174 + .github/workflows/pull-request.yml | 258 ++ .github/workflows/release.yml | 368 +++ .github/workflows/static.yml | 44 - .gitignore | 13 +- AGENTS.md | 93 + CONTRIBUTING.md | 50 + Directory.Build.props | 25 + DropoutCoder.PolylineAlgorithm.sln | 61 - LICENSE | 2 +- PolylineAlgorithm.slnx | 20 + README.md | 215 +- ....Abstraction.AbstractPolylineDecoder-2.yml | 233 ++ ....Abstraction.AbstractPolylineEncoder-2.yml | 219 ++ ...gorithm.Abstraction.IPolylineDecoder-2.yml | 90 + ...gorithm.Abstraction.IPolylineEncoder-2.yml | 142 + .../1.0/PolylineAlgorithm.Abstraction.yml | 34 + ...m.Extensions.PolylineDecoderExtensions.yml | 195 ++ ...m.Extensions.PolylineEncoderExtensions.yml | 139 + .../1.0/PolylineAlgorithm.Extensions.yml | 19 + ...hm.Internal.Diagnostics.ExceptionGuard.yml | 313 ++ ...PolylineAlgorithm.Internal.Diagnostics.yml | 15 + ...lineAlgorithm.InvalidPolylineException.yml | 102 + .../PolylineAlgorithm.PolylineEncoding.yml | 529 +++ ...ylineAlgorithm.PolylineEncodingOptions.yml | 127 + ...gorithm.PolylineEncodingOptionsBuilder.yml | 141 + api-reference/1.0/PolylineAlgorithm.yml | 38 + api-reference/1.0/toc.yml | 40 + api-reference/api-reference.json | 43 + api-reference/assembly-metadata.json | 17 + .../docs-versioning/layout/_master.tmpl | 163 + .../public/version-switcher.js | 86 + api-reference/favicon.ico | Bin 0 -> 249170 bytes api-reference/guide/advanced-scenarios.md | 168 + api-reference/guide/configuration.md | 75 + api-reference/guide/faq.md | 63 + api-reference/guide/getting-started.md | 76 + api-reference/guide/introduction.md | 33 + api-reference/guide/sample.md | 115 + api-reference/guide/toc.yml | 12 + api-reference/index.md | 18 + .../media/polyline-algorithm-50x46.png | Bin 0 -> 5385 bytes api-reference/media/polyline-algorithm.png | Bin 0 -> 488006 bytes api-reference/toc.yml | 3 + api-reference/versions.json | 4 + ...tCoder.PolylineAlgorithm.Benchmarks.csproj | 18 - .../PolylineEncodingBenchmark.cs | 40 - .../Program.cs | 13 - .../Constants.cs | 82 - .../DecodePerformanceBenchmark.cs | 200 -- ...Algorithm.Implementation.Benchmarks.csproj | 19 - .../EncodePerformanceBenchmark.cs | 222 -- .../Program.cs | 15 - .../PolylineAlgorithm.Benchmarks.csproj | 26 + .../PolylineDecoderBenchmark.cs | 124 + .../PolylineEncoderBenchmark.cs | 92 + .../PolylineEncodingBenchmark.cs | 38 + .../PolylineAlgorithm.Benchmarks/Program.cs | 23 + .../Properties/CodeCoverage.cs | 8 + .../Properties/GlobalSuppressions.cs | 15 + code-coverage-settings.xml | 26 + docs/.gitignore | 9 - docs/README.md | 23 + docs/api-documentation.md | 136 + docs/api/.gitignore | 4 - docs/api/.manifest | 23 - docs/api/index.md | 4 - docs/benchmarks.md | 132 + docs/branch-strategy.md | 113 + docs/composite-actions.md | 307 ++ docs/docfx.json | 58 - docs/extensibility.md | 128 + docs/favicon.ico | Bin 99678 -> 0 bytes docs/fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes docs/fonts/glyphicons-halflings-regular.svg | 288 -- docs/fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes docs/fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes docs/fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes docs/local-development.md | 74 + docs/logo.svg | 25 - docs/manifest.json | 1 - docs/search-stopwords.json | 121 - docs/styles/docfx.css | 882 ----- docs/styles/docfx.js | 700 ---- docs/styles/docfx.vendor.css | 1466 --------- docs/styles/docfx.vendor.js | 45 - docs/styles/lunr.js | 2924 ----------------- docs/styles/lunr.min.js | 7 - docs/styles/main.css | 0 docs/styles/main.js | 1 - docs/styles/search-worker.js | 45 - docs/testing.md | 135 + docs/versioning.md | 99 + docs/workflows.md | 178 + global.json | 5 + nuget/DropoutCoder.PolylineAlgorithm.nuspec | 19 - .../NetTopologyPolylineDecoder.cs | 35 + .../NetTopologyPolylineEncoder.cs | 55 + ...neAlgorithm.NetTopologySuite.Sample.csproj | 19 + .../Properties/CodeCoverage.cs | 8 + src/Constants.cs | 82 - src/DropoutCoder.PolylineAlgorithm.csproj | 29 - src/Encoding/IPolylineEncoding.cs | 38 - src/Encoding/PolylineEncoding.cs | 38 - src/Encoding/PolylineEncodingBase.cs | 72 - src/ExceptionMessageResource.Designer.cs | 99 - src/PolylineAlgorithm.cs | 216 -- .../Abstraction/AbstractPolylineDecoder.cs | 204 ++ .../Abstraction/AbstractPolylineEncoder.cs | 197 ++ .../Abstraction/IPolylineDecoder.cs | 49 + .../Abstraction/IPolylineEncoder.cs | 77 + .../Extensions/PolylineDecoderExtensions.cs | 97 + .../Extensions/PolylineEncoderExtensions.cs | 84 + .../Internal/CoordinateDelta.cs | 72 + src/PolylineAlgorithm/Internal/Defaults.cs | 118 + .../Internal/Diagnostics/ExceptionGuard.cs | 325 ++ .../Diagnostics/LogDebugExtensions.cs | 57 + .../Diagnostics/LogWarningExtensions.cs | 101 + src/PolylineAlgorithm/Internal/Pow10.cs | 40 + .../InvalidPolylineException.cs | 45 + .../PolylineAlgorithm.csproj | 73 + src/PolylineAlgorithm/PolylineEncoding.cs | 461 +++ .../PolylineEncodingOptions.cs | 83 + .../PolylineEncodingOptionsBuilder.cs | 102 + .../ExceptionMessageResource.Designer.cs | 171 + .../Properties}/ExceptionMessageResource.resx | 40 +- .../Properties/GlobalSuppressions.cs | 1 + src/PolylineAlgorithm/PublicAPI.Shipped.txt | 1 + src/PolylineAlgorithm/PublicAPI.Unshipped.txt | 1 + src/PolylineAlgorithm/README.md | 105 + src/Validation/CoordinateValidator.cs | 47 - tests/Defaults.cs | 77 - ...ropoutCoder.PolylineAlgorithm.Tests.csproj | 23 - tests/Encoding/PolylineEncodingBaseTest.cs | 196 -- tests/Encoding/PolylineEncodingTest.cs | 55 - .../AbstractPolylineDecoderTests.cs | 144 + .../AbstractPolylineEncoderTests.cs | 152 + .../PolylineDecoderExtensionsTests.cs | 172 + .../PolylineEncoderExtensionsTests.cs | 123 + .../Internal/CoordinateDeltaTests.cs | 136 + .../Diagnostics/ExceptionGuardTests.cs | 609 ++++ .../Diagnostics/LogDebugExtensionsTests.cs | 222 ++ .../Diagnostics/LogWarningExtensionsTests.cs | 116 + .../Internal/Pow10Tests.cs | 49 + .../InvalidPolylineExceptionTests.cs | 44 + .../PolylineAlgorithm.Tests.csproj | 34 + .../PolylineEncodingOptionsBuilderTests.cs | 425 +++ .../PolylineEncodingTests.cs | 681 ++++ .../Properties/Category.cs | 16 + .../Properties/CodeCoverage.cs | 8 + .../Properties/GlobalSuppressions.cs | 10 + .../Properties/GlobalUsings.cs | 6 + .../Properties/MSTestSettings.cs | 9 + tests/PolylineAlgorithmTest.cs | 177 - tests/Properties/AssemblyInfo.cs | 11 - tests/Validation/CoordinateValidatorTest.cs | 136 - .../PolylineAlgorithm.Utility.csproj | 33 + .../Properties/CodeCoverage.cs | 8 + .../RandomValueProvider.cs | 120 + .../StaticValueProvider.cs | 80 + 185 files changed, 13782 insertions(+), 8864 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/actions/documentation/docfx-build/action.yml create mode 100644 .github/actions/documentation/docfx-metadata/action.yml create mode 100644 .github/actions/git/push-changes/action.yml create mode 100644 .github/actions/github/branch-protection/lock/action.yml create mode 100644 .github/actions/github/branch-protection/unlock/action.yml create mode 100644 .github/actions/github/create-release/action.yml create mode 100644 .github/actions/github/write-file-to-summary/action.yml create mode 100644 .github/actions/nuget/publish-package/action.yml create mode 100644 .github/actions/source/compile/action.yml create mode 100644 .github/actions/source/format/action.yml create mode 100644 .github/actions/testing/code-coverage/action.yml create mode 100644 .github/actions/testing/test-report/action.yml create mode 100644 .github/actions/testing/test/action.yml create mode 100644 .github/actions/versioning/extract-version/action.yml create mode 100644 .github/actions/versioning/format-version/action.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/bump-version.yml delete mode 100644 .github/workflows/codeql.yml delete mode 100644 .github/workflows/dotnet.yml create mode 100644 .github/workflows/promote-branch.yml create mode 100644 .github/workflows/publish-documentation.yml create mode 100644 .github/workflows/pull-request.yml create mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/static.yml create mode 100644 AGENTS.md create mode 100644 CONTRIBUTING.md create mode 100644 Directory.Build.props delete mode 100644 DropoutCoder.PolylineAlgorithm.sln create mode 100644 PolylineAlgorithm.slnx create mode 100644 api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Abstraction.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Extensions.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.InvalidPolylineException.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.PolylineEncoding.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptions.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml create mode 100644 api-reference/1.0/PolylineAlgorithm.yml create mode 100644 api-reference/1.0/toc.yml create mode 100644 api-reference/api-reference.json create mode 100644 api-reference/assembly-metadata.json create mode 100644 api-reference/docs-versioning/layout/_master.tmpl create mode 100644 api-reference/docs-versioning/public/version-switcher.js create mode 100644 api-reference/favicon.ico create mode 100644 api-reference/guide/advanced-scenarios.md create mode 100644 api-reference/guide/configuration.md create mode 100644 api-reference/guide/faq.md create mode 100644 api-reference/guide/getting-started.md create mode 100644 api-reference/guide/introduction.md create mode 100644 api-reference/guide/sample.md create mode 100644 api-reference/guide/toc.yml create mode 100644 api-reference/index.md create mode 100644 api-reference/media/polyline-algorithm-50x46.png create mode 100644 api-reference/media/polyline-algorithm.png create mode 100644 api-reference/toc.yml create mode 100644 api-reference/versions.json delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks.csproj delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/Program.cs delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Constants.cs delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DecodePerformanceBenchmark.cs delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks.csproj delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/EncodePerformanceBenchmark.cs delete mode 100644 benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Program.cs create mode 100644 benchmarks/PolylineAlgorithm.Benchmarks/PolylineAlgorithm.Benchmarks.csproj create mode 100644 benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs create mode 100644 benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs create mode 100644 benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs create mode 100644 benchmarks/PolylineAlgorithm.Benchmarks/Program.cs create mode 100644 benchmarks/PolylineAlgorithm.Benchmarks/Properties/CodeCoverage.cs create mode 100644 benchmarks/PolylineAlgorithm.Benchmarks/Properties/GlobalSuppressions.cs create mode 100644 code-coverage-settings.xml delete mode 100644 docs/.gitignore create mode 100644 docs/README.md create mode 100644 docs/api-documentation.md delete mode 100644 docs/api/.gitignore delete mode 100644 docs/api/.manifest delete mode 100644 docs/api/index.md create mode 100644 docs/benchmarks.md create mode 100644 docs/branch-strategy.md create mode 100644 docs/composite-actions.md delete mode 100644 docs/docfx.json create mode 100644 docs/extensibility.md delete mode 100644 docs/favicon.ico delete mode 100644 docs/fonts/glyphicons-halflings-regular.eot delete mode 100644 docs/fonts/glyphicons-halflings-regular.svg delete mode 100644 docs/fonts/glyphicons-halflings-regular.ttf delete mode 100644 docs/fonts/glyphicons-halflings-regular.woff delete mode 100644 docs/fonts/glyphicons-halflings-regular.woff2 create mode 100644 docs/local-development.md delete mode 100644 docs/logo.svg delete mode 100644 docs/manifest.json delete mode 100644 docs/search-stopwords.json delete mode 100644 docs/styles/docfx.css delete mode 100644 docs/styles/docfx.js delete mode 100644 docs/styles/docfx.vendor.css delete mode 100644 docs/styles/docfx.vendor.js delete mode 100644 docs/styles/lunr.js delete mode 100644 docs/styles/lunr.min.js delete mode 100644 docs/styles/main.css delete mode 100644 docs/styles/main.js delete mode 100644 docs/styles/search-worker.js create mode 100644 docs/testing.md create mode 100644 docs/versioning.md create mode 100644 docs/workflows.md create mode 100644 global.json delete mode 100644 nuget/DropoutCoder.PolylineAlgorithm.nuspec create mode 100644 samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineDecoder.cs create mode 100644 samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineEncoder.cs create mode 100644 samples/PolylineAlgorithm.NetTopologySuite.Sample/PolylineAlgorithm.NetTopologySuite.Sample.csproj create mode 100644 samples/PolylineAlgorithm.NetTopologySuite.Sample/Properties/CodeCoverage.cs delete mode 100644 src/Constants.cs delete mode 100644 src/DropoutCoder.PolylineAlgorithm.csproj delete mode 100644 src/Encoding/IPolylineEncoding.cs delete mode 100644 src/Encoding/PolylineEncoding.cs delete mode 100644 src/Encoding/PolylineEncodingBase.cs delete mode 100644 src/ExceptionMessageResource.Designer.cs delete mode 100644 src/PolylineAlgorithm.cs create mode 100644 src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs create mode 100644 src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs create mode 100644 src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs create mode 100644 src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs create mode 100644 src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs create mode 100644 src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs create mode 100644 src/PolylineAlgorithm/Internal/CoordinateDelta.cs create mode 100644 src/PolylineAlgorithm/Internal/Defaults.cs create mode 100644 src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs create mode 100644 src/PolylineAlgorithm/Internal/Diagnostics/LogDebugExtensions.cs create mode 100644 src/PolylineAlgorithm/Internal/Diagnostics/LogWarningExtensions.cs create mode 100644 src/PolylineAlgorithm/Internal/Pow10.cs create mode 100644 src/PolylineAlgorithm/InvalidPolylineException.cs create mode 100644 src/PolylineAlgorithm/PolylineAlgorithm.csproj create mode 100644 src/PolylineAlgorithm/PolylineEncoding.cs create mode 100644 src/PolylineAlgorithm/PolylineEncodingOptions.cs create mode 100644 src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs create mode 100644 src/PolylineAlgorithm/Properties/ExceptionMessageResource.Designer.cs rename src/{ => PolylineAlgorithm/Properties}/ExceptionMessageResource.resx (76%) create mode 100644 src/PolylineAlgorithm/Properties/GlobalSuppressions.cs create mode 100644 src/PolylineAlgorithm/PublicAPI.Shipped.txt create mode 100644 src/PolylineAlgorithm/PublicAPI.Unshipped.txt create mode 100644 src/PolylineAlgorithm/README.md delete mode 100644 src/Validation/CoordinateValidator.cs delete mode 100644 tests/Defaults.cs delete mode 100644 tests/DropoutCoder.PolylineAlgorithm.Tests.csproj delete mode 100644 tests/Encoding/PolylineEncodingBaseTest.cs delete mode 100644 tests/Encoding/PolylineEncodingTest.cs create mode 100644 tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineDecoderTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineEncoderTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Extensions/PolylineDecoderExtensionsTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Extensions/PolylineEncoderExtensionsTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Internal/CoordinateDeltaTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Internal/Diagnostics/ExceptionGuardTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Internal/Diagnostics/LogDebugExtensionsTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Internal/Diagnostics/LogWarningExtensionsTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Internal/Pow10Tests.cs create mode 100644 tests/PolylineAlgorithm.Tests/InvalidPolylineExceptionTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/PolylineAlgorithm.Tests.csproj create mode 100644 tests/PolylineAlgorithm.Tests/PolylineEncodingOptionsBuilderTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/PolylineEncodingTests.cs create mode 100644 tests/PolylineAlgorithm.Tests/Properties/Category.cs create mode 100644 tests/PolylineAlgorithm.Tests/Properties/CodeCoverage.cs create mode 100644 tests/PolylineAlgorithm.Tests/Properties/GlobalSuppressions.cs create mode 100644 tests/PolylineAlgorithm.Tests/Properties/GlobalUsings.cs create mode 100644 tests/PolylineAlgorithm.Tests/Properties/MSTestSettings.cs delete mode 100644 tests/PolylineAlgorithmTest.cs delete mode 100644 tests/Properties/AssemblyInfo.cs delete mode 100644 tests/Validation/CoordinateValidatorTest.cs create mode 100644 utilities/PolylineAlgorithm.Utility/PolylineAlgorithm.Utility.csproj create mode 100644 utilities/PolylineAlgorithm.Utility/Properties/CodeCoverage.cs create mode 100644 utilities/PolylineAlgorithm.Utility/RandomValueProvider.cs create mode 100644 utilities/PolylineAlgorithm.Utility/StaticValueProvider.cs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..75d9084f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,276 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +# All files +[*] +end_of_line = lf +insert_final_newline = true + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = false + +#### .NET Code Actions #### + +# Type members +dotnet_hide_advanced_members = false +dotnet_member_insertion_location = with_other_members_of_the_same_kind +dotnet_property_generation_behavior = prefer_auto_properties + +# Symbol search +dotnet_search_reference_assemblies = true + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = always_for_clarity +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members + +# Expression-level preferences +dotnet_prefer_system_hash_code = true +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true +dotnet_style_prefer_collection_expression = when_types_loosely_match +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_conditional_expression_over_assignment = true +dotnet_style_prefer_conditional_expression_over_return = true +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true + +# Field preferences +dotnet_style_readonly_field = true + +# Parameter preferences +dotnet_code_quality_unused_parameters = non_public + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +# New line preferences +dotnet_style_allow_multiple_blank_lines_experimental = false +dotnet_style_allow_statement_immediately_after_block_experimental = false + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false +csharp_style_var_for_built_in_types = false +csharp_style_var_when_type_is_apparent = false + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true +csharp_style_expression_bodied_constructors = false +csharp_style_expression_bodied_indexers = true +csharp_style_expression_bodied_lambdas = when_on_single_line +csharp_style_expression_bodied_local_functions = when_on_single_line +csharp_style_expression_bodied_methods = false +csharp_style_expression_bodied_operators = false +csharp_style_expression_bodied_properties = true + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_extended_property_pattern = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true +csharp_style_prefer_switch_expression = true + +# Null-checking preferences +csharp_style_conditional_delegate_call = true + +# Modifier preferences +csharp_prefer_static_anonymous_function = true +csharp_prefer_static_local_function = true +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async +csharp_style_prefer_readonly_struct = true +csharp_style_prefer_readonly_struct_member = true + +# Code-block preferences +csharp_prefer_braces = true +csharp_prefer_simple_using_statement = false +csharp_prefer_system_threading_lock = true +csharp_style_namespace_declarations = file_scoped +csharp_style_prefer_method_group_conversion = false +csharp_style_prefer_primary_constructors = false +csharp_style_prefer_top_level_statements = false + +# Expression-level preferences +csharp_prefer_simple_default_expression = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_inlined_variable_declaration = true +csharp_style_prefer_implicitly_typed_lambda_expression = true +csharp_style_prefer_index_operator = true +csharp_style_prefer_local_over_anonymous_function = false +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_range_operator = true +csharp_style_prefer_tuple_swap = true +csharp_style_prefer_unbound_generic_type_in_nameof = true +csharp_style_prefer_utf8_string_literals = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable +csharp_style_unused_value_expression_statement_preference = discard_variable + +# 'using' directive preferences +csharp_using_directive_placement = inside_namespace + +# New line preferences +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = false +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = false +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false +csharp_style_allow_embedded_statements_on_same_line_experimental = false + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = false +csharp_new_line_before_else = false +csharp_new_line_before_finally = false +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = none +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.private_or_internal_const_field_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.private_or_internal_const_field_should_be_pascal_case.symbols = private_or_internal_const_field +dotnet_naming_rule.private_or_internal_const_field_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.private_or_internal_field_should_be_underscore_camel_case.severity = suggestion +dotnet_naming_rule.private_or_internal_field_should_be_underscore_camel_case.symbols = private_or_internal_field +dotnet_naming_rule.private_or_internal_field_should_be_underscore_camel_case.style = underscore_camel_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_field.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, method, event +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +dotnet_naming_symbols.private_or_internal_const_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_const_field.applicable_accessibilities = internal, private, protected_internal, private_protected +dotnet_naming_symbols.private_or_internal_const_field.required_modifiers = const + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.underscore_camel_case.required_prefix = _ +dotnet_naming_style.underscore_camel_case.required_suffix = +dotnet_naming_style.underscore_camel_case.word_separator = +dotnet_naming_style.underscore_camel_case.capitalization = camel_case + +# Public API analyzer + +dotnet_public_api_analyzer.require_api_files = true diff --git a/.gitattributes b/.gitattributes index 5fa1ed0e..e4cab669 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,7 +10,7 @@ # default for csharp files. # Note: This is only used by command line ############################################################################### -#*.cs diff=csharp +*.cs diff=csharp ############################################################################### # Set the merge driver for project and solution files @@ -22,27 +22,28 @@ # these files as binary and thus will always conflict and require user # intervention with every merge. To do so, just uncomment the entries below ############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary +*.sln merge=binary +*.csproj merge=binary +*.vbproj merge=binary +*.vcxproj merge=binary +*.vcproj merge=binary +*.dbproj merge=binary +*.fsproj merge=binary +*.lsproj merge=binary +*.wixproj merge=binary +*.modelproj merge=binary +*.sqlproj merge=binary +*.wwaproj merge=binary ############################################################################### # behavior for image files # # image files are treated as binary by default. ############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary +*.jpg binary +*.png binary +*.gif binary +*.ico binary ############################################################################### # diff behavior for common document formats @@ -51,16 +52,16 @@ # is only available from the command line. Turn it on by uncommenting the # entries below. ############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain ############################################################################### # exclude files except those with cs file extension from repository language detection diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dd84ea78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/actions/documentation/docfx-build/action.yml b/.github/actions/documentation/docfx-build/action.yml new file mode 100644 index 00000000..a24e6e75 --- /dev/null +++ b/.github/actions/documentation/docfx-build/action.yml @@ -0,0 +1,45 @@ +name: 'Generate docs with docfx' +author: 'Pete Sramek' +description: 'Generate documentation using docfx' +inputs: +# Required + artifact-name: + description: 'Name of the artifact to upload after generating documentation' + required: true + docfx-json-manifest: + description: 'Path to the docfx JSON manifest file' + required: true + output-directory: + description: 'Target directory for generated documentation' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' + +runs: + using: composite + steps: + - name: Dotnet Setup + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + - name: 'testing variables' + shell: bash + run: | + echo "artifact-name: ${{ inputs.artifact-name }}" + echo "docfx-json-manifest: ${{ inputs.docfx-json-manifest }}" + echo "output-directory: ${{ inputs.output-directory }}" + echo "dotnet-sdk-version: ${{ inputs.dotnet_sdk_version }}" + - name: 'Update docfx tool' + run: dotnet tool update -g docfx + shell: bash + - name: 'Generate documentation' + run: docfx build ${{ inputs.docfx-json-manifest }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v7 + with: + name: ${{ inputs.artifact-name }} + path: ${{ inputs.output-directory }} diff --git a/.github/actions/documentation/docfx-metadata/action.yml b/.github/actions/documentation/docfx-metadata/action.yml new file mode 100644 index 00000000..bbcd6383 --- /dev/null +++ b/.github/actions/documentation/docfx-metadata/action.yml @@ -0,0 +1,65 @@ +name: 'Generate metadata with docfx' +author: 'Pete Sramek' +description: 'Generate metadata using docfx' + +inputs: +# Required + artifact-name: + description: 'Name of the artifact to upload after generating metadata' + required: true + docfx-json-manifest: + description: 'Path to the docfx JSON manifest file' + required: true + temporary-directory: + description: 'Temporary directory for docfx metadata generation' + required: true + output-directory: + description: 'Target directory for generated documentation' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' + +runs: + using: composite + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: Dotnet Setup + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + - name: 'Update docfx tool' + run: dotnet tool update -g docfx + shell: bash + - name: 'Delete temporary folder' + shell: bash + run: | + if [ -d "${{ inputs.temporary-directory }}" ]; then + rm -rf "${{ inputs.temporary-directory }}" + fi + - name: 'Delete temporary folder' + shell: bash + run: | + if [ -d "$${{ inputs.output-directory }}" ]; then + rm -rf "${{ inputs.output-directory }}" + fi + - name: 'Generate assembly metadata' + shell: bash + run: docfx metadata ${{ inputs.docfx-json-manifest }} + - name: 'List directory' + shell: bash + run: | + ls + - name: 'Copy metadata to output directory' + shell: bash + run: | + mkdir -p ${{ inputs.output-directory }} + cp -r ${{ inputs.temporary-directory }}/* ${{ inputs.output-directory }} + - name: 'Upload artifact' + uses: actions/upload-artifact@v7 + with: + name: ${{ inputs.artifact-name }} + path: ${{ inputs.output-directory }} diff --git a/.github/actions/git/push-changes/action.yml b/.github/actions/git/push-changes/action.yml new file mode 100644 index 00000000..31ddd3f2 --- /dev/null +++ b/.github/actions/git/push-changes/action.yml @@ -0,0 +1,99 @@ +name: 'Push Changes' +author: 'Pete Sramek' +description: 'Push changes to a specified branch in the repository.' +inputs: + # Required + commit-message: + description: 'The commit message to use when pushing changes.' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' + artifact-name: + description: 'Name of the artifact to download before pushing changes. Default: ''''' + required: false + default: '' + working-directory: + description: 'The working directory where the changes will be pushed from. Default ''.''' + required: false + default: '.' + target-branch: + description: 'The branch to push changes to.. Default: ''''' + required: false + default: '' + +runs: + using: "composite" + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Dotnet Setup + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: Download a single artifact + if: ${{ inputs.artifact-name != '' }} + uses: actions/download-artifact@v8 + with: + name: ${{ inputs.artifact-name }} + path: ${{ inputs.working-directory }} + + - name: Stage changes in ${{ inputs.working-directory }} + shell: bash + run: | + git add . + working-directory: ${{ inputs.working-directory }} + + - if: runner.os == 'Windows' + shell: bash + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - if: runner.os != 'Windows' + shell: bash + run: | + git config --global core.autocrlf true + git config --global core.eol lf + + - name: Create or switch to ${{ inputs.target-branch }} + if: ${{ inputs.target-branch != '' }} + shell: bash + run: | + git fetch origin + git stash push --keep-index + if git show-ref --verify --quiet refs/heads/${{ inputs.target-branch }}; then + echo "Branch ${{ inputs.target-branch }} already exists, switching to it." + git checkout ${{ inputs.target-branch }} --force + git pull origin ${{ inputs.target-branch }} + else + echo "Branch ${{ inputs.target-branch }} does not exist, creating it." + git checkout -b ${{ inputs.target-branch }} origin/${{ inputs.target-branch }} --force || git checkout -b ${{ inputs.target-branch }} --force + git pull origin ${{ inputs.target-branch }} + fi + git stash apply + + - name: Validate changes + id: validate + shell: bash + run: | + set +e + git diff --quiet --exit-code --cached + echo has-changes="$?" >> $GITHUB_OUTPUT + set -e + working-directory: ${{ inputs.working-directory }} + + - name: Push changes to ${{ github.head_ref || github.ref }} + if: ${{ fromJSON(steps.validate.outputs.has-changes) == '1' }} + shell: bash + run: | + git config user.name "$(git log -n 1 --pretty=format:%an)" + git config user.email "$(git log -n 1 --pretty=format:%ae)" + git commit -m '${{ inputs.commit-message }}' + git pull --rebase origin ${{ github.head_ref || github.ref }} + git push + working-directory: ${{ inputs.working-directory }} diff --git a/.github/actions/github/branch-protection/lock/action.yml b/.github/actions/github/branch-protection/lock/action.yml new file mode 100644 index 00000000..d8f345a1 --- /dev/null +++ b/.github/actions/github/branch-protection/lock/action.yml @@ -0,0 +1,40 @@ +name: 'Lock branch' +author: 'Pete Sramek' +description: 'Apply branch protection to prevent direct pushes. Requires PRs with at least one approval.' +inputs: + branch: + description: 'Branch name to lock.' + required: true + token: + description: 'GitHub token with administration:write (repo admin) permission. Use a PAT; GITHUB_TOKEN cannot call the branch protection API.' + required: true + +runs: + using: composite + steps: + - name: 'Lock branch ${{ inputs.branch }}' + shell: bash + env: + GH_TOKEN: ${{ inputs.token }} + run: | + if ! gh api --method PUT /repos/${{ github.repository }}/branches/${{ inputs.branch }}/protection \ + --input - << 'EOF' + { + "required_status_checks": null, + "enforce_admins": false, + "required_pull_request_reviews": { + "dismiss_stale_reviews": true, + "require_code_owner_reviews": false, + "required_approving_review_count": 1 + }, + "restrictions": null, + "allow_force_pushes": false, + "allow_deletions": false, + "lock_branch": false + } + EOF + then + echo "::error::Failed to apply branch protection to '${{ inputs.branch }}'. Ensure the token has 'administration: write' permission and the branch exists." + exit 1 + fi + echo "🔒 Branch '${{ inputs.branch }}' is now protected." >> $GITHUB_STEP_SUMMARY diff --git a/.github/actions/github/branch-protection/unlock/action.yml b/.github/actions/github/branch-protection/unlock/action.yml new file mode 100644 index 00000000..9c41d395 --- /dev/null +++ b/.github/actions/github/branch-protection/unlock/action.yml @@ -0,0 +1,21 @@ +name: 'Unlock branch' +author: 'Pete Sramek' +description: 'Remove branch protection to allow a workflow to push directly. Always re-lock after the operation.' +inputs: + branch: + description: 'Branch name to unlock.' + required: true + token: + description: 'GitHub token with administration:write (repo admin) permission. Use a PAT; GITHUB_TOKEN cannot call the branch protection API.' + required: true + +runs: + using: composite + steps: + - name: 'Unlock branch ${{ inputs.branch }}' + shell: bash + env: + GH_TOKEN: ${{ inputs.token }} + run: | + gh api --method DELETE /repos/${{ github.repository }}/branches/${{ inputs.branch }}/protection || true + echo "🔓 Branch protection removed from '${{ inputs.branch }}'." >> $GITHUB_STEP_SUMMARY diff --git a/.github/actions/github/create-release/action.yml b/.github/actions/github/create-release/action.yml new file mode 100644 index 00000000..0e0015ce --- /dev/null +++ b/.github/actions/github/create-release/action.yml @@ -0,0 +1,40 @@ +name: 'Create GitHub release' +author: 'Pete Sramek' +description: 'Create GitHub release.' +inputs: + release-version: + description: 'Version to use for the release.' + required: true + is-preview: + description: 'Is this a preview release?' + required: true + notes-start-tag: + description: 'Tag to start generating release notes from. Default: ''''' + required: false + default: '' + +runs: + using: composite + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - run: | + echo "release-version=${{ inputs.release-version }}" + echo "is-preview=${{ inputs.is-preview }}" + echo "preview-argument=${{ inputs.is-preview == 'true' && '--prerelease' || '' }}" + echo "notes-start-tag=${{ inputs.notes-start-tag }}" + echo "notes-start-tag-argument="${{ inputs.notes-start-tag != '' && '--notes-start-tag $(inputs.notes-start-tag)' || '' }}" + shell: bash + - name: 'Create git tag ${{ env.release-version }}' + shell: bash + run: | + git tag -a ${{ env.release-version }} -m "${{ env.release-version }}" + - name: 'Create GitHub release PolylineAlgorithm ${{ env.release-version }}' + shell: bash + env: + GH_TOKEN: ${{ github.token }} + release-version: ${{ inputs.release-version }} + preview-argument: "${{ inputs.is-preview == 'true' && '--prerelease' || '' }}" + notes-start-tag-argument: "${{ inputs.notes-start-tag != '' && '--notes-start-tag $(inputs.notes-start-tag)' || '' }}" + run: | + gh release create ${{ env.release-version }} --generate-notes --discussion-category "General" ${{ env.preview-argument }} ${{ env.notes-start-tag-argument }} diff --git a/.github/actions/github/write-file-to-summary/action.yml b/.github/actions/github/write-file-to-summary/action.yml new file mode 100644 index 00000000..c185ce4b --- /dev/null +++ b/.github/actions/github/write-file-to-summary/action.yml @@ -0,0 +1,25 @@ +name: 'Write file to step summary' +author: 'Pete Sramek' +description: 'Writes file contents to step summary.' +inputs: +# Required + file-glob-pattern: + description: 'Search pattern for files to write.' + required: true + +# Optional + working-directory: + description: 'Working directory to search for file.' + required: false + default: ${{ github.workspace }} + +runs: + using: composite + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Writing ${{ inputs.file }} to step summary + shell: bash + run: cat ${{ inputs.file }} >> $GITHUB_STEP_SUMMARY + working-directory: ${{ inputs.working-directory }} \ No newline at end of file diff --git a/.github/actions/nuget/publish-package/action.yml b/.github/actions/nuget/publish-package/action.yml new file mode 100644 index 00000000..eec82f65 --- /dev/null +++ b/.github/actions/nuget/publish-package/action.yml @@ -0,0 +1,61 @@ +name: 'Publish packages to NuGet feed' +author: 'Pete Sramek' +description: 'Publishes packages in working directory to public NuGet feed' +inputs: +# Required + package-artifact-name: + description: 'Name of the artifact to download and publish' + required: true + nuget-feed-url: + description: 'NuGet feed URL' + required: true + nuget-feed-api-key: + description: 'NuGet feed API key' + required: true + nuget-feed-server: + description: 'NuGet feed server. Allowed values: ''NuGet'', ''AzureArtifacts''' + required: true +# Optional + dotnet-sdk-version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' + working-directory: + description: 'Working directory to search for file.' + required: false + default: ${{ github.workspace }} + +runs: + using: composite + + steps: + + - if: ${{ inputs.nuget-feed-server != 'NuGet' && inputs.nuget-feed-server != 'AzureArtifacts' }} + name: 'Validate NuGet feed server type' + shell: bash + run: | + echo "Invalid NuGet feed server type. Allowed values are ''NuGet'' or ''AzureArtifacts''." + exit 1 + + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Download package artifact + uses: actions/download-artifact@v8 + with: + name: ${{ inputs.package-artifact-name }} + + - if: ${{ inputs.nuget-feed-server == 'NuGet' }} + name: 'Publish package to NuGet' + shell: bash + run: | + dotnet nuget push **/*.nupkg --source ${{ inputs.nuget-feed-url }} --api-key ${{ inputs.nuget-feed-api-key }} + working-directory: ${{ env.working-directory }} + + - if: ${{ inputs.nuget-feed-server == 'AzureArtifacts' }} + name: 'Publish package to Azure Artifacts' + shell: bash + run: | + dotnet nuget add source ${{ inputs.nuget-feed-url }} --name nuget-feed --username username --password ${{ inputs.nuget-feed-api-key }} --store-password-in-clear-text + dotnet nuget push **/*.nupkg --source nuget-feed --api-key ${{ inputs.nuget-feed-api-key }} --skip-duplicate + working-directory: ${{ env.working-directory }} \ No newline at end of file diff --git a/.github/actions/source/compile/action.yml b/.github/actions/source/compile/action.yml new file mode 100644 index 00000000..0af331ee --- /dev/null +++ b/.github/actions/source/compile/action.yml @@ -0,0 +1,74 @@ +name: 'Compile source code' +author: 'Pete Sramek' +description: 'Compiles source code, uploads build artifacts.' +inputs: +# Required + assembly-version: + description: 'Assembly version.' + required: true + assembly-informational-version: + description: 'Assembly informational version.' + required: true + file-version: + description: 'Assembly file version.' + required: true + treat-warnins-as-error: + description: 'Treat warnings as errors.' + required: true + project-path: + description: 'Search pattern for source code.' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: ''10.x''' + required: false + default: '10.x' + build-configuration: + description: 'Build configuration. Default: ''Release''' + required: false + default: 'Release' + build-platform: + description: 'Build platform. Deafult: ''Any CPU''' + required: false + default: 'Any CPU' + upload-build-artifacts: + description: 'Upload build artifacts, Default: ''true''' + required: false + default: 'true' + build-artifacts-glob-pattern: + description: 'Search pattern for build artifacts. Default: **/bin/*, **/obj/*' + required: false + default: | + **/bin/* + **/obj/* + build-artifacts-name: + description: 'Upload build artifacts, Default: ''build''' + required: false + default: 'build' + +runs: + using: "composite" + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ inputs.dotnet_sdk_version }}' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + + - if: ${{ inputs.treat-warnings-as-error == 'true' }} + name: 'Validate warnings with .NET CLI' + shell: bash + run: dotnet format analyzers --severity warn --verify-no-changes + + - name: 'Build with .NET CLI' + shell: bash + run: dotnet build ${{ inputs.search-glob-pattern }} --configuration ${{ inputs.build-configuration }} /p:Platform="${{ inputs.build-platform }}" /p:Version=${{ inputs.assembly-version }} /p:AssemblyInformationalVersion=${{ inputs.assembly-informational-version }} /p:FileVersion=${{ inputs.file-version }} + + - name: 'Upload build artifacts' + if: ${{ inputs.upload-build-artifacts == 'true' }} + uses: actions/upload-artifact@v7 + with: + name: ${{ inputs.build-artifacts-name }} + path: ${{ inputs.build-artifacts-glob-pattern }} diff --git a/.github/actions/source/format/action.yml b/.github/actions/source/format/action.yml new file mode 100644 index 00000000..de2536c2 --- /dev/null +++ b/.github/actions/source/format/action.yml @@ -0,0 +1,73 @@ +name: 'Format source code' +author: 'Pete Sramek' +description: 'Formats source code using dotnet format tool. Pushes changes to the current branch.' +inputs: +# Required + project-path: + description: 'Path to the project or solution file.' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: ''10.x''' + required: false + default: '10.x' + format-whitespace: + description: 'Format whitespace. Default: ''true''' + required: false + default: 'true' + format-style: + description: 'Format style. Default: ''true''' + required: false + default: 'true' + format-analyzers: + description: 'Format analyzers. Default: ''false''' + required: false + default: 'false' + format-analyzers-diagnostics-parameter: + description: 'Format analyzers diagnostics parameter. Default: ''''' + required: false + default: '' + +runs: + using: "composite" + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ inputs.dotnet_sdk_version }}' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + + - name: Format whitespace + if: ${{ inputs.format-whitespace == 'true' }} + shell: bash + run: | + dotnet format whitespace + working-directory: ${{ github.workspace }} + + - name: Format style + if: ${{ inputs.format-style == 'true' }} + shell: bash + run: | + dotnet format style + working-directory: ${{ github.workspace }} + + - name: 'Set target branch' + if: ${{ inputs.format-analyzers == 'true' && inputs.format-analyzers-diagnostics-parameter != '' }} + id: set-diagnostics-parameter + shell: bash + run: | + echo "format-analyzers-diagnostics-parameter=--diagnostics ${{ inputs.format-analyzers-diagnostics-parameter }}" >> $GITHUB_OUTPUT + + - name: Format analyzers + if: ${{ inputs.format-analyzers == 'true' }} + shell: bash + run: | + dotnet format analyzers ${{ env.format-analyzers-diagnostics-parameter }} + working-directory: ${{ github.workspace }} + + - name: 'Push changes' + uses: './.github/actions/git/push-changes' + with: + commit-message: 'Formatted csharp files' diff --git a/.github/actions/testing/code-coverage/action.yml b/.github/actions/testing/code-coverage/action.yml new file mode 100644 index 00000000..8751a7b2 --- /dev/null +++ b/.github/actions/testing/code-coverage/action.yml @@ -0,0 +1,73 @@ +name: 'Test with .NET CLI' +author: 'Pete Sramek' +description: 'Run tests, collects code coverage, logs test results, uploads test artifacts' +inputs: +# Required + test-result-folder: + description: 'Folder where test results are stored' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' + +outputs: + code-coverage-report-file: + description: 'Path to the generated code coverage report' + value: ${{ steps.variables.outputs.code-coverage-report-file }} + code-coverage-merge-file: + description: 'Path to the merged code coverage file' + value: ${{ steps.variables.outputs.code-coverage-merge-file }} + +runs: + using: composite + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ inputs.dotnet_sdk_version }}' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + + - if: ${{ endsWith(inputs.test-result-folder, '/') }} + name: 'Set TEST_RESULT_FOLDER environment variable' + shell: bash + run: echo "TEST_RESULT_FOLDER=${{ inputs.test-result-folder }}" >> $GITHUB_ENV + + - if: ${{ !endsWith(inputs.test-result-folder, '/') }} + name: 'Set TEST_RESULT_FOLDER environment variable' + shell: bash + run: echo "TEST_RESULT_FOLDER=${{ inputs.test-result-folder }}/" >> $GITHUB_ENV + + - name: 'Set CODE_COVERAGE_REPORT_FOLDER environment variable' + shell: bash + run: echo "CODE_COVERAGE_REPORT_FOLDER=${{ env.TEST_RESULT_FOLDER }}coverage-report/" >> $GITHUB_ENV + + - name: 'Set CODE_COVERAGE_MERGED_FILE environment variable' + shell: bash + run: echo "CODE_COVERAGE_MERGED_FILE=${{ env.CODE_COVERAGE_REPORT_FOLDER }}code-coverage.cobertura.xml" >> $GITHUB_ENV + + - name: 'Set code-coverage-report output' + id: variables + shell: bash + run: | + echo "code-coverage-report-file=${{ env.CODE_COVERAGE_REPORT_FOLDER }}Summary.md" >> $GITHUB_OUTPUT + echo "code-coverage-merge-file=${{ env.CODE_COVERAGE_MERGED_FILE }}" >> $GITHUB_OUTPUT + + - name: 'Update dotnet-coverage tool' + shell: bash + run: dotnet tool update --global dotnet-coverage + + - name: 'Merge code coverage reports' + shell: bash + run: dotnet-coverage merge --output ${{ env.CODE_COVERAGE_MERGED_FILE }} --output-format cobertura "${{ env.TEST_RESULT_FOLDER }}**/*.cobertura.xml" + + - name: 'Update dotnet-reportgenerator-globaltool tool' + shell: bash + run: dotnet tool update --global dotnet-reportgenerator-globaltool + + - name: 'Generate code coverage report' + shell: bash + run: reportgenerator -reports:${{ env.CODE_COVERAGE_MERGED_FILE }} -targetdir:${{ env.CODE_COVERAGE_REPORT_FOLDER }} -reporttypes:"MarkdownSummary" diff --git a/.github/actions/testing/test-report/action.yml b/.github/actions/testing/test-report/action.yml new file mode 100644 index 00000000..40e66385 --- /dev/null +++ b/.github/actions/testing/test-report/action.yml @@ -0,0 +1,60 @@ +name: 'Generate test report with Liquid Test Reports CLI' +author: 'Pete Sramek' +description: 'Run tests, collects code coverage, logs test results, uploads test artifacts' +inputs: +# Required + test-result-folder: + description: 'Folder where test results are stored' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' + test-report-filename: + description: 'Filename of the test report. Default: test-report.md' + required: false + default: 'test-report.md' + +outputs: + test-report-file: + description: 'Path to the generated test report' + value: ${{ steps.variables.outputs.test-report-file }} + +runs: + using: composite + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ inputs.dotnet_sdk_version }}' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + + - name: Install LiquidTestReports.Cli + shell: bash + run: dotnet tool install --global LiquidTestReports.Cli --prerelease + + - if: ${{ endsWith(inputs.test-result-folder, '/') }} + name: 'Set TEST_RESULT_FOLDER environment variable' + shell: bash + run: echo "TEST_RESULT_FOLDER=${{ inputs.test-result-folder }}" >> $GITHUB_ENV + + - if: ${{ !endsWith(inputs.test-result-folder, '/') }} + name: 'Set TEST_RESULT_FOLDER environment variable' + shell: bash + run: echo "TEST_RESULT_FOLDER=${{ inputs.test-result-folder }}/" >> $GITHUB_ENV + + - name: 'Set TEST_REPORT_FILE environment variable' + shell: bash + run: echo "TEST_REPORT_FILE=${{ env.TEST_RESULT_FOLDER }}${{ inputs.test-report-filename }}" >> $GITHUB_ENV + + - name: 'Set test-report-file output' + id: variables + shell: bash + run: echo "test-report-file=${{ env.TEST_REPORT_FILE }}" >> $GITHUB_OUTPUT + + - name: Generate test report + shell: bash + run: liquid --inputs "Folder=${{ env.TEST_RESULT_FOLDER }};File=**/*.trx;Format=Trx" --output-file ${{ env.TEST_REPORT_FILE }} diff --git a/.github/actions/testing/test/action.yml b/.github/actions/testing/test/action.yml new file mode 100644 index 00000000..b4aff310 --- /dev/null +++ b/.github/actions/testing/test/action.yml @@ -0,0 +1,84 @@ +name: 'Test with .NET CLI' +author: 'Pete Sramek' +description: 'Run tests, collects code coverage, logs test results, uploads test artifacts' +inputs: +# Required + project-path: + description: 'Search pattern for test projects.' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' + build-configuration: + description: 'Build configuration. Default: Release' + required: false + default: 'Release' + use-trf-logger: + description: 'Use TRX logger. Default: true' + required: false + default: 'true' + collect-code-coverage: + description: 'Collect code coverage. Default: true' + required: false + default: 'true' + code-coverage-output-format: + description: 'Code coverage output format. Default: cobertura' + required: false + default: 'cobertura' + code-coverage-settings-file: + description: 'Code coverage settings file. Default: ""' + required: false + default: '' + upload-test-artifacts: + description: 'Upload test artifacts, Default: true' + required: false + default: 'true' + test-results-directory: + description: 'Search pattern for test artifacts. Default: "test-results"' + required: false + default: 'test-results' + test-artifacts-name: + description: 'Test artifacts name, Default: "test-results"' + required: false + default: 'test-results' + +runs: + using: composite + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ inputs.dotnet_sdk_version }}' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + + - if: ${{ inputs.use-trf-logger == 'true' }} + name: 'Set TRX_LOGGER_ARGS environment variable' + shell: bash + run: echo "TRX_LOGGER_ARGS=--report-trx" >> $GITHUB_ENV + + - if: ${{ inputs.collect-code-coverage == 'true' }} + name: 'Set CODE_COVERAGE_ARGS environment variable' + shell: bash + run: | + echo "CODE_COVERAGE_ARGS=--coverage --coverage-output-format ${{ inputs.code-coverage-output-format}}" >> $GITHUB_ENV + + - if: ${{ inputs.collect-code-coverage == 'true' && inputs.code-coverage-settings-file != ''}} + name: 'Set CODE_COVERAGE_ARGS environment variable' + shell: bash + run: | + echo "CODE_COVERAGE_ARGS=${{ env.CODE_COVERAGE_ARGS }} --coverage-settings ${{ inputs.code-coverage-settings-file }}" >> $GITHUB_ENV + + - name: 'Test with .NET CLI' + shell: bash + run: dotnet test --project ${{ inputs.project-path }} --configuration ${{ inputs.build-configuration }} ${{ env.CODE_COVERAGE_ARGS }} ${{ env.TRX_LOGGER_ARGS }} --results-directory ${{ inputs.test-results-directory }} + + - name: 'Upload test results' + if: ${{ inputs.upload-test-artifacts == 'true' }} + uses: actions/upload-artifact@v7 + with: + name: '${{ inputs.test-artifacts-name }}' + path: '${{ inputs.test-results-directory }}*' diff --git a/.github/actions/versioning/extract-version/action.yml b/.github/actions/versioning/extract-version/action.yml new file mode 100644 index 00000000..ba604761 --- /dev/null +++ b/.github/actions/versioning/extract-version/action.yml @@ -0,0 +1,51 @@ +name: 'Extract version' +author: 'Pete Sramek' +description: 'Determines versions for the build.' +inputs: +# Required + branch-name: + description: 'Branch name.' + required: true +# Optional + default-version: + description: 'Default version to use if no match is found. Default: ''0.0''' + required: false + default: '0.0' + version-format: + description: 'Version format. Default: ''(\d+).(\d+)''' + required: false + default: '(\d+).(\d+)' + dotnet_sdk_version: + description: '.NET SDK version. Default: ''10.x''' + required: false + default: '10.x' +outputs: + version: + description: 'Version extracted from the branch name.' + value: ${{ steps.resolve-version.outputs.version }} + +runs: + using: "composite" + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ inputs.dotnet_sdk_version }}' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + + - name: 'Extract version from branch name' + id: regex-match + uses: actions-ecosystem/action-regex-match@v2 + with: + text: ${{ inputs.branch-name }} + regex: ${{ inputs.version-format }} + flags: 'g' + + - name: 'Resolve version' + id: resolve-version + shell: bash + run: | + VERSION="${{ steps.regex-match.outputs.match }}" + echo "version=${VERSION:-${{ inputs.default-version }}}" >> $GITHUB_OUTPUT diff --git a/.github/actions/versioning/format-version/action.yml b/.github/actions/versioning/format-version/action.yml new file mode 100644 index 00000000..70289ee0 --- /dev/null +++ b/.github/actions/versioning/format-version/action.yml @@ -0,0 +1,66 @@ +name: 'Format version' +author: 'Pete Sramek' +description: 'Formats versions.' +inputs: +# Required + version: + description: 'Version to use.' + required: true + patch: + description: 'Patch version to append to the formatted version.' + required: true + build-number: + description: 'Build number to append to the formatted version.' + required: true + sha: + description: 'Commit SHA to append to the formatted version.' + required: true + pre-release-tag: + description: 'Pre-release tag to append to the formatted version.' + required: true +# Optional + dotnet_sdk_version: + description: '.NET SDK version. Default: ''10.x''' + required: false + default: '10.x' + +outputs: + friendly-version: + description: 'Formatted friendly version.' + value: ${{ steps.format-version.outputs.friendly-version }} + assembly-version: + description: 'Formatted assembly version.' + value: ${{ steps.format-version.outputs.assembly-version }} + assembly-informational-version: + description: 'Formatted assembly informational version.' + value: ${{ steps.format-version.outputs.assembly-informational-version }} + file-version: + description: 'Formatted file version.' + value: ${{ steps.format-version.outputs.file-version }} + release-version: + description: 'Formatted release version.' + value: ${{ steps.format-version.outputs.release-version }} + +runs: + using: "composite" + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ inputs.dotnet_sdk_version }}' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet_sdk_version }} + - name: 'Format version' + shell: bash + id: format-version + run: | + echo "friendly-version=${{ inputs.version }}" >> $GITHUB_OUTPUT + echo "assembly-version=${{ inputs.version }}.${{ inputs.patch }}.${{ inputs.build-number }}" >> $GITHUB_OUTPUT + echo "assembly-informational-version=${{ inputs.version }}.${{ inputs.patch }}+${{ inputs.sha }}" >> $GITHUB_OUTPUT + echo "file-version=${{ inputs.version }}.${{ inputs.patch }}.${{ inputs.build-number }}" >> $GITHUB_OUTPUT + if [ -n "${{ inputs.pre-release-tag }}" ]; then + echo "release-version=${{ inputs.version }}.${{ inputs.patch }}-${{ inputs.pre-release-tag }}.${{ inputs.build-number }}" >> $GITHUB_OUTPUT + else + echo "release-version=${{ inputs.version }}.${{ inputs.patch }}.${{ inputs.build-number }}" >> $GITHUB_OUTPUT + fi diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..02a54502 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: + - package-ecosystem: "dotnet-sdk" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "nuget" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..047d4afd --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,258 @@ +name: Build + +on: + workflow_dispatch: + push: + branches-ignore: + - 'preview/**' + - 'release/**' + paths: + - 'src/**' + +permissions: + actions: read + pages: write + id-token: write + contents: write + +concurrency: + group: build-${{ github.head_ref || github.ref }} + cancel-in-progress: false + +env: + dotnet-sdk-version: '10.x' + build-configuration: 'Release' + build-platform: 'Any CPU' + git-version: '6.0.x' + test-result-directory: 'test-results' + nuget-packages-directory: 'nuget-packages' + +jobs: + workflow-variables: + name: 'Set workflow variables' + runs-on: ubuntu-latest + + outputs: + is-release: ${{ startsWith(github.ref_name, 'release') }} + is-preview: ${{ startsWith(github.ref_name, 'preview') }} + + steps: + - name: 'Set workflow variables' + id: github + run: | + echo "is-release:${{ startsWith(github.ref_name, 'release') }}" + echo "is-preview:${{ startsWith(github.ref_name, 'preview') }}" + + versioning: + name: 'Extract version' + runs-on: ubuntu-latest + outputs: + friendly-version: ${{ steps.format-version.outputs.friendly-version }} + assembly-version: ${{ steps.format-version.outputs.assembly-version }} + assembly-informational-version: ${{ steps.format-version.outputs.assembly-informational-version }} + file-version: ${{ steps.format-version.outputs.file-version }} + release-version: ${{ steps.format-version.outputs.release-version }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + - name: 'Extract version from branch name' + id: extract-version + uses: './.github/actions/versioning/extract-version' + with: + branch-name: ${{ github.ref_name }} + - name: 'Create build number' + shell: bash + id: create-build-number + run: | + git fetch --unshallow --filter=tree:0 + build_number=$(git rev-list --count origin/${{ github.ref_name }} ^origin/main) + echo "build-number=$build_number" >> $GITHUB_OUTPUT + - name: 'Create pre-release tag' + shell: bash + id: create-pre-release-tag + env: + build-number: ${{ steps.create-build-number.outputs.build-number }} + run: | + if [[ '${{ needs.workflow-variables.outputs.is-release }}' == 'true' ]]; then + echo "pre-release-tag=" >> $GITHUB_OUTPUT + elif [[ '${{ needs.workflow-variables.outputs.is-preview }}' == 'true' ]]; then + pre_release_tag='preview' + echo "pre-release-tag=$pre_release_tag" >> $GITHUB_OUTPUT + else + pre_release_tag=$(echo ${{ github.ref_name }} | tr '/' '-' | tr '.' '-'| tr '_' '-') + echo "pre-release-tag=$pre_release_tag" >> $GITHUB_OUTPUT + fi + - name: 'Format version' + id: format-version + uses: ./.github/actions/versioning/format-version + with: + version: ${{ steps.extract-version.outputs.version }} + patch: ${{ github.run_number }} + build-number: ${{ steps.create-build-number.outputs.build-number }} + sha: ${{ github.sha }} + pre-release-tag: ${{ steps.create-pre-release-tag.outputs.pre-release-tag }} + + format: + name: 'Format source code' + runs-on: ubuntu-latest + + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Format source code' + uses: ./.github/actions/source/format + with: + project-path: '**/PolylineAlgorithm.csproj' + + build: + name: 'Compile source code' + needs: [workflow-variables, versioning, format] + runs-on: ubuntu-latest + + env: + assembly-version: ${{ needs.versioning.outputs.assembly-version }} + assembly-informational-version: ${{ needs.versioning.outputs.assembly-informational-version }} + file-version: ${{ needs.versioning.outputs.file-version }} + + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Compile source code' + uses: ./.github/actions/source/compile + with: + project-path: '**/PolylineAlgorithm.csproj' + assembly-version: ${{ env.assembly-version }} + assembly-informational-version: ${{ env.assembly-informational-version }} + file-version: ${{ env.file-version }} + treat-warnins-as-error: ${{ needs.workflow-variables.outputs.is-release }} + + test: + name: 'Run tests' + needs: [build] + runs-on: ubuntu-latest + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Run tests' + uses: ./.github/actions/testing/test + with: + project-path: './tests/PolylineAlgorithm.Tests/PolylineAlgorithm.Tests.csproj' + test-results-directory: '${{ runner.temp }}/${{ env.test-result-directory }}/' + code-coverage-settings-file: '${{ github.workspace}}/code-coverage-settings.xml' + + - name: 'Generate test report' + uses: ./.github/actions/testing/test-report + id: test-report + with: + test-result-folder: '${{ runner.temp }}/${{ env.test-result-directory }}/' + + - name: Write test report summary + run: cat ${{ steps.test-report.outputs.test-report-file }} >> $GITHUB_STEP_SUMMARY + + - name: 'Generate code coverage' + uses: ./.github/actions/testing/code-coverage + id: code-coverage-report + with: + test-result-folder: '${{ runner.temp }}/${{ env.test-result-directory }}/' + + - name: Write code coverage report summary + run: cat ${{ steps.code-coverage-report.outputs.code-coverage-report-file }} >> $GITHUB_STEP_SUMMARY + + pack: + name: 'Package binaries' + needs: [versioning, build] + runs-on: ubuntu-latest + env: + assembly-version: ${{ needs.versioning.outputs.assembly-version }} + assembly-informational-version: ${{ needs.versioning.outputs.assembly-informational-version }} + file-version: ${{ needs.versioning.outputs.file-version }} + release-version: ${{ needs.versioning.outputs.release-version }} + package-artifact-name: package + outputs: + package-artifact-name: ${{ env.package-artifact-name }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: Download Build + uses: actions/download-artifact@v8 + with: + name: build + + - name: Pack with .NET + run: | + dotnet pack ${{ vars.SRC_DEFAULT_GLOB_PATTERN }} --configuration ${{ env.build-configuration }} /p:Platform="${{ env.build-platform }}" /p:PackageVersion=${{ env.release-version }} /p:Version=${{ env.assembly-version }} /p:AssemblyInformationalVersion=${{ env.assembly-informational-version }} /p:FileVersion=${{ env.file-version }} --output ${{ runner.temp }}/${{ env.nuget-packages-directory }} + + - name: Upload Package + uses: actions/upload-artifact@v7 + with: + name: ${{ env.package-artifact-name }} + path: | + ${{ runner.temp }}/${{ env.nuget-packages-directory }}/**/*.nupkg + ${{ runner.temp }}/${{ env.nuget-packages-directory }}/**/*.snupkg + + publish-package: + name: 'Publish development package' + needs: [pack] + env: + package-artifact-name: ${{ needs.pack.outputs.package-artifact-name }} + runs-on: ubuntu-latest + environment: 'Development' + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Publish package to Azure Artifact feed' + uses: ./.github/actions/nuget/publish-package + with: + package-artifact-name: ${{ env.package-artifact-name }} + nuget-feed-url: ${{ vars.NUGET_PACKAGE_FEED_URL }} + nuget-feed-api-key: ${{ secrets.NUGET_PACKAGE_FEED_API_KEY }} + nuget-feed-server: 'AzureArtifacts' + working-directory: ${{ runner.temp }}/${{ env.nuget-packages-directory }} + dotnet-sdk-version: ${{ env.dotnet-sdk-version }}' + + generate-assembly-metadata: + name: 'Generate assembly metadata' + needs: [versioning, build] + env: + friendly-version: ${{ needs.versioning.outputs.friendly-version }} + runs-on: ubuntu-latest + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'Generate assembly metadata' + uses: ./.github/actions/documentation/docfx-metadata + with: + artifact-name: 'assembly-metadata' + docfx-json-manifest: './api-reference/assembly-metadata.json' + temporary-directory: './api-reference/temp' + output-directory: './api-reference/${{ env.friendly-version }}' + - name: 'Push assembly metadata artifact' + uses: ./.github/actions/git/push-changes + with: + artifact-name: 'assembly-metadata' + commit-message: 'Updated docs for version ${{ env.friendly-version }}' + working-directory: './api-reference/${{ env.friendly-version }}' diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml new file mode 100644 index 00000000..6f79680c --- /dev/null +++ b/.github/workflows/bump-version.yml @@ -0,0 +1,156 @@ +name: 'Bump version' + +on: + workflow_dispatch: + inputs: + bump-type: + type: choice + options: + - 'minor' + - 'major' + description: 'Version bump type. Use ''minor'' to add features (keeps API files), ''major'' for breaking changes (resets API files).' + required: true + +permissions: + actions: read + contents: write + pull-requests: write + +concurrency: + group: bump-version + cancel-in-progress: false + +env: + dotnet-sdk-version: '10.x' + +jobs: + detect-version: + name: 'Detect current version and calculate next' + runs-on: ubuntu-latest + outputs: + current-version: ${{ steps.detect.outputs.current-version }} + next-version: ${{ steps.calculate.outputs.next-version }} + target-branch: ${{ steps.calculate.outputs.target-branch }} + steps: + - name: 'Checkout main' + uses: actions/checkout@v6 + with: + ref: main + fetch-depth: 0 + + - name: 'Detect highest release branch' + id: detect + run: | + git fetch origin + latest=$(git ls-remote --heads origin 'release/*' | grep -oP 'release/\K\d+\.\d+' | sort -V | tail -1) + if [[ -z "$latest" ]]; then + latest="0.0" + fi + echo "Detected current version: $latest" + echo "current-version=$latest" >> $GITHUB_OUTPUT + + - name: 'Calculate next version' + id: calculate + run: | + current="${{ steps.detect.outputs.current-version }}" + major="${current%%.*}" + minor="${current##*.}" + if [[ "${{ inputs.bump-type }}" == "major" ]]; then + next_major=$((major + 1)) + next_version="${next_major}.0" + else + next_minor=$((minor + 1)) + next_version="${major}.${next_minor}" + fi + echo "Next version: $next_version" + echo "next-version=$next_version" >> $GITHUB_OUTPUT + echo "target-branch=develop/${next_version}" >> $GITHUB_OUTPUT + + validate: + name: 'Validate bump' + needs: [detect-version] + runs-on: ubuntu-latest + steps: + - name: 'Checkout main' + uses: actions/checkout@v6 + with: + ref: main + fetch-depth: 1 + + - name: 'Validate workflow is running from main' + if: ${{ github.ref_name != 'main' }} + run: | + echo "This workflow must be run from the 'main' branch. Current branch: '${{ github.ref_name }}'." + exit 1 + + - name: 'Validate target branch does not exist' + run: | + set +e + git ls-remote --exit-code --heads origin "${{ needs.detect-version.outputs.target-branch }}" + if [[ $? -eq 0 ]]; then + echo "Target branch '${{ needs.detect-version.outputs.target-branch }}' already exists." + exit 1 + fi + set -e + + create-branch: + name: 'Create ${{ needs.detect-version.outputs.target-branch }}' + needs: [detect-version, validate] + runs-on: ubuntu-latest + env: + next-version: ${{ needs.detect-version.outputs.next-version }} + target-branch: ${{ needs.detect-version.outputs.target-branch }} + steps: + - name: 'Checkout main' + uses: actions/checkout@v6 + with: + ref: main + fetch-depth: 0 + + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Configure git' + run: | + git config user.name "$(git log -n 1 --pretty=format:%an)" + git config user.email "$(git log -n 1 --pretty=format:%ae)" + + - name: 'Create develop branch from main' + run: | + git checkout -b ${{ env.target-branch }} + + - name: 'Reset PublicAPI files for major bump' + if: ${{ inputs.bump-type == 'major' }} + run: | + find . \( -name "PublicAPI.Shipped.txt" -o -name "PublicAPI.Unshipped.txt" \) | while read file; do + printf '\xef\xbb\xbf#nullable enable\n' > "$file" + echo "Reset: $file" + done + + - name: 'Commit API file reset' + if: ${{ inputs.bump-type == 'major' }} + run: | + git add . + git diff --staged --quiet || git commit -m "Reset PublicAPI files for major version ${{ env.next-version }}" + + - name: 'Push develop branch' + run: | + git push --set-upstream origin ${{ env.target-branch }} + + - name: 'Write summary' + run: | + echo "## ✅ Branch created: \`${{ env.target-branch }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| | |" >> $GITHUB_STEP_SUMMARY + echo "|---|---|" >> $GITHUB_STEP_SUMMARY + echo "| **Bump type** | ${{ inputs.bump-type }} |" >> $GITHUB_STEP_SUMMARY + echo "| **Previous version** | ${{ needs.detect-version.outputs.current-version }} |" >> $GITHUB_STEP_SUMMARY + echo "| **New version** | ${{ env.next-version }} |" >> $GITHUB_STEP_SUMMARY + echo "| **Target branch** | \`${{ env.target-branch }}\` |" >> $GITHUB_STEP_SUMMARY + if [[ "${{ inputs.bump-type }}" == "major" ]]; then + echo "| **API files** | Reset (major bump) |" >> $GITHUB_STEP_SUMMARY + else + echo "| **API files** | Preserved (minor bump) |" >> $GITHUB_STEP_SUMMARY + fi diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index 1b11d4ec..00000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,97 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL Advanced" - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - schedule: - - cron: '29 17 * * 3' - -jobs: - analyze: - name: Analyze (${{ matrix.language }}) - # Runner size impacts CodeQL analysis time. To learn more, please see: - # - https://gh.io/recommended-hardware-resources-for-running-codeql - # - https://gh.io/supported-runners-and-hardware-resources - # - https://gh.io/using-larger-runners (GitHub.com only) - # Consider using larger runners or machines with greater resources for possible analysis time improvements. - runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} - permissions: - # required for all workflows - security-events: write - - # required to fetch internal or private CodeQL packs - packages: read - - # only required for workflows in private repositories - actions: read - contents: read - - strategy: - fail-fast: false - matrix: - include: - - language: csharp - build-mode: none - # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' - # Use `c-cpp` to analyze code written in C, C++ or both - # Use 'java-kotlin' to analyze code written in Java, Kotlin or both - # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both - # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, - # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. - # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how - # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup .NET - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 9.0.x - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # ℹ️ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - if: matrix.build-mode == 'manual' - shell: bash - run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 - with: - category: "/language:${{matrix.language}}" diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml deleted file mode 100644 index 0bfc8aa7..00000000 --- a/.github/workflows/dotnet.yml +++ /dev/null @@ -1,28 +0,0 @@ -# This workflow will build a .NET project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net - -name: .NET - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Setup .NET - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 8.0.x - - name: Restore dependencies - run: dotnet restore - - name: Build - run: dotnet build --no-restore - - name: Test - run: dotnet test --no-build --verbosity normal diff --git a/.github/workflows/promote-branch.yml b/.github/workflows/promote-branch.yml new file mode 100644 index 00000000..8e566ec3 --- /dev/null +++ b/.github/workflows/promote-branch.yml @@ -0,0 +1,227 @@ +name: 'Promote branch' + +on: + workflow_dispatch: + inputs: + promotion-type: + type: choice + options: + - 'preview' + - 'release' + description: 'Promotion type.' + required: true + base-branch: + type: string + description: 'Base branch to create target from.' + default: 'main' + required: true + +permissions: + actions: read + id-token: write + contents: write + pull-requests: write + +concurrency: + group: 'promote-branch-${{ inputs.promotion-type }}-${{github.ref_name }}' + cancel-in-progress: false + +env: + dotnet-sdk-version: '10.x' + is-development-branch: ${{ startsWith(github.ref_name, 'develop') }} + is-maintenance-branch: ${{ startsWith(github.ref_name, 'support') }} + is-preview-branch: ${{ startsWith(github.ref_name, 'preview') }} + +jobs: + versioning: + name: 'Extract version' + runs-on: ubuntu-latest + outputs: + friendly-version: ${{ steps.extract-version.outputs.version }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + - name: 'Extract version from branch name' + id: extract-version + uses: './.github/actions/versioning/extract-version' + with: + branch-name: ${{ github.ref_name }} + workflow-variables: + name: 'Set workflow variables' + needs: [versioning] + runs-on: ubuntu-latest + outputs: + base-branch: ${{ steps.set-base-branch.outputs.base-branch }} + target-branch: ${{ steps.set-target-branch.outputs.target-branch }} + target-branch-exists: ${{ steps.check-target-branch-exists.outputs.target-branch-exists }} + pull-request-exists: ${{ steps.check-pull-request-exists.outputs.pull-request-exists }} + steps: + - name: 'Set target branch' + id: set-target-branch + run: | + if [[ "${{ inputs.promotion-type }}" == "preview" ]]; then + target_branch="preview/${{ needs.versioning.outputs.friendly-version }}" + elif [[ "${{ inputs.promotion-type }}" == "release" ]]; then + target_branch="release/${{ needs.versioning.outputs.friendly-version }}" + fi + + echo "Setting target branch $target_branch." + + echo "target-branch=$target_branch" >> $GITHUB_OUTPUT + - name: 'Set base branch' + id: set-base-branch + run: | + base_branch=${{ inputs.base-branch }} + + echo "Setting base branch $base_branch." + + echo "base-branch=$base_branch" >> $GITHUB_OUTPUT + - name: 'Check if base branch exists' + id: check-target-branch-exists + env: + target-branch: ${{ steps.set-target-branch.outputs.target-branch }} + run: | + set +e + + git ls-remote --exit-code --heads origin ${{ env.target-branch }} + + if [[ $? -eq 0 ]]; then + echo "Target branch ${{ env.target-branch }} does exist." + target_branch_exists="true" + else + echo "Target branch ${{ env.target-branch }} does not exist." + target_branch_exists="false" + fi + + echo "target-branch-exists=$target_branch_exists" >> $GITHUB_OUTPUT + + set -e + - name: 'Check if base branch exists' + id: check-base-branch-exists + env: + base-branch: ${{ steps.set-base-branch.outputs.base-branch }} + run: | + set +e + + git ls-remote --exit-code --heads origin ${{ env.base-branch }} + + if [[ $? -eq 0 ]]; then + echo "Base branch ${{ env.base-branch }} does exist." + base_branch_exists="true" + else + echo "Base branch ${{ env.base-branch }} does not exist." + base_branch_exists="false" + fi + + echo "base-branch-exists=$base_branch_exists" >> $GITHUB_OUTPUT + + set -e + - name: 'Check if pull request exists exists' + id: check-pull-request-exists + env: + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository_owner }}/${{ github.event.repository.name }} + current-branch: ${{ github.ref_name }} + target-branch: ${{ steps.set-target-branch.outputs.target-branch }} + run: | + pull_request_count=$(gh pr list --head ${{ env.current-branch }} --base ${{ env.target-branch }} --state open --limit 1 --json id --jq '. | length') + + if [[ $pull_request_count -eq 0 ]]; then + echo "Pull request does not exist." + pull_request_exists="false" + else + echo "Pull request does exist." + pull_request_exists="true" + fi + + echo "pull-request-exists=$pull_request_exists" >> $GITHUB_OUTPUT + + validate-promotion: + name: 'Validate promotion' + needs: [ versioning, workflow-variables ] + runs-on: ubuntu-latest + env: + promotion-type: ${{ inputs.promotion-type }} + base-branch: ${{ needs.workflow-variables.outputs.base-branch }} + current-branch: ${{ github.ref_name }} + target-branch: ${{ needs.workflow-variables.outputs.target-branch }} + pull-request-exists: ${{ needs.workflow-variables.outputs.pull-request-exists }} + outputs: + target-branch: ${{ env.target-branch }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'Check promotion type' + if: ${{ (env.promotion-type != 'release') && (env.promotion-type != 'preview') }} + run: | + echo "Invalid promotion type ${{ inputs.promotion-type }}" + exit 1 + - name: 'Validate source branch for preview promotion' + if: ${{ env.promotion-type == 'preview' && (env.is-development-branch == 'false') && (env.is-maintenance-branch == 'false') }} + run: | + echo "Preview promotion requires a 'develop/**' or 'support/**' source branch. Current branch: '${{ github.ref_name }}'" + exit 1 + - name: 'Validate source branch for release promotion' + if: ${{ env.promotion-type == 'release' && env.is-preview-branch == 'false' }} + run: | + echo "Release promotion requires a 'preview/**' source branch. Current branch: '${{ github.ref_name }}'" + exit 1 + - name: 'Validate default and current branch' + if: ${{ env.base-branch == env.current-branch }} + run: | + echo "Default and current branch cannot be the same." + echo "Default branch is '${{ env.base-branch }}'" + echo "Current branch is '${{ env.current-branch }}'" + exit 1 + + - name: 'Validate target and current branch' + if: ${{ env.target-branch == env.current-branch }} + run: | + echo "Default and target branch cannot be the same." + echo "Default branch is '${{ env.target-branch }}'" + echo "Current branch is '${{ env.current-branch }}'" + exit 1 + + - name: 'Validate pull request' + if: ${{ env.pull-request-exists == 'true' }} + run: | + echo "Pull request exists." + exit 1 + + promote-branch: + name: 'Promote branch ${{ github.ref_name }} to ${{ needs.workflow-variables.outputs.target-branch }}' + needs: [ workflow-variables, validate-promotion ] + runs-on: ubuntu-latest + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + - name: 'Create target branch' + if: ${{ needs.workflow-variables.outputs.target-branch-exists == 'false' }} + env: + base-branch: ${{ needs.workflow-variables.outputs.base-branch }} + target-branch: ${{ needs.workflow-variables.outputs.target-branch }} + run: | + git fetch origin + git push origin origin/${{ env.base-branch }}:refs/heads/${{ env.target-branch }} + - name: 'Lock target branch' + if: ${{ needs.workflow-variables.outputs.target-branch-exists == 'false' }} + uses: './.github/actions/github/branch-protection/lock' + with: + branch: ${{ needs.workflow-variables.outputs.target-branch }} + token: ${{ secrets.GH_ADMIN_TOKEN }} + - name: 'Create PR: "Promote ${{ env.current-branch }} to ${{ env.target-branch }}"' + if: ${{ needs.workflow-variables.outputs.pull-request-exists == 'false' }} + env: + GH_TOKEN: ${{ github.token }} + current-branch: ${{ github.ref_name }} + target-branch: ${{ needs.workflow-variables.outputs.target-branch }} + run: | + gh pr create --title "Promote ${{ env.current-branch }} to ${{ env.target-branch }}" --fill --base ${{ env.target-branch }} --head ${{ env.current-branch }} diff --git a/.github/workflows/publish-documentation.yml b/.github/workflows/publish-documentation.yml new file mode 100644 index 00000000..2a579943 --- /dev/null +++ b/.github/workflows/publish-documentation.yml @@ -0,0 +1,174 @@ +name: 'Publish documentation' + +on: + workflow_dispatch: + push: + branches: + - 'release/**' + paths: + - 'src/**' + - 'api-reference/**' + +permissions: + actions: read + pages: write + id-token: write + +concurrency: + group: publish-docs-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +env: + dotnet-sdk-version: '10.x' + +jobs: + validate-branch: + name: 'Validate branch' + runs-on: ubuntu-latest + steps: + - name: 'Ensure documentation is published from a release branch' + if: ${{ !startsWith(github.ref_name, 'release/') }} + run: | + echo "Documentation should only be published from 'release/**' branches." + echo "Current branch: '${{ github.ref_name }}'" + exit 1 + + workflow-variables: + name: 'Workflow variables' + needs: [validate-branch] + runs-on: ubuntu-latest + + outputs: + github-run-number: ${{ github.run_number }} + + steps: + - name: 'Workflow variables' + id: github + run: | + echo "github-run-number:${{ github.run_number }}" + + versioning: + name: 'Extract version' + needs: [workflow-variables] + runs-on: ubuntu-latest + outputs: + friendly-version: ${{ steps.versioning.outputs.version }} + + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + with: + fetch-depth: 0 # Ensure the full git history is available for versioning + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + - name: 'Extract version from branch name' + id: versioning + uses: './.github/actions/versioning/extract-version' + with: + branch-name: ${{ github.ref_name }} + + generate-docs: + name: 'Generate documentation' + needs: [workflow-variables, versioning] + runs-on: ubuntu-latest + env: + friendly-version: ${{ needs.versioning.outputs.friendly-version }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Install docfx' + shell: bash + run: dotnet tool update -g docfx + + - name: 'Regenerate API metadata for v${{ env.friendly-version }}' + shell: bash + run: | + rm -rf api-reference/${{ env.friendly-version }} + cd api-reference + docfx metadata assembly-metadata.json + mv temp ${{ env.friendly-version }} + + - name: 'Discover all versions' + id: discover-versions + shell: bash + run: | + versions=$(ls api-reference/ | grep -E '^\d+\.\d+$' | sort -V | paste -sd ',' -) + latest=$(ls api-reference/ | grep -E '^\d+\.\d+$' | sort -V | tail -1) + echo "versions=$versions" >> $GITHUB_OUTPUT + echo "latest=$latest" >> $GITHUB_OUTPUT + + - name: 'Update versions.json' + shell: bash + run: | + versions_array=$(echo "${{ steps.discover-versions.outputs.versions }}" | tr ',' '\n' | jq -R . | jq -s .) + jq --arg latest "${{ steps.discover-versions.outputs.latest }}" \ + --argjson versions "$versions_array" \ + '.latest = $latest | .versions = $versions' \ + api-reference/versions.json > /tmp/versions.json + mv /tmp/versions.json api-reference/versions.json + + - name: 'Update api-reference.json with version groups' + shell: bash + run: | + cp api-reference/api-reference.json /tmp/api-reference.json + for ver in $(echo "${{ steps.discover-versions.outputs.versions }}" | tr ',' ' '); do + jq --arg ver "$ver" --arg group "v${ver}" \ + '.build.content += [{"dest": "", "files": ["*.yml"], "group": $group, "src": $ver, "rootTocPath": "~/toc.html"}] | + .build.groups = (.build.groups // {}) | + .build.groups[$group] = {"dest": $ver}' \ + /tmp/api-reference.json > /tmp/api-reference-new.json + mv /tmp/api-reference-new.json /tmp/api-reference.json + done + mv /tmp/api-reference.json api-reference/api-reference.json + + - name: 'Update toc.yml with Reference dropdown' + shell: bash + run: | + latest="${{ steps.discover-versions.outputs.latest }}" + { + echo "### YamlMime:TableOfContent" + echo "- name: Guide" + echo " href: guide/" + echo "- name: Reference" + echo " dropdown: true" + echo " items:" + for ver in $(echo "${{ steps.discover-versions.outputs.versions }}" | tr ',' '\n' | sort -Vr); do + if [ "$ver" = "$latest" ]; then + echo " - name: v${ver} (latest)" + else + echo " - name: v${ver}" + fi + echo " href: ${ver}/PolylineAlgorithm.html" + done + } > api-reference/toc.yml + + - name: 'Build documentation' + shell: bash + run: docfx build api-reference/api-reference.json + + - name: 'Upload artifact' + uses: actions/upload-pages-artifact@v4 + with: + name: github-pages + path: './api-reference/_docs' + + publish-docs: + name: 'Publish documentation' + needs: [workflow-variables, versioning, generate-docs] + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + + - name: 'Deploy to GitHub Pages' + id: deployment + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 00000000..8ea9622c --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,258 @@ +name: 'Pull Request' + +on: + pull_request: + types: + - opened + - synchronize + - reopened + branches: + - 'preview/**' + - 'release/**' + +permissions: + actions: read + pages: write + id-token: write + contents: write + +concurrency: + group: pull-request-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +env: + dotnet-sdk-version: '10.x' + build-configuration: 'Release' + build-platform: 'Any CPU' + git-version: '6.0.x' + test-result-directory: 'test-results' + nuget-packages-directory: 'nuget-packages' + +jobs: + workflow-variables: + name: 'Set workflow variables' + runs-on: ubuntu-latest + + outputs: + is-release: ${{ startsWith(github.base_ref, 'release') }} + is-preview: ${{ startsWith(github.base_ref , 'preview') }} + + steps: + - name: 'Set workflow variables' + run: | + echo "is-release:${{ startsWith(github.base_ref, 'release') }}" + echo "is-preview:${{ startsWith(github.base_ref, 'preview') }}" + + versioning: + name: 'Extract version from branch' + runs-on: ubuntu-latest + needs: [workflow-variables] + outputs: + friendly-version: ${{ steps.format-version.outputs.friendly-version }} + assembly-version: ${{ steps.format-version.outputs.assembly-version }} + assembly-informational-version: ${{ steps.format-version.outputs.assembly-informational-version }} + file-version: ${{ steps.format-version.outputs.file-version }} + release-version: ${{ steps.format-version.outputs.release-version }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + - name: 'Extract version from branch name' + id: extract-version + uses: './.github/actions/versioning/extract-version' + with: + branch-name: ${{ github.base_ref }} + - name: 'Create build number' + shell: bash + id: create-build-number + run: | + git fetch --unshallow --filter=tree:0 + build_number=$(git rev-list --count origin/${{ github.base_ref }} ^origin/main) + echo "build-number=$build_number" >> $GITHUB_OUTPUT + - name: 'Create pre-release tag' + shell: bash + id: create-pre-release-tag + env: + build-number: ${{ steps.create-build-number.outputs.build-number }} + run: | + if [[ '${{ needs.workflow-variables.outputs.is-release }}' == 'true' ]]; then + echo "pre-release-tag=" >> $GITHUB_OUTPUT + elif [[ '${{ needs.workflow-variables.outputs.is-preview }}' == 'true' ]]; then + pre_release_tag='preview' + echo "pre-release-tag=$pre_release_tag" >> $GITHUB_OUTPUT + else + pre_release_tag=$(echo ${{ github.base_ref }} | tr '/' '-' | tr '.' '-'| tr '_' '-') + echo "pre-release-tag=$pre_release_tag" >> $GITHUB_OUTPUT + fi + - name: 'Format version' + id: format-version + uses: ./.github/actions/versioning/format-version + with: + version: ${{ steps.extract-version.outputs.version }} + patch: ${{ github.run_number }} + build-number: ${{ steps.create-build-number.outputs.build-number }} + sha: ${{ github.sha }} + pre-release-tag: ${{ steps.create-pre-release-tag.outputs.pre-release-tag }} + + build: + name: 'Compile source code' + needs: [workflow-variables, versioning] + runs-on: ubuntu-latest + + env: + assembly-version: ${{ needs.versioning.outputs.assembly-version }} + assembly-informational-version: ${{ needs.versioning.outputs.assembly-informational-version }} + file-version: ${{ needs.versioning.outputs.file-version }} + + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Compile source code' + uses: ./.github/actions/source/compile + with: + project-path: '**/PolylineAlgorithm.csproj' + assembly-version: ${{ env.assembly-version }} + assembly-informational-version: ${{ env.assembly-informational-version }} + file-version: ${{ env.file-version }} + treat-warnins-as-error: ${{ needs.workflow-variables.outputs.is-release }} + + test: + name: 'Run tests' + needs: [build] + runs-on: ubuntu-latest + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Run tests' + uses: ./.github/actions/testing/test + with: + project-path: './tests/PolylineAlgorithm.Tests/PolylineAlgorithm.Tests.csproj' + test-results-directory: '${{ runner.temp }}/${{ env.test-result-directory }}/' + code-coverage-settings-file: '${{ github.workspace}}/code-coverage-settings.xml' + + - name: 'Generate test report' + uses: ./.github/actions/testing/test-report + id: test-report + with: + test-result-folder: '${{ runner.temp }}/${{ env.test-result-directory }}/' + + - name: Write test report summary + run: cat ${{ steps.test-report.outputs.test-report-file }} >> $GITHUB_STEP_SUMMARY + + - name: 'Generate code coverage' + uses: ./.github/actions/testing/code-coverage + id: code-coverage-report + with: + test-result-folder: '${{ runner.temp }}/${{ env.test-result-directory }}/' + + - name: Write code coverage report summary + run: cat ${{ steps.code-coverage-report.outputs.code-coverage-report-file }} >> $GITHUB_STEP_SUMMARY + + pack: + name: 'Package binaries' + needs: [versioning, build] + runs-on: ubuntu-latest + env: + assembly-version: ${{ needs.versioning.outputs.assembly-version }} + assembly-informational-version: ${{ needs.versioning.outputs.assembly-informational-version }} + file-version: ${{ needs.versioning.outputs.file-version }} + release-version: ${{ needs.versioning.outputs.release-version }} + package-artifact-name: package + outputs: + package-artifact-name: ${{ env.package-artifact-name }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: Download Build + uses: actions/download-artifact@v8 + with: + name: build + + - name: Pack with .NET + run: | + dotnet pack ${{ vars.SRC_DEFAULT_GLOB_PATTERN }} --configuration ${{ env.build-configuration }} /p:Platform="${{ env.build-platform }}" /p:PackageVersion=${{ env.release-version }} /p:Version=${{ env.assembly-version }} /p:AssemblyInformationalVersion=${{ env.assembly-informational-version }} /p:FileVersion=${{ env.file-version }} --output ${{ runner.temp }}/${{ env.nuget-packages-directory }} + + - name: Upload Package + uses: actions/upload-artifact@v7 + with: + name: ${{ env.package-artifact-name }} + path: | + ${{ runner.temp }}/${{ env.nuget-packages-directory }}/**/*.nupkg + ${{ runner.temp }}/${{ env.nuget-packages-directory }}/**/*.snupkg + + publish-development-package: + name: 'Publish development package' + needs: [pack] + env: + package-artifact-name: ${{ needs.pack.outputs.package-artifact-name }} + runs-on: ubuntu-latest + environment: 'Development' + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Publish package to Azure Artifact feed' + uses: ./.github/actions/nuget/publish-package + with: + package-artifact-name: ${{ env.package-artifact-name }} + nuget-feed-url: ${{ vars.NUGET_PACKAGE_FEED_URL }} + nuget-feed-api-key: ${{ secrets.NUGET_PACKAGE_FEED_API_KEY }} + nuget-feed-server: 'AzureArtifacts' + working-directory: ${{ runner.temp }}/${{ env.nuget-packages-directory }} + dotnet-sdk-version: ${{ env.dotnet-sdk-version }}' + + benchmark: + if: ${{ github.env.is_release || vars.BENCHMARKDOTNET_RUN_OVERRIDE == 'true' }} + name: Benchmark with .NET CLI on ${{ matrix.os }} + needs: [build] + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: Install .NET SDK + uses: actions/setup-dotnet@v5 + with: + dotnet-version: | + 8.x + 10.x + - name: Download Build + uses: actions/download-artifact@v8 + with: + name: build + - name: Benchmark + working-directory: ${{ vars.BENCHMARKDOTNET_WORKING_DIRECTORY }} + run: dotnet run --configuration ${{ env.build-configuration }} /p:Platform=${{ env.build-platform }} --framework ${{ vars.DEFAULT_BUILD_FRAMEWORK }} --runtimes ${{ vars.BENCHMARKDOTNET_RUNTIMES }} --filter ${{ vars.BENCHMARKDOTNET_FILTER }} --artifacts ${{ runner.temp }}/benchmarks/ --exporters GitHub --memory --iterationTime 100 --join + - name: Upload Benchmark Results + uses: actions/upload-artifact@v7 + with: + name: benchmark-${{ matrix.os }} + path: | + ${{ runner.temp }}/benchmarks/**/*-report-github.md + - name: Write Benchmark Summary + shell: bash + run: cat **/*-report-github.md > $GITHUB_STEP_SUMMARY + working-directory: ${{ runner.temp }}/benchmarks/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..b8113bf4 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,368 @@ +name: 'Release' + +on: + push: + branches: + - 'preview/**' + - 'release/**' + paths: + - 'src/**' + +permissions: + actions: read + pages: write + id-token: write + contents: write + +concurrency: + group: release-${{ github.head_ref || github.ref }} + cancel-in-progress: false + +env: + dotnet-sdk-version: '10.x' + build-configuration: 'Release' + build-platform: 'Any CPU' + git-version: '6.0.x' + test-result-directory: 'test-results' + nuget-packages-directory: 'nuget-packages' + +jobs: + workflow-variables: + name: 'Set workflow variables' + runs-on: ubuntu-latest + + outputs: + is-release: ${{ startsWith(github.ref_name, 'release') }} + is-preview: ${{ startsWith(github.ref_name, 'preview') }} + + steps: + - name: 'Set workflow variables' + id: github + run: | + echo "is-release:${{ startsWith(github.ref_name, 'release') }}" + echo "is-preview:${{ startsWith(github.ref_name, 'preview') }}" + + validate-release: + name: 'Validate release' + needs: [workflow-variables] + runs-on: ubuntu-latest + steps: + - name: 'Validate release branch' + if: ${{ needs.workflow-variables.outputs.is-release != 'true' && needs.workflow-variables.outputs.is-preview != 'true' }} + run: | + echo "This workflow can only be run on 'release/**' or 'preview/**' branches." + exit 1 + + versioning: + name: 'Extract version from branch' + runs-on: ubuntu-latest + needs: [workflow-variables, validate-release] + outputs: + friendly-version: ${{ steps.format-version.outputs.friendly-version }} + assembly-version: ${{ steps.format-version.outputs.assembly-version }} + assembly-informational-version: ${{ steps.format-version.outputs.assembly-informational-version }} + file-version: ${{ steps.format-version.outputs.file-version }} + release-version: ${{ steps.format-version.outputs.release-version }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'Setup .NET ${{ env.dotnet-sdk-version }}' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + - name: 'Extract version from branch name' + id: extract-version + uses: './.github/actions/versioning/extract-version' + with: + branch-name: ${{ github.ref_name }} + - name: 'Create build number' + shell: bash + id: create-build-number + run: | + git fetch --unshallow --filter=tree:0 + build_number=$(git rev-list --count origin/${{ github.ref_name }} ^origin/main) + echo "build-number=$build_number" >> $GITHUB_OUTPUT + - name: 'Create pre-release tag' + shell: bash + id: create-pre-release-tag + env: + build-number: ${{ steps.create-build-number.outputs.build-number }} + run: | + if [[ '${{ needs.workflow-variables.outputs.is-release }}' == 'true' ]]; then + echo "pre-release-tag=" >> $GITHUB_OUTPUT + elif [[ '${{ needs.workflow-variables.outputs.is-preview }}' == 'true' ]]; then + pre_release_tag='preview' + echo "pre-release-tag=$pre_release_tag" >> $GITHUB_OUTPUT + else + pre_release_tag=$(echo ${{ github.ref_name }} | tr '/' '-' | tr '.' '-'| tr '_' '-') + echo "pre-release-tag=$pre_release_tag" >> $GITHUB_OUTPUT + fi + - name: 'Format version' + id: format-version + uses: ./.github/actions/versioning/format-version + with: + version: ${{ steps.extract-version.outputs.version }} + patch: ${{ github.run_number }} + build-number: ${{ steps.create-build-number.outputs.build-number }} + sha: ${{ github.sha }} + pre-release-tag: ${{ steps.create-pre-release-tag.outputs.pre-release-tag }} + + build: + name: 'Compile source code' + needs: [workflow-variables, versioning, validate-release] + runs-on: ubuntu-latest + + env: + assembly-version: ${{ needs.versioning.outputs.assembly-version }} + assembly-informational-version: ${{ needs.versioning.outputs.assembly-informational-version }} + file-version: ${{ needs.versioning.outputs.file-version }} + + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Compile source code' + uses: ./.github/actions/source/compile + with: + project-path: '**/PolylineAlgorithm.csproj' + assembly-version: ${{ env.assembly-version }} + assembly-informational-version: ${{ env.assembly-informational-version }} + file-version: ${{ env.file-version }} + treat-warnins-as-error: ${{ needs.workflow-variables.outputs.is-release }} + + test: + name: 'Run tests' + needs: [build, validate-release] + runs-on: ubuntu-latest + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Setup .NET' + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Run tests' + uses: ./.github/actions/testing/test + with: + project-path: './tests/PolylineAlgorithm.Tests/PolylineAlgorithm.Tests.csproj' + test-results-directory: '${{ runner.temp }}/${{ env.test-result-directory }}/' + code-coverage-settings-file: '${{ github.workspace}}/code-coverage-settings.xml' + + - name: 'Generate test report' + uses: ./.github/actions/testing/test-report + id: test-report + with: + test-result-folder: '${{ runner.temp }}/${{ env.test-result-directory }}/' + + - name: Write test report summary + run: cat ${{ steps.test-report.outputs.test-report-file }} >> $GITHUB_STEP_SUMMARY + + - name: 'Generate code coverage' + uses: ./.github/actions/testing/code-coverage + id: code-coverage-report + with: + test-result-folder: '${{ runner.temp }}/${{ env.test-result-directory }}/' + + - name: Write code coverage report summary + run: cat ${{ steps.code-coverage-report.outputs.code-coverage-report-file }} >> $GITHUB_STEP_SUMMARY + + pack: + name: 'Package binaries' + needs: [versioning, build, test, validate-release] + runs-on: ubuntu-latest + env: + assembly-version: ${{ needs.versioning.outputs.assembly-version }} + assembly-informational-version: ${{ needs.versioning.outputs.assembly-informational-version }} + file-version: ${{ needs.versioning.outputs.file-version }} + release-version: ${{ needs.versioning.outputs.release-version }} + package-artifact-name: package + outputs: + package-artifact-name: ${{ env.package-artifact-name }} + steps: + - name: 'Checkout ${{ github.base_ref }}' + uses: actions/checkout@v6 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: Download Build + uses: actions/download-artifact@v8 + with: + name: build + + - name: Pack with .NET + run: | + dotnet pack ${{ vars.SRC_DEFAULT_GLOB_PATTERN }} --configuration ${{ env.build-configuration }} /p:Platform="${{ env.build-platform }}" /p:PackageVersion=${{ env.release-version }} /p:Version=${{ env.assembly-version }} /p:AssemblyInformationalVersion=${{ env.assembly-informational-version }} /p:FileVersion=${{ env.file-version }} --output ${{ runner.temp }}/${{ env.nuget-packages-directory }} + + - name: Upload Package + uses: actions/upload-artifact@v7 + with: + name: ${{ env.package-artifact-name }} + path: | + ${{ runner.temp }}/${{ env.nuget-packages-directory }}/**/*.nupkg + ${{ runner.temp }}/${{ env.nuget-packages-directory }}/**/*.snupkg + + publish-package: + name: 'Publish package' + needs: [pack, validate-release] + env: + package-artifact-name: ${{ needs.pack.outputs.package-artifact-name }} + runs-on: ubuntu-latest + environment: 'NuGet' + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: ${{ env.dotnet-sdk-version }} + + - name: 'Publish package to Azure Artifact feed' + uses: ./.github/actions/nuget/publish-package + with: + package-artifact-name: ${{ env.package-artifact-name }} + nuget-feed-url: ${{ vars.NUGET_PACKAGE_FEED_URL }} + nuget-feed-api-key: ${{ secrets.NUGET_PACKAGE_FEED_API_KEY }} + nuget-feed-server: 'NuGet' + working-directory: ${{ runner.temp }}/${{ env.nuget-packages-directory }} + dotnet-sdk-version: ${{ env.dotnet-sdk-version }}' + + release: + name: 'Create release' + needs: [workflow-variables, publish-package, validate-release, versioning] + runs-on: ubuntu-latest + env: + release-version: ${{ needs.versioning.outputs.release-version }} + is-preview: ${{ needs.workflow-variables.outputs.is-preview }} + notes-start-tag: ${{ needs.workflow-variables.outputs.notes-start-tag }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + + - name: 'Determine notes start tag' + id: determine-notes-start-tag + run: | + notes-start-tag=$(git describe --abbrev=0 --tags) + echo "notes-start-tag=$notes-start-tag" >> $GITHUB_OUTPUT + shell: bash + + - name: 'Create GitHub Release' + uses: ./.github/actions/github/create-release + with: + release-version: ${{ env.release-version }} + is-preview: ${{ env.is-preview }} + notes-start-tag: ${{ steps.determine-notes-start-tag.outputs.notes-start-tag }} + + merge-to-main: + name: 'Merge ${{ github.ref_name }} into main' + needs: [workflow-variables, release, versioning] + if: ${{ needs.workflow-variables.outputs.is-release == 'true' }} + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ github.token }} + current-branch: ${{ github.ref_name }} + current-version: ${{ needs.versioning.outputs.friendly-version }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: 'Detect if current branch is the latest release' + id: detect-latest + run: | + git fetch origin + latest_version=$(git ls-remote --heads origin 'release/*' | grep -oP 'release/\K\d+\.\d+' | sort -V | tail -1) + current_version=$(echo "${{ env.current-version }}" | grep -oP '^\d+\.\d+') + echo "Latest release branch version: $latest_version" + echo "Current version (normalized): $current_version" + if [[ "$latest_version" == "$current_version" ]]; then + echo "is-latest=true" >> $GITHUB_OUTPUT + else + echo "is-latest=false" >> $GITHUB_OUTPUT + fi + + - name: 'Check if PR to main already exists' + id: check-pr + if: ${{ steps.detect-latest.outputs.is-latest == 'true' }} + run: | + pr_count=$(gh pr list --head "${{ env.current-branch }}" --base main --state open --limit 1 --json id --jq '. | length') + if [[ $pr_count -gt 0 ]]; then + echo "pr-exists=true" >> $GITHUB_OUTPUT + else + echo "pr-exists=false" >> $GITHUB_OUTPUT + fi + + - name: 'Create PR: Merge ${{ env.current-branch }} into main' + if: ${{ steps.detect-latest.outputs.is-latest == 'true' && steps.check-pr.outputs.pr-exists == 'false' }} + run: | + gh pr create \ + --title "Merge ${{ env.current-branch }} into main" \ + --fill \ + --base main \ + --head "${{ env.current-branch }}" + + - name: 'Write merge summary' + run: | + if [[ "${{ steps.detect-latest.outputs.is-latest }}" == "true" ]]; then + echo "✅ PR created to merge **${{ env.current-branch }}** into **main**." >> $GITHUB_STEP_SUMMARY + else + echo "⏭️ Skipped merge to main: **${{ env.current-branch }}** is not the highest release branch." >> $GITHUB_STEP_SUMMARY + fi + + create-support-branch: + name: 'Create support branch for ${{ github.ref_name }}' + needs: [workflow-variables, release, versioning] + if: ${{ needs.workflow-variables.outputs.is-release == 'true' }} + runs-on: ubuntu-latest + env: + current-version: ${{ needs.versioning.outputs.friendly-version }} + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: 'Resolve support branch name' + id: resolve-support-branch + run: | + major_minor=$(echo "${{ env.current-version }}" | grep -oP '^\d+\.\d+') + echo "support-branch=support/$major_minor" >> $GITHUB_OUTPUT + + - name: 'Check if support branch already exists' + id: check-support-branch + run: | + git fetch origin + if git ls-remote --exit-code --heads origin "${{ steps.resolve-support-branch.outputs.support-branch }}" > /dev/null 2>&1; then + echo "support-branch-exists=true" >> $GITHUB_OUTPUT + else + echo "support-branch-exists=false" >> $GITHUB_OUTPUT + fi + + - name: 'Create support branch' + if: ${{ steps.check-support-branch.outputs.support-branch-exists == 'false' }} + run: | + git config user.name "$(git log -n 1 --pretty=format:%an)" + git config user.email "$(git log -n 1 --pretty=format:%ae)" + git checkout -b "${{ steps.resolve-support-branch.outputs.support-branch }}" + git push --set-upstream origin "${{ steps.resolve-support-branch.outputs.support-branch }}" + + - name: 'Lock support branch' + if: ${{ steps.check-support-branch.outputs.support-branch-exists == 'false' }} + uses: './.github/actions/github/branch-protection/lock' + with: + branch: ${{ steps.resolve-support-branch.outputs.support-branch }} + token: ${{ secrets.GH_ADMIN_TOKEN }} + + - name: 'Write support branch summary' + run: | + if [[ "${{ steps.check-support-branch.outputs.support-branch-exists }}" == "false" ]]; then + echo "✅ Created and locked support branch **${{ steps.resolve-support-branch.outputs.support-branch }}**." >> $GITHUB_STEP_SUMMARY + else + echo "⏭️ Support branch **${{ steps.resolve-support-branch.outputs.support-branch }}** already exists." >> $GITHUB_STEP_SUMMARY + fi diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml deleted file mode 100644 index 1526b959..00000000 --- a/.github/workflows/static.yml +++ /dev/null @@ -1,44 +0,0 @@ -# Your GitHub workflow file under .github/workflows/ -# Trigger the action on push to main -on: - push: - branches: - - main - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - actions: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - publish-docs: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Dotnet Setup - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 8.x - - - run: dotnet tool update -g docfx - - run: docfx ./docs/docfx.json - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - # Upload entire repository - path: './docs/_site' - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 3c4efe20..2118d126 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -## Ignore Visual Studio temporary files, build results, and +## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files @@ -258,4 +258,13 @@ paket-files/ # Python Tools for Visual Studio (PTVS) __pycache__/ -*.pyc \ No newline at end of file +*.pyc + +# BenchmarkDotNet artifacts +**/BenchmarkDotNet.Artifacts/ + +# GitHub Copilot Testing folder +/.codetesting + +# DocFX build output +api-reference/_docs/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..cb8bb32a --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,93 @@ +# Polyline Algorithm Agents Instructions + +## Purpose + +Instructions for automated agents (bots, CI, and code review tools) and contributors interacting with the Polyline Algorithm library. + +--- + +## General Guidelines + +- All contributions and automation **must adhere to code style** (`.editorconfig`, `dotnet format`). +- **Unit tests** are required for new features and bug fixes (`tests/` directory). +- **Benchmarks** must be updated for performance-impacting changes (`benchmarks/` directory). + +--- + +## Pull Requests + +Agents and contributors should: + +- **Attach benchmark results** for encoding/decoding performance changes +- Document **public API changes** in XML comments and verify updates at [API Reference](https://petesramek.github.io/polyline-algorithm-csharp/) +- Run format and static analysis tools before submitting (`dotnet format`, analyzers) +- Update **README.md** and `/samples` for public API changes + +--- + +## Error Handling and Logging + +- Throw **descriptive exceptions** for invalid input/edge cases +- Use internal logging helpers for operational status (`LogInfoExtensions`, `LogWarningExtensions`) + +--- + +## Encoding/Decoding Agents + +- Use abstraction interfaces (`IPolylineEncoder`, `IPolylineDecoder` if available) +- Prefer extension methods for collections and arrays +- Validate latitude/longitude ranges + +--- + +## Issue and PR Templates + +Agents should reference standardized templates from `.github`. Contributors must use them for new issues or PRs. + +--- + +## Extensibility + +- Add encoding schemes or coordinate types in **separate classes/files** +- Register via factory pattern if supporting multiple algorithms +- Do not mix logic between different polyline versions + +--- + +## Future-proofing + +- Support for precision or custom coordinate fields: update `PolylineEncodingOptions` with clear doc comments + +--- + +## Documentation + +- Keep XML doc comments up-to-date in source files +- API reference is auto-generated and hosted at + [https://petesramek.github.io/polyline-algorithm-csharp/](https://petesramek.github.io/polyline-algorithm-csharp/) +- After public API changes, verify docs render correctly on the website +- Add usage samples in XML comments and `/samples` directory + +--- + +## Agent File Format (for `.github/agents`) + +Each agent instruction file should specify: + +``` +# AGENT INSTRUCTIONS + +- Purpose and scope +- Required tools/commands +- Coding and testing requirements +- Logging/error handling expectations +- Documentation or samples to update +``` + +--- + +## Contact & Questions + +Questions or clarifications: open a GitHub issue and tag `@petesramek`. + +--- diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..a2492d27 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,50 @@ +# Contributing to PolylineAlgorithm + +Thank you for your interest in improving this library! + +## Developer Documentation + +In-depth developer guides are in the [`/docs`](./docs/README.md) folder: + +- [Local Development](./docs/local-development.md) — build, test, and format commands +- [Testing](./docs/testing.md) — how to write unit tests +- [Benchmarks](./docs/benchmarks.md) — how to write and run benchmarks +- [Composite Actions](./docs/composite-actions.md) — reusable CI actions catalogue +- [Workflows](./docs/workflows.md) — CI/CD pipeline overview +- [Branch Strategy](./docs/branch-strategy.md) — branch lifecycle and environments +- [Versioning](./docs/versioning.md) — branch naming and the version pipeline +- [API Documentation](./docs/api-documentation.md) — DocFX and the API reference site + +## Guidelines + +- **Follow code style:** Use `.editorconfig` and run `dotnet format`. +- **Add unit tests:** Place all tests in `/tests`, following naming conventions. +- **Benchmark updates:** Add or update `/benchmarks` for major changes. + +## Issue and PR Templates + +Please use the provided templates in `.github` for all new issues or pull requests. + +## API Documentation + +API reference is auto-generated from XML comments and published at +👉 [API Reference](https://petesramek.github.io/polyline-algorithm-csharp/) + +- All public classes, interfaces, and methods require XML doc comments. +- After merging, verify that documentation renders correctly. +- Add usage samples where applicable. + +## Submitting a Change + +1. Fork the repo and create a new branch. +2. Implement your changes, tests, and update doc comments. +3. Run `dotnet format`, and all tests/benchmarks. +4. Submit a pull request, using the provided template. + +## Contact + +For help or questions, open an issue and tag `@petesramek`. + +## License + +MIT License © Pete Sramek diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 00000000..96ebb124 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,25 @@ + + + + 14.0 + enable + enable + true + en + + + + latest + All + true + true + + + + + + + + + + diff --git a/DropoutCoder.PolylineAlgorithm.sln b/DropoutCoder.PolylineAlgorithm.sln deleted file mode 100644 index a7673087..00000000 --- a/DropoutCoder.PolylineAlgorithm.sln +++ /dev/null @@ -1,61 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.8.34330.188 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DropoutCoder.PolylineAlgorithm", "src\DropoutCoder.PolylineAlgorithm.csproj", "{882322A6-E758-4662-8D1C-7C555C8FC3F2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{51C886AF-D610-48A4-9D73-2DEB38742801}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{576FEFFC-B624-40C3-A8AF-4E5233802EA0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nuget", "nuget", "{7F9807A1-01FF-40C3-9342-3F3F35D632DA}" - ProjectSection(SolutionItems) = preProject - nuget\DropoutCoder.PolylineAlgorithm.nuspec = nuget\DropoutCoder.PolylineAlgorithm.nuspec - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DropoutCoder.PolylineAlgorithm.Tests", "tests\DropoutCoder.PolylineAlgorithm.Tests.csproj", "{30324A08-AA42-425D-87DA-8F9C6AF60454}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{C13E31F9-B8EF-4915-A1C8-BC33F6431EB9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{33C03F16-4313-4579-87E6-65892AF21D7D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DropoutCoder.PolylineAlgorithm.Benchmarks", "benchmarks\DropoutCoder.PolylineAlgorithm.Benchmarks\DropoutCoder.PolylineAlgorithm.Benchmarks.csproj", "{9C7CBAD5-415B-4589-86E1-01C849F9C56C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks", "benchmarks\DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks\DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks.csproj", "{D9F175EA-6F4C-4BFF-AB1D-5F45324B6C1B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {882322A6-E758-4662-8D1C-7C555C8FC3F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {882322A6-E758-4662-8D1C-7C555C8FC3F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {882322A6-E758-4662-8D1C-7C555C8FC3F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {882322A6-E758-4662-8D1C-7C555C8FC3F2}.Release|Any CPU.Build.0 = Release|Any CPU - {30324A08-AA42-425D-87DA-8F9C6AF60454}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {30324A08-AA42-425D-87DA-8F9C6AF60454}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30324A08-AA42-425D-87DA-8F9C6AF60454}.Release|Any CPU.ActiveCfg = Release|Any CPU - {30324A08-AA42-425D-87DA-8F9C6AF60454}.Release|Any CPU.Build.0 = Release|Any CPU - {9C7CBAD5-415B-4589-86E1-01C849F9C56C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C7CBAD5-415B-4589-86E1-01C849F9C56C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C7CBAD5-415B-4589-86E1-01C849F9C56C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C7CBAD5-415B-4589-86E1-01C849F9C56C}.Release|Any CPU.Build.0 = Release|Any CPU - {D9F175EA-6F4C-4BFF-AB1D-5F45324B6C1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9F175EA-6F4C-4BFF-AB1D-5F45324B6C1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9F175EA-6F4C-4BFF-AB1D-5F45324B6C1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9F175EA-6F4C-4BFF-AB1D-5F45324B6C1B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {882322A6-E758-4662-8D1C-7C555C8FC3F2} = {51C886AF-D610-48A4-9D73-2DEB38742801} - {30324A08-AA42-425D-87DA-8F9C6AF60454} = {576FEFFC-B624-40C3-A8AF-4E5233802EA0} - {9C7CBAD5-415B-4589-86E1-01C849F9C56C} = {33C03F16-4313-4579-87E6-65892AF21D7D} - {D9F175EA-6F4C-4BFF-AB1D-5F45324B6C1B} = {33C03F16-4313-4579-87E6-65892AF21D7D} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {93A268DC-0947-4FBB-B495-DDAD4B013D82} - EndGlobalSection -EndGlobal diff --git a/LICENSE b/LICENSE index ee65c099..f38ec86e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 Petr Šrámek +Copyright (c) 2025 Pete Sramek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/PolylineAlgorithm.slnx b/PolylineAlgorithm.slnx new file mode 100644 index 00000000..29fa9445 --- /dev/null +++ b/PolylineAlgorithm.slnx @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 2695d8c8..9dfb8a18 100644 --- a/README.md +++ b/README.md @@ -1,113 +1,188 @@ -# .NET Polyline Algorithm (.NET Standard 2.0) +# PolylineAlgorithm for .NET -Lightweight .NET Standard 2.0 library implementing Google Polyline Algorithm. Designed with respect to flexibility, but still with easy to use. +Lightweight .NET Standard 2.1 library implementing Google-compliant Encoded Polyline Algorithm with strong input validation, modern API patterns, and extensibility for custom coordinate types. -## Getting started -### Prerequisites +## Table of Contents -.NET Polyline Algorithm is avalable as nuget package Cloudikka.PolylineAlgorithm targeting .NET Standard 2.0. +- [Features](#features) +- [Installation](#installation) +- [Usage](#usage) +- [API Reference](#api-reference) +- [Benchmarks](#benchmarks) +- [FAQ](#faq) +- [Contributing](#contributing) +- [Support](#support) +- [License](#license) -Command line: +## Features -`Install-Package Cloudikka.PolylineAlgorithm` +- Fully compliant Google Encoded Polyline Algorithm for .NET Standard 2.1+ +- Extensible encoding and decoding APIs for custom coordinate and polyline types (`IPolylineEncoder`, `IPolylineDecoder`, `AbstractPolylineEncoder`, `AbstractPolylineDecoder`) +- Extension methods for encoding from `List` and arrays (`PolylineEncoderExtensions`) +- Robust input validation with descriptive exceptions for malformed/invalid data +- Advanced configuration via `PolylineEncodingOptions` (precision, buffer size, logging) +- Logging and diagnostic support for CI/CD and developer diagnostics via `Microsoft.Extensions.Logging` +- Low-level utilities for normalization, validation, encoding and decoding via static `PolylineEncoding` class +- Thorough unit tests and benchmarks for correctness and performance +- Auto-generated API documentation ([API Reference](https://petesramek.github.io/polyline-algorithm-csharp/)) +- Support for .NET Core, .NET 5+, Xamarin, Unity, Blazor, and other platforms supporting `netstandard2.1` -NuGet Package Manager: +## Installation -`Cloudikka.PolylineAlgorithm` +Using dotnet tool -#### Warning +```shell +dotnet add package PolylineAlgorithm +``` -Library is using ValueTuple Structure. ValueTuple struct is avalable in .NET Framework 4.7 and above. Incase your project is targeting lower version of .NET Framework you probably have to install System.ValueTuple NuGet package. (not tested yet) - -Command line: +or via NuGet -`Install-Package System.ValueTuple` +```powershell +Install-Package PolylineAlgorithm +``` -NuGet Package Manager: +## Usage -`System.ValueTuple` +The library provides abstract base classes to implement your own encoder and decoder for any coordinate and polyline type. -### Hot to use it +### Custom encoder and decoder -There are three ways how to use .NET Polyline Algorithm library based on your needs. For each is available Encode and Decode methods. +#### Encoding -#### Static methods +Custom encoder implementation. -Whenever you just need to encode or decode Google polyline you can use static methods defined in static PolylineAlgorithm class. +```csharp +using PolylineAlgorithm; +using PolylineAlgorithm.Abstraction; -##### Decoding +public sealed class MyPolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> { + public MyPolylineEncoder() + : base() { } -```csharp - string polyline = "polyline"; - IEnumerable<(double, double)> coordinates = PolylineAlgorithm.Decode(polyline); -``` + public MyPolylineEncoder(PolylineEncodingOptions options) + : base(options) { } -##### Encoding + protected override double GetLatitude((double Latitude, double Longitude) coordinate) { + return coordinate.Latitude; + } -```csharp - IEnumerable<(double, double)> coordinates = new (double, double) [] { (35.635, 76.27182), (35.2435, 75.625), ... }; - string polyline = PolylineAlgorithm.Encode(coordinates); + protected override double GetLongitude((double Latitude, double Longitude) coordinate) { + return coordinate.Longitude; + } + + protected override string CreatePolyline(ReadOnlyMemory polyline) { + return polyline.ToString(); + } +} ``` +Custom encoder usage. -#### Default instance +```csharp +using PolylineAlgorithm.Extensions; -If you need to use dependency injection, you would like to have instance to deliver the work for you. In that case you can use default instance of PolylineEncoding class, which implements IPolylineEncoding<(double Latitude, double Longitude)> interface. +var coordinates = new List<(double Latitude, double Longitude)> +{ + (48.858370, 2.294481), + (51.500729, -0.124625) +}; -##### Decoding +var encoder = new MyPolylineEncoder(); +string encoded = encoder.Encode(coordinates); // extension method for List -```csharp - string polyline = "polyline"; - var encoding = new PolylineEncoding(); - IEnumerable<(double, double)> coordinates = encoding.Decode(polyline); +Console.WriteLine(encoded); ``` -##### Encoding +#### Decoding + +Custom decoder implementation. ```csharp - IEnumerable<(double, double)> coordinates = new (double, double) [] { (35.635, 76.27182), (35.2435, 75.625), ... }; - var encoding = new PolylineEncoding(); - string polyline = encoding.Encode(coordinates); -``` +using PolylineAlgorithm; +using PolylineAlgorithm.Abstraction; -#### Inherited base class +public sealed class MyPolylineDecoder : AbstractPolylineDecoder { + public MyPolylineDecoder() + : base() { } -There may be a scenario you need to pass and return different types to and from without a need to add another extra layer. In this case you can inherit PolylineEncodingBase class and override template methods CreateResult and GetCoordinates. - -##### Inheriting + public MyPolylineDecoder(PolylineEncodingOptions options) + : base(options) { } -```csharp - public class MyPolylineEncoding : PolylineEncodingBase { - - protected override Coordinate CreateResult(double latitude, double longitude) { - return new Coordinate(latitude, longitude); - } - - protected override (double Latitude, double Longitude) GetCoordinate(Coordinate source) { - return (source.Latitude, source.Longitude); - } - - } + protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) { + return (latitude, longitude); + } + + protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) { + return polyline.AsMemory(); + } +} ``` -##### Decoding +Custom decoder usage. ```csharp - string polyline = "polyline"; - var encoding = new MyPolylineEncoding(); - IEnumerable coordinates = encoding.Decode(polyline); +string encoded = "yseiHoc_MwacOjnwM"; + +var decoder = new MyPolylineDecoder(); +IEnumerable<(double Latitude, double Longitude)> decoded = decoder.Decode(encoded); ``` -##### Encoding +> **Note:** +> If you need low-level utilities for normalization, validation, encoding and decoding, use static methods from the `PolylineEncoding` class. -```csharp - IEnumerable coordinates = new Coordinate [] { new Coordinate(35.635, 76.27182), new Coordinate(35.2435, 75.625), ... }; - var encoding = new MyPolylineEncoding(); - string polyline = encoding.Encode(coordinates); -``` +## API Reference + +Full API docs and guides (auto-generated from source) are available at [API Reference](https://petesramek.github.io/polyline-algorithm-csharp/) + +## Benchmarks + +- See `/benchmarks` in the repo for performance evaluation. +- Contributors: Update benchmarks and document results for performance-impacting PRs. + +## FAQ + +**Q: What coordinate ranges are valid?** +A: Latitude must be -90..90; longitude -180..180. Out-of-range input throws `ArgumentOutOfRangeException`. + +**Q: Which .NET versions are supported?** +A: All platforms supporting `netstandard2.1` (including .NET Core and .NET 5+). + +**Q: What happens if I pass invalid or malformed input to the decoder?** +A: The decoder will throw descriptive exceptions (`InvalidPolylineException`) for malformed polyline strings. Check exception handling in your application. + +**Q: How do I customize encoding options (e.g., precision, buffer size, logging)?** +A: Use `PolylineEncodingOptionsBuilder` to set custom options and pass the built `PolylineEncodingOptions` to the encoder or decoder constructor. + +**Q: Is the library thread-safe?** +A: Yes, the main encoding and decoding APIs are stateless and thread-safe. If using mutable shared resources, manage synchronization in your code. + +**Q: Can the library be used in Unity, Xamarin, Blazor, or other .NET-compatible platforms?** +A: Yes! Any environment supporting `netstandard2.1` can use this library. + +**Q: Where can I report bugs or request features?** +A: Open a GitHub issue using the provided templates in the repository and tag @petesramek. + +**Q: Is there support for elevation, time stamps, or third coordinate values?** +A: Not currently, not planned to be added, but you can extend by implementing your own encoder/decoder using `PolylineEncoding` class methods. + +**Q: How do I contribute documentation improvements?** +A: Update XML doc comments in the codebase and submit a PR; all public APIs require XML documentation. To improve guides, update the relevant markdown file in the `/api-reference/guide` folder. + +**Q: Does the library support streaming or incremental decoding of polylines?** +A: Currently, only batch encode/decode is supported. For streaming scenarios, implement custom logic using `PolylineEncoding` utility functions. + +## Contributing + +- Follow code style and PR instructions in [AGENTS.md](./AGENTS.md). +- Ensure all features are covered by tests and XML doc comments. +- For questions or suggestions, open an issue and use the provided templates. + +## Support + +Have a question, bug, or feature request? [Open an issue!](https://github.com/petesramek/polyline-algorithm-csharp/issues) -### Documentation +--- -Documentation is can be found at https://dropoutcoder.github.io/polyline-algorithm-csharp/api/index.html. +## License -Happy coding! +MIT License © Pete Sramek diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml new file mode 100644 index 00000000..6349f59c --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml @@ -0,0 +1,233 @@ +### YamlMime:ApiPage +title: Class AbstractPolylineDecoder +body: +- api1: Class AbstractPolylineDecoder + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2 + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L22 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2 + commentId: T:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2 +- facts: + - name: Namespace + value: + text: PolylineAlgorithm.Abstraction + url: PolylineAlgorithm.Abstraction.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates. +- code: 'public abstract class AbstractPolylineDecoder : IPolylineDecoder' +- h4: Type Parameters +- parameters: + - name: TPolyline + description: The type that represents the encoded polyline input. + - name: TCoordinate + description: The type that represents a decoded geographic coordinate. +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: AbstractPolylineDecoder + url: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.html +- h4: Implements +- list: + - text: IPolylineDecoder + url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.MemberwiseClone() + url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Remarks +- markdown: >- + Derive from this class to implement a decoder for a specific polyline type. Override + + and to provide type-specific behavior. +- h2: Constructors +- api3: AbstractPolylineDecoder() + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2__ctor + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L28 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor +- markdown: Initializes a new instance of the class with default encoding options. +- code: protected AbstractPolylineDecoder() +- api3: AbstractPolylineDecoder(PolylineEncodingOptions) + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2__ctor_PolylineAlgorithm_PolylineEncodingOptions_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L40 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions) +- markdown: Initializes a new instance of the class with the specified encoding options. +- code: protected AbstractPolylineDecoder(PolylineEncodingOptions options) +- h4: Parameters +- parameters: + - name: options + type: + - text: PolylineEncodingOptions + url: PolylineAlgorithm.PolylineEncodingOptions.html + description: The to use for encoding operations. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when options is null. +- h2: Properties +- api3: Options + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_Options + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L54 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Options + commentId: P:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Options +- markdown: Gets the encoding options used by this polyline decoder. +- code: public PolylineEncodingOptions Options { get; } +- h4: Property Value +- parameters: + - type: + - text: PolylineEncodingOptions + url: PolylineAlgorithm.PolylineEncodingOptions.html +- h2: Methods +- api3: CreateCoordinate(double, double) + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_CreateCoordinate_System_Double_System_Double_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L202 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.CreateCoordinate(System.Double,System.Double) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.CreateCoordinate(System.Double,System.Double) +- markdown: Creates a TCoordinate instance from the specified latitude and longitude values. +- code: protected abstract TCoordinate CreateCoordinate(double latitude, double longitude) +- h4: Parameters +- parameters: + - name: latitude + type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: The latitude component of the coordinate, in degrees. + - name: longitude + type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: The longitude component of the coordinate, in degrees. +- h4: Returns +- parameters: + - type: + - TCoordinate + description: A TCoordinate instance representing the specified geographic coordinate. +- api3: Decode(TPolyline, CancellationToken) + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_Decode__0_System_Threading_CancellationToken_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L81 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken) +- markdown: >- + Decodes an encoded TPolyline into a sequence of TCoordinate instances, + + with support for cancellation. +- code: public IEnumerable Decode(TPolyline polyline, CancellationToken cancellationToken = default) +- h4: Parameters +- parameters: + - name: polyline + type: + - TPolyline + description: The TPolyline instance containing the encoded polyline string to decode. + - name: cancellationToken + type: + - text: CancellationToken + url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken + description: A that can be used to cancel the decoding operation. + optional: true +- h4: Returns +- parameters: + - type: + - text: IEnumerable + url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1 + - < + - TCoordinate + - '>' + description: An of TCoordinate representing the decoded latitude and longitude pairs. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when polyline is null. + - type: + - text: ArgumentException + url: https://learn.microsoft.com/dotnet/api/system.argumentexception + description: Thrown when polyline is empty. + - type: + - text: InvalidPolylineException + url: PolylineAlgorithm.InvalidPolylineException.html + description: Thrown when the polyline format is invalid or malformed at a specific position. + - type: + - text: OperationCanceledException + url: https://learn.microsoft.com/dotnet/api/system.operationcanceledexception + description: Thrown when cancellationToken is canceled during decoding. +- api3: GetReadOnlyMemory(in TPolyline) + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_GetReadOnlyMemory__0__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L187 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.GetReadOnlyMemory(`0@) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.GetReadOnlyMemory(`0@) +- markdown: Extracts the underlying read-only memory region of characters from the specified polyline instance. +- code: protected abstract ReadOnlyMemory GetReadOnlyMemory(in TPolyline polyline) +- h4: Parameters +- parameters: + - name: polyline + type: + - TPolyline + description: The TPolyline instance from which to extract the character sequence. +- h4: Returns +- parameters: + - type: + - text: ReadOnlyMemory + url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: A of representing the encoded polyline characters. +- api3: ValidateFormat(ReadOnlyMemory, ILogger?) + id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_ValidateFormat_System_ReadOnlyMemory_System_Char__Microsoft_Extensions_Logging_ILogger_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L167 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.ValidateFormat(System.ReadOnlyMemory{System.Char},Microsoft.Extensions.Logging.ILogger) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.ValidateFormat(System.ReadOnlyMemory{System.Char},Microsoft.Extensions.Logging.ILogger) +- markdown: Validates the format of the polyline character sequence, ensuring all characters are within the allowed range. +- code: protected virtual void ValidateFormat(ReadOnlyMemory sequence, ILogger? logger) +- h4: Parameters +- parameters: + - name: sequence + type: + - text: ReadOnlyMemory + url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: The read-only memory region of characters representing the polyline to validate. + - name: logger + type: + - text: ILogger + url: https://learn.microsoft.com/dotnet/api/microsoft.extensions.logging.ilogger + - '?' + description: An optional used to log a warning when format validation fails. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentException + url: https://learn.microsoft.com/dotnet/api/system.argumentexception + description: Thrown when the polyline contains characters outside the valid encoding range or has an invalid block structure. +languageId: csharp +metadata: + description: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates. diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml new file mode 100644 index 00000000..ec0a65e9 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml @@ -0,0 +1,219 @@ +### YamlMime:ApiPage +title: Class AbstractPolylineEncoder +body: +- api1: Class AbstractPolylineEncoder + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2 + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L27 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2 + commentId: T:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2 +- facts: + - name: Namespace + value: + text: PolylineAlgorithm.Abstraction + url: PolylineAlgorithm.Abstraction.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings. +- code: 'public abstract class AbstractPolylineEncoder : IPolylineEncoder' +- h4: Type Parameters +- parameters: + - name: TCoordinate + description: The type that represents a geographic coordinate to encode. + - name: TPolyline + description: The type that represents the encoded polyline output. +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: AbstractPolylineEncoder + url: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.html +- h4: Implements +- list: + - text: IPolylineEncoder + url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.MemberwiseClone() + url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h4: Extension Methods +- list: + - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, List) + url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1__System_Collections_Generic_List___0__ + - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, TCoordinate[]) + url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___ +- h2: Remarks +- markdown: >- + Derive from this class to implement an encoder for a specific coordinate and polyline type. Override + + , , and to provide type-specific behavior. +- h2: Constructors +- api3: AbstractPolylineEncoder() + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2__ctor + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L33 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor +- markdown: Initializes a new instance of the class with default encoding options. +- code: protected AbstractPolylineEncoder() +- api3: AbstractPolylineEncoder(PolylineEncodingOptions) + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2__ctor_PolylineAlgorithm_PolylineEncodingOptions_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L43 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions) +- markdown: Initializes a new instance of the class with the specified encoding options. +- code: protected AbstractPolylineEncoder(PolylineEncodingOptions options) +- h4: Parameters +- parameters: + - name: options + type: + - text: PolylineEncodingOptions + url: PolylineAlgorithm.PolylineEncodingOptions.html + description: The to use for encoding operations. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when options is null +- h2: Properties +- api3: Options + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_Options + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L57 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Options + commentId: P:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Options +- markdown: Gets the encoding options used by this polyline encoder. +- code: public PolylineEncodingOptions Options { get; } +- h4: Property Value +- parameters: + - type: + - text: PolylineEncodingOptions + url: PolylineAlgorithm.PolylineEncodingOptions.html +- h2: Methods +- api3: CreatePolyline(ReadOnlyMemory) + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_CreatePolyline_System_ReadOnlyMemory_System_Char__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L174 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlyMemory{System.Char}) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlyMemory{System.Char}) +- markdown: Creates a polyline instance from the provided read-only sequence of characters. +- code: protected abstract TPolyline CreatePolyline(ReadOnlyMemory polyline) +- h4: Parameters +- parameters: + - name: polyline + type: + - text: ReadOnlyMemory + url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: A containing the encoded polyline characters. +- h4: Returns +- parameters: + - type: + - TPolyline + description: An instance of TPolyline representing the encoded polyline. +- api3: Encode(ReadOnlySpan, CancellationToken) + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_Encode_System_ReadOnlySpan__0__System_Threading_CancellationToken_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L80 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken) +- markdown: Encodes a collection of TCoordinate instances into an encoded TPolyline string. +- code: >- + [SuppressMessage("Design", "MA0051:Method is too long", Justification = "Method contains local methods. Actual method only 55 lines.")] + + public TPolyline Encode(ReadOnlySpan coordinates, CancellationToken cancellationToken = default) +- h4: Parameters +- parameters: + - name: coordinates + type: + - text: ReadOnlySpan + url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1 + - < + - TCoordinate + - '>' + description: The collection of TCoordinate objects to encode. + - name: cancellationToken + type: + - text: CancellationToken + url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken + description: A that can be used to cancel the encoding operation. + optional: true +- h4: Returns +- parameters: + - type: + - TPolyline + description: An instance of TPolyline representing the encoded coordinates. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when coordinates is null. + - type: + - text: ArgumentException + url: https://learn.microsoft.com/dotnet/api/system.argumentexception + description: Thrown when coordinates is an empty enumeration. + - type: + - text: InvalidOperationException + url: https://learn.microsoft.com/dotnet/api/system.invalidoperationexception + description: Thrown when the internal encoding buffer cannot accommodate the encoded value. +- api3: GetLatitude(TCoordinate) + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_GetLatitude__0_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L194 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLatitude(`0) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLatitude(`0) +- markdown: Extracts the latitude value from the specified coordinate. +- code: protected abstract double GetLatitude(TCoordinate current) +- h4: Parameters +- parameters: + - name: current + type: + - TCoordinate + description: The coordinate from which to extract the latitude. +- h4: Returns +- parameters: + - type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: The latitude value as a . +- api3: GetLongitude(TCoordinate) + id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_GetLongitude__0_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L184 + metadata: + uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLongitude(`0) + commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLongitude(`0) +- markdown: Extracts the longitude value from the specified coordinate. +- code: protected abstract double GetLongitude(TCoordinate current) +- h4: Parameters +- parameters: + - name: current + type: + - TCoordinate + description: The coordinate from which to extract the longitude. +- h4: Returns +- parameters: + - type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: The longitude value as a . +languageId: csharp +metadata: + description: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings. diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml new file mode 100644 index 00000000..704f92b2 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml @@ -0,0 +1,90 @@ +### YamlMime:ApiPage +title: Interface IPolylineDecoder +body: +- api1: Interface IPolylineDecoder + id: PolylineAlgorithm_Abstraction_IPolylineDecoder_2 + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L22 + metadata: + uid: PolylineAlgorithm.Abstraction.IPolylineDecoder`2 + commentId: T:PolylineAlgorithm.Abstraction.IPolylineDecoder`2 +- facts: + - name: Namespace + value: + text: PolylineAlgorithm.Abstraction + url: PolylineAlgorithm.Abstraction.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Defines a contract for decoding an encoded polyline into a sequence of geographic coordinates. +- code: public interface IPolylineDecoder +- h4: Type Parameters +- parameters: + - name: TPolyline + description: >- + The type that represents the encoded polyline input. Common implementations use , + + but custom wrapper types are allowed to carry additional metadata. + - name: TValue + description: >- + The coordinate type returned by the decoder. Typical implementations return a struct or class that + + contains latitude and longitude (for example a LatLng type or a ValueTuple<double,double>). +- h2: Methods +- api3: Decode(TPolyline, CancellationToken) + id: PolylineAlgorithm_Abstraction_IPolylineDecoder_2_Decode__0_System_Threading_CancellationToken_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L48 + metadata: + uid: PolylineAlgorithm.Abstraction.IPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken) + commentId: M:PolylineAlgorithm.Abstraction.IPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken) +- markdown: >- + Decodes the specified encoded polyline into an ordered sequence of geographic coordinates. + + The sequence preserves the original vertex order encoded by the polyline. +- code: IEnumerable Decode(TPolyline polyline, CancellationToken cancellationToken = default) +- h4: Parameters +- parameters: + - name: polyline + type: + - TPolyline + description: >- + The TPolyline instance containing the encoded polyline to decode. + + Implementations SHOULD validate the input and may throw + + or for invalid formats. + - name: cancellationToken + type: + - text: CancellationToken + url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken + description: >- + A to observe while decoding. If cancellation is requested, + + implementations SHOULD stop work and throw an . + optional: true +- h4: Returns +- parameters: + - type: + - text: IEnumerable + url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1 + - < + - TValue + - '>' + description: >- + An of TValue representing the decoded + + latitude/longitude pairs (or equivalent coordinates) in the same order they were encoded. +- h4: Remarks +- markdown: >- + Implementations commonly follow the Google Encoded Polyline Algorithm Format, but this interface + + does not mandate a specific encoding. Consumers should rely on a concrete decoder's documentation + + to understand the exact encoding supported. +- h4: Exceptions +- parameters: + - type: + - text: OperationCanceledException + url: https://learn.microsoft.com/dotnet/api/system.operationcanceledexception + description: Thrown when the provided cancellationToken requests cancellation. +languageId: csharp +metadata: + description: Defines a contract for decoding an encoded polyline into a sequence of geographic coordinates. diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml new file mode 100644 index 00000000..979fe774 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml @@ -0,0 +1,142 @@ +### YamlMime:ApiPage +title: Interface IPolylineEncoder +body: +- api1: Interface IPolylineEncoder + id: PolylineAlgorithm_Abstraction_IPolylineEncoder_2 + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L36 + metadata: + uid: PolylineAlgorithm.Abstraction.IPolylineEncoder`2 + commentId: T:PolylineAlgorithm.Abstraction.IPolylineEncoder`2 +- facts: + - name: Namespace + value: + text: PolylineAlgorithm.Abstraction + url: PolylineAlgorithm.Abstraction.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: >- + Contract for encoding a sequence of geographic coordinates into an encoded polyline representation. + + Implementations interpret the generic TValue type and produce an encoded + + representation of those coordinates as TPolyline. +- code: public interface IPolylineEncoder +- h4: Type Parameters +- parameters: + - name: TValue + description: >- + The concrete coordinate representation used by the encoder (for example a struct or class containing + + Latitude and Longitude values). Implementations must document the expected shape, + + units (typically decimal degrees), and any required fields for TValue. + + Common shapes: + + - A struct or class with two double properties named Latitude and Longitude. + + - A tuple-like type (for example ValueTuple<double,double>) where the encoder documents + which element represents latitude and longitude. + - name: TPolyline + description: >- + The encoded polyline representation returned by the encoder (for example string, + + ReadOnlyMemory<char>, or a custom wrapper type). Concrete implementations should document + + the chosen representation and any memory / ownership expectations. +- h4: Extension Methods +- list: + - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, List) + url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1__System_Collections_Generic_List___0__ + - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, TValue[]) + url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___ +- h2: Remarks +- markdown: >- + - This interface is intentionally minimal to allow different encoding strategies (Google encoded polyline, + precision/scale variants, or custom compressed formats) to be expressed behind a common contract. + - Implementations should document: + - Coordinate precision and rounding rules (for example 1e-5 for 5-decimal precision). + - Coordinate ordering and whether altitude or additional dimensions are supported. + - Thread-safety guarantees: whether instances are safe to reuse concurrently or must be instantiated per-call. + - Implementations are encouraged to be memory-efficient; the API accepts a + to avoid forced allocations when callers already have contiguous memory. +- h2: Methods +- api3: Encode(ReadOnlySpan, CancellationToken) + id: PolylineAlgorithm_Abstraction_IPolylineEncoder_2_Encode_System_ReadOnlySpan__0__System_Threading_CancellationToken_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L76 + metadata: + uid: PolylineAlgorithm.Abstraction.IPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken) + commentId: M:PolylineAlgorithm.Abstraction.IPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken) +- markdown: >- + Encodes a sequence of geographic coordinates into an encoded polyline representation. + + The order of coordinates in coordinates is preserved in the encoded result. +- code: TPolyline Encode(ReadOnlySpan coordinates, CancellationToken cancellationToken = default) +- h4: Parameters +- parameters: + - name: coordinates + type: + - text: ReadOnlySpan + url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1 + - < + - TValue + - '>' + description: >- + The collection of TValue instances to encode into a polyline. + + The span may be empty; implementations should return an appropriate empty encoded representation + + (for example an empty string or an empty memory slice) rather than null. + - name: cancellationToken + type: + - text: CancellationToken + url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken + description: >- + A that can be used to cancel the encoding operation. + + Implementations should observe this token and throw + + when cancellation is requested. For fast, in-memory encoders cancellation may be best-effort. + optional: true +- h4: Returns +- parameters: + - type: + - TPolyline + description: >- + A TPolyline containing the encoded polyline that represents the input coordinates. + + The exact format and any delimiting/terminating characters are implementation-specific and must be + + documented by concrete encoder types. +- h4: Examples +- markdown: >- +
// Example pseudocode for typical usage with a string-based encoder:
+
+    var coords = new[] {
+        new Coordinate { Latitude = 47.6219, Longitude = -122.3503 },
+        new Coordinate { Latitude = 47.6220, Longitude = -122.3504 }
+    };
+
+    IPolylineEncoder<Coordinate,string> encoder = new GoogleEncodedPolylineEncoder();
+
+    string encoded = encoder.Encode(coords, CancellationToken.None);
+- h4: Remarks +- markdown: >- + - Implementations should validate input as appropriate and document any preconditions (for example + if coordinates must be within [-90,90] latitude and [-180,180] longitude). + - For large input sequences, implementations may provide streaming or incremental encoders; those + variants can still implement this interface by materializing the final encoded result. +- h4: Exceptions +- parameters: + - type: + - text: OperationCanceledException + url: https://learn.microsoft.com/dotnet/api/system.operationcanceledexception + description: Thrown if the operation is canceled via cancellationToken. +languageId: csharp +metadata: + description: >- + Contract for encoding a sequence of geographic coordinates into an encoded polyline representation. + + Implementations interpret the generic TValue type and produce an encoded + + representation of those coordinates as TPolyline. diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.yml new file mode 100644 index 00000000..e9de48f7 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Abstraction.yml @@ -0,0 +1,34 @@ +### YamlMime:ApiPage +title: Namespace PolylineAlgorithm.Abstraction +body: +- api1: Namespace PolylineAlgorithm.Abstraction + id: PolylineAlgorithm_Abstraction + metadata: + uid: PolylineAlgorithm.Abstraction + commentId: N:PolylineAlgorithm.Abstraction +- h3: Classes +- parameters: + - type: + text: AbstractPolylineDecoder + url: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.html + description: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates. + - type: + text: AbstractPolylineEncoder + url: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.html + description: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings. +- h3: Interfaces +- parameters: + - type: + text: IPolylineDecoder + url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html + description: Defines a contract for decoding an encoded polyline into a sequence of geographic coordinates. + - type: + text: IPolylineEncoder + url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html + description: >- + Contract for encoding a sequence of geographic coordinates into an encoded polyline representation. + + Implementations interpret the generic TValue type and produce an encoded + + representation of those coordinates as TPolyline. +languageId: csharp diff --git a/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml b/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml new file mode 100644 index 00000000..4b97f584 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml @@ -0,0 +1,195 @@ +### YamlMime:ApiPage +title: Class PolylineDecoderExtensions +body: +- api1: Class PolylineDecoderExtensions + id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L16 + metadata: + uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions + commentId: T:PolylineAlgorithm.Extensions.PolylineDecoderExtensions +- facts: + - name: Namespace + value: + text: PolylineAlgorithm.Extensions + url: PolylineAlgorithm.Extensions.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Provides extension methods for the interface to facilitate decoding encoded polylines. +- code: public static class PolylineDecoderExtensions +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: PolylineDecoderExtensions + url: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.MemberwiseClone() + url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Methods +- api3: Decode(IPolylineDecoder, char[]) + id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_String___0__System_Char___ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L33 + metadata: + uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.Char[]) + commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.Char[]) +- markdown: Decodes an encoded polyline represented as a character array into a sequence of geographic coordinates. +- code: public static IEnumerable Decode(this IPolylineDecoder decoder, char[] polyline) +- h4: Parameters +- parameters: + - name: decoder + type: + - text: IPolylineDecoder + url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html + - < + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + - ',' + - " " + - TValue + - '>' + description: The instance used to perform the decoding operation. + - name: polyline + type: + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '[' + - ']' + description: The encoded polyline as a character array to decode. The array is converted to a string internally. +- h4: Returns +- parameters: + - type: + - text: IEnumerable + url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1 + - < + - TValue + - '>' + description: An of TValue containing the decoded coordinate pairs. +- h4: Type Parameters +- parameters: + - name: TValue + description: The coordinate type returned by the decoder. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when decoder or polyline is null. +- api3: Decode(IPolylineDecoder, ReadOnlyMemory) + id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_String___0__System_ReadOnlyMemory_System_Char__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L61 + metadata: + uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.ReadOnlyMemory{System.Char}) + commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.ReadOnlyMemory{System.Char}) +- markdown: Decodes an encoded polyline represented as a read-only memory of characters into a sequence of geographic coordinates. +- code: public static IEnumerable Decode(this IPolylineDecoder decoder, ReadOnlyMemory polyline) +- h4: Parameters +- parameters: + - name: decoder + type: + - text: IPolylineDecoder + url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html + - < + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + - ',' + - " " + - TValue + - '>' + description: The instance used to perform the decoding operation. + - name: polyline + type: + - text: ReadOnlyMemory + url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: The encoded polyline as a read-only memory of characters to decode. The memory is converted to a string internally. +- h4: Returns +- parameters: + - type: + - text: IEnumerable + url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1 + - < + - TValue + - '>' + description: An of TValue containing the decoded coordinate pairs. +- h4: Type Parameters +- parameters: + - name: TValue + description: The coordinate type returned by the decoder. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when decoder is null. +- api3: Decode(IPolylineDecoder, TValue>, string) + id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_ReadOnlyMemory_System_Char____0__System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L86 + metadata: + uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.ReadOnlyMemory{System.Char},``0},System.String) + commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.ReadOnlyMemory{System.Char},``0},System.String) +- markdown: >- + Decodes an encoded polyline string into a sequence of geographic coordinates, + + using a decoder that accepts of . +- code: public static IEnumerable Decode(this IPolylineDecoder, TValue> decoder, string polyline) +- h4: Parameters +- parameters: + - name: decoder + type: + - text: IPolylineDecoder + url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html + - < + - text: ReadOnlyMemory + url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + - ',' + - " " + - TValue + - '>' + description: The instance used to perform the decoding operation. + - name: polyline + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: The encoded polyline string to decode. The string is converted to internally. +- h4: Returns +- parameters: + - type: + - text: IEnumerable + url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1 + - < + - TValue + - '>' + description: An of TValue containing the decoded coordinate pairs. +- h4: Type Parameters +- parameters: + - name: TValue + description: The coordinate type returned by the decoder. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when decoder or polyline is null. +languageId: csharp +metadata: + description: Provides extension methods for the interface to facilitate decoding encoded polylines. diff --git a/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml b/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml new file mode 100644 index 00000000..aeba23f9 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml @@ -0,0 +1,139 @@ +### YamlMime:ApiPage +title: Class PolylineEncoderExtensions +body: +- api1: Class PolylineEncoderExtensions + id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L19 + metadata: + uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions + commentId: T:PolylineAlgorithm.Extensions.PolylineEncoderExtensions +- facts: + - name: Namespace + value: + text: PolylineAlgorithm.Extensions + url: PolylineAlgorithm.Extensions.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Provides extension methods for the interface to facilitate encoding geographic coordinates into polylines. +- code: public static class PolylineEncoderExtensions +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: PolylineEncoderExtensions + url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.MemberwiseClone() + url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Methods +- api3: Encode(IPolylineEncoder, List) + id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1__System_Collections_Generic_List___0__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L37 + metadata: + uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},System.Collections.Generic.List{``0}) + commentId: M:PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},System.Collections.Generic.List{``0}) +- markdown: Encodes a of TCoordinate instances into an encoded polyline. +- code: >- + [SuppressMessage("Design", "CA1002:Do not expose generic lists", Justification = "We need a list as we do need to marshal it as span.")] + + [SuppressMessage("Design", "MA0016:Prefer using collection abstraction instead of implementation", Justification = "We need a list as we do need to marshal it as span.")] + + public static TPolyline Encode(this IPolylineEncoder encoder, List coordinates) +- h4: Parameters +- parameters: + - name: encoder + type: + - text: IPolylineEncoder + url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html + - < + - TCoordinate + - ',' + - " " + - TPolyline + - '>' + description: The instance used to perform the encoding operation. + - name: coordinates + type: + - text: List + url: https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1 + - < + - TCoordinate + - '>' + description: The list of TCoordinate objects to encode. +- h4: Returns +- parameters: + - type: + - TPolyline + description: A TPolyline instance representing the encoded polyline for the provided coordinates. +- h4: Type Parameters +- parameters: + - name: TCoordinate + description: The type that represents a geographic coordinate to encode. + - name: TPolyline + description: The type that represents the encoded polyline output. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when encoder or coordinates is null. +- api3: Encode(IPolylineEncoder, TCoordinate[]) + id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L73 + metadata: + uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},``0[]) + commentId: M:PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},``0[]) +- markdown: Encodes an array of TCoordinate instances into an encoded polyline. +- code: public static TPolyline Encode(this IPolylineEncoder encoder, TCoordinate[] coordinates) +- h4: Parameters +- parameters: + - name: encoder + type: + - text: IPolylineEncoder + url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html + - < + - TCoordinate + - ',' + - " " + - TPolyline + - '>' + description: The instance used to perform the encoding operation. + - name: coordinates + type: + - TCoordinate + - '[' + - ']' + description: The array of TCoordinate objects to encode. +- h4: Returns +- parameters: + - type: + - TPolyline + description: A TPolyline instance representing the encoded polyline for the provided coordinates. +- h4: Type Parameters +- parameters: + - name: TCoordinate + description: The type that represents a geographic coordinate to encode. + - name: TPolyline + description: The type that represents the encoded polyline output. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentNullException + url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception + description: Thrown when encoder or coordinates is null. +languageId: csharp +metadata: + description: Provides extension methods for the interface to facilitate encoding geographic coordinates into polylines. diff --git a/api-reference/1.0/PolylineAlgorithm.Extensions.yml b/api-reference/1.0/PolylineAlgorithm.Extensions.yml new file mode 100644 index 00000000..c39da0ca --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Extensions.yml @@ -0,0 +1,19 @@ +### YamlMime:ApiPage +title: Namespace PolylineAlgorithm.Extensions +body: +- api1: Namespace PolylineAlgorithm.Extensions + id: PolylineAlgorithm_Extensions + metadata: + uid: PolylineAlgorithm.Extensions + commentId: N:PolylineAlgorithm.Extensions +- h3: Classes +- parameters: + - type: + text: PolylineDecoderExtensions + url: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.html + description: Provides extension methods for the interface to facilitate decoding encoded polylines. + - type: + text: PolylineEncoderExtensions + url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html + description: Provides extension methods for the interface to facilitate encoding geographic coordinates into polylines. +languageId: csharp diff --git a/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml b/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml new file mode 100644 index 00000000..45962074 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml @@ -0,0 +1,313 @@ +### YamlMime:ApiPage +title: Class ExceptionGuard +body: +- api1: Class ExceptionGuard + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L29 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard + commentId: T:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard +- facts: + - name: Namespace + value: + text: PolylineAlgorithm.Internal.Diagnostics + url: PolylineAlgorithm.Internal.Diagnostics.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Centralizes exception throwing for common validation and error scenarios used across the library. +- code: public static class ExceptionGuard +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: ExceptionGuard + url: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.MemberwiseClone() + url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Remarks +- markdown: >- + Methods in this class are intentionally small and annotated so that they can act as single + + call sites for throwing exceptions (improving inlining and stack traces). Many members have + + attributes to avoid polluting callers' stack traces (__StackTraceHidden__ on supported targets) + + or to prevent inlining on older targets. +- h2: Methods +- api3: StackAllocLimitMustBeEqualOrGreaterThan(int, string) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_StackAllocLimitMustBeEqualOrGreaterThan_System_Int32_System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L97 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.StackAllocLimitMustBeEqualOrGreaterThan(System.Int32,System.String) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.StackAllocLimitMustBeEqualOrGreaterThan(System.Int32,System.String) +- markdown: Throws an when a stack allocation limit is below the required minimum. +- code: >- + [DoesNotReturn] + + public static void StackAllocLimitMustBeEqualOrGreaterThan(int minValue, string paramName) +- h4: Parameters +- parameters: + - name: minValue + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: Minimum required stack allocation limit. + - name: paramName + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: Name of the parameter representing the limit. +- api3: ThrowArgumentCannotBeEmptyEnumerationMessage(string) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowArgumentCannotBeEmptyEnumerationMessage_System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L111 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentCannotBeEmptyEnumerationMessage(System.String) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentCannotBeEmptyEnumerationMessage(System.String) +- markdown: Throws an when an enumeration argument is empty but must contain at least one element. +- code: >- + [DoesNotReturn] + + public static void ThrowArgumentCannotBeEmptyEnumerationMessage(string paramName) +- h4: Parameters +- parameters: + - name: paramName + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: Name of the parameter representing the enumeration. +- api3: ThrowArgumentNull(string) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowArgumentNull_System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L51 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentNull(System.String) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentNull(System.String) +- markdown: Throws an for a null argument. +- code: >- + [DoesNotReturn] + + public static void ThrowArgumentNull(string paramName) +- h4: Parameters +- parameters: + - name: paramName + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: Name of the parameter that was null. +- api3: ThrowBufferOverflow(string) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowBufferOverflow_System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L65 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowBufferOverflow(System.String) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowBufferOverflow(System.String) +- markdown: Throws an with a provided message. +- code: >- + [DoesNotReturn] + + public static void ThrowBufferOverflow(string message) +- h4: Parameters +- parameters: + - name: message + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: Message that describes the overflow condition. +- api3: ThrowCoordinateValueOutOfRange(double, double, double, string) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowCoordinateValueOutOfRange_System_Double_System_Double_System_Double_System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L82 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCoordinateValueOutOfRange(System.Double,System.Double,System.Double,System.String) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCoordinateValueOutOfRange(System.Double,System.Double,System.Double,System.String) +- markdown: Throws an when a coordinate value is outside the allowed range. +- code: >- + [DoesNotReturn] + + public static void ThrowCoordinateValueOutOfRange(double value, double min, double max, string paramName) +- h4: Parameters +- parameters: + - name: value + type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: The coordinate value that was out of range. + - name: min + type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: Inclusive minimum allowed value. + - name: max + type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: Inclusive maximum allowed value. + - name: paramName + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: Name of the parameter containing the coordinate. +- api3: ThrowCouldNotWriteEncodedValueToBuffer() + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowCouldNotWriteEncodedValueToBuffer + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L124 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCouldNotWriteEncodedValueToBuffer + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCouldNotWriteEncodedValueToBuffer +- markdown: Throws an when an encoded value could not be written to the destination buffer. +- code: >- + [DoesNotReturn] + + public static void ThrowCouldNotWriteEncodedValueToBuffer() +- api3: ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(int, int, string) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength_System_Int32_System_Int32_System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L140 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(System.Int32,System.Int32,System.String) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(System.Int32,System.Int32,System.String) +- markdown: Throws an when a destination array is not large enough to contain the polyline data. +- code: >- + [DoesNotReturn] + + public static void ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(int destinationLength, int polylineLength, string paramName) +- h4: Parameters +- parameters: + - name: destinationLength + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: The length of the destination array. + - name: polylineLength + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: The required polyline length. + - name: paramName + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: Name of the parameter representing the destination array. +- api3: ThrowInvalidPolylineBlockTerminator() + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineBlockTerminator + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L212 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineBlockTerminator + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineBlockTerminator +- markdown: Throws an when the polyline block terminator is invalid. +- code: >- + [DoesNotReturn] + + public static void ThrowInvalidPolylineBlockTerminator() +- api3: ThrowInvalidPolylineCharacter(char, int) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineCharacter_System_Char_System_Int32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L171 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineCharacter(System.Char,System.Int32) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineCharacter(System.Char,System.Int32) +- markdown: Throws an when an unexpected character is encountered in the polyline. +- code: >- + [DoesNotReturn] + + public static void ThrowInvalidPolylineCharacter(char character, int position) +- h4: Parameters +- parameters: + - name: character + type: + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + description: The invalid character. + - name: position + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: Position in the polyline where the character was found. +- api3: ThrowInvalidPolylineFormat(long) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineFormat_System_Int64_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L199 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineFormat(System.Int64) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineFormat(System.Int64) +- markdown: Throws an when the polyline format is malformed. +- code: >- + [DoesNotReturn] + + public static void ThrowInvalidPolylineFormat(long position) +- h4: Parameters +- parameters: + - name: position + type: + - text: long + url: https://learn.microsoft.com/dotnet/api/system.int64 + description: Approximate position where the polyline became malformed. +- api3: ThrowInvalidPolylineLength(int, int) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineLength_System_Int32_System_Int32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L156 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineLength(System.Int32,System.Int32) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineLength(System.Int32,System.Int32) +- markdown: Throws an when the polyline length is invalid. +- code: >- + [DoesNotReturn] + + public static void ThrowInvalidPolylineLength(int length, int min) +- h4: Parameters +- parameters: + - name: length + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: The invalid length. + - name: min + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: The minimum required length. +- api3: ThrowNotFiniteNumber(string) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowNotFiniteNumber_System_String_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L37 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowNotFiniteNumber(System.String) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowNotFiniteNumber(System.String) +- markdown: Throws an when a numeric argument is not a finite value. +- code: >- + [DoesNotReturn] + + public static void ThrowNotFiniteNumber(string paramName) +- h4: Parameters +- parameters: + - name: paramName + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: Name of the parameter that had a non-finite value. +- api3: ThrowPolylineBlockTooLong(int) + id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowPolylineBlockTooLong_System_Int32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L185 + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowPolylineBlockTooLong(System.Int32) + commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowPolylineBlockTooLong(System.Int32) +- markdown: Throws an when a polyline block is longer than allowed. +- code: >- + [DoesNotReturn] + + public static void ThrowPolylineBlockTooLong(int position) +- h4: Parameters +- parameters: + - name: position + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: Position in the polyline where the block exceeded the allowed length. +languageId: csharp +metadata: + description: Centralizes exception throwing for common validation and error scenarios used across the library. diff --git a/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.yml b/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.yml new file mode 100644 index 00000000..dabb499a --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.yml @@ -0,0 +1,15 @@ +### YamlMime:ApiPage +title: Namespace PolylineAlgorithm.Internal.Diagnostics +body: +- api1: Namespace PolylineAlgorithm.Internal.Diagnostics + id: PolylineAlgorithm_Internal_Diagnostics + metadata: + uid: PolylineAlgorithm.Internal.Diagnostics + commentId: N:PolylineAlgorithm.Internal.Diagnostics +- h3: Classes +- parameters: + - type: + text: ExceptionGuard + url: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.html + description: Centralizes exception throwing for common validation and error scenarios used across the library. +languageId: csharp diff --git a/api-reference/1.0/PolylineAlgorithm.InvalidPolylineException.yml b/api-reference/1.0/PolylineAlgorithm.InvalidPolylineException.yml new file mode 100644 index 00000000..b776c617 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.InvalidPolylineException.yml @@ -0,0 +1,102 @@ +### YamlMime:ApiPage +title: Class InvalidPolylineException +body: +- api1: Class InvalidPolylineException + id: PolylineAlgorithm_InvalidPolylineException + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/InvalidPolylineException.cs#L17 + metadata: + uid: PolylineAlgorithm.InvalidPolylineException + commentId: T:PolylineAlgorithm.InvalidPolylineException +- facts: + - name: Namespace + value: + text: PolylineAlgorithm + url: PolylineAlgorithm.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Exception thrown when a polyline is determined to be malformed or invalid during processing. +- code: 'public sealed class InvalidPolylineException : Exception, ISerializable' +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: Exception + url: https://learn.microsoft.com/dotnet/api/system.exception + - text: InvalidPolylineException + url: PolylineAlgorithm.InvalidPolylineException.html +- h4: Implements +- list: + - text: ISerializable + url: https://learn.microsoft.com/dotnet/api/system.runtime.serialization.iserializable +- h4: Inherited Members +- list: + - text: Exception.GetBaseException() + url: https://learn.microsoft.com/dotnet/api/system.exception.getbaseexception + - text: Exception.GetObjectData(SerializationInfo, StreamingContext) + url: https://learn.microsoft.com/dotnet/api/system.exception.getobjectdata + - text: Exception.GetType() + url: https://learn.microsoft.com/dotnet/api/system.exception.gettype + - text: Exception.ToString() + url: https://learn.microsoft.com/dotnet/api/system.exception.tostring + - text: Exception.Data + url: https://learn.microsoft.com/dotnet/api/system.exception.data + - text: Exception.HelpLink + url: https://learn.microsoft.com/dotnet/api/system.exception.helplink + - text: Exception.HResult + url: https://learn.microsoft.com/dotnet/api/system.exception.hresult + - text: Exception.InnerException + url: https://learn.microsoft.com/dotnet/api/system.exception.innerexception + - text: Exception.Message + url: https://learn.microsoft.com/dotnet/api/system.exception.message + - text: Exception.Source + url: https://learn.microsoft.com/dotnet/api/system.exception.source + - text: Exception.StackTrace + url: https://learn.microsoft.com/dotnet/api/system.exception.stacktrace + - text: Exception.TargetSite + url: https://learn.microsoft.com/dotnet/api/system.exception.targetsite + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Remarks +- markdown: This exception is used internally to indicate that a polyline string does not conform to the expected format or contains errors. +- h2: Constructors +- api3: InvalidPolylineException() + id: PolylineAlgorithm_InvalidPolylineException__ctor + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/InvalidPolylineException.cs#L22 + metadata: + uid: PolylineAlgorithm.InvalidPolylineException.#ctor + commentId: M:PolylineAlgorithm.InvalidPolylineException.#ctor +- markdown: Initializes a new instance of the class. +- code: public InvalidPolylineException() +- api3: InvalidPolylineException(string, Exception) + id: PolylineAlgorithm_InvalidPolylineException__ctor_System_String_System_Exception_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/InvalidPolylineException.cs#L43 + metadata: + uid: PolylineAlgorithm.InvalidPolylineException.#ctor(System.String,System.Exception) + commentId: M:PolylineAlgorithm.InvalidPolylineException.#ctor(System.String,System.Exception) +- markdown: Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. +- code: public InvalidPolylineException(string message, Exception innerException) +- h4: Parameters +- parameters: + - name: message + type: + - text: string + url: https://learn.microsoft.com/dotnet/api/system.string + description: The error message that explains the reason for the exception. + - name: innerException + type: + - text: Exception + url: https://learn.microsoft.com/dotnet/api/system.exception + description: The exception that is the cause of the current exception, or a null reference if no inner exception is specified. +languageId: csharp +metadata: + description: Exception thrown when a polyline is determined to be malformed or invalid during processing. diff --git a/api-reference/1.0/PolylineAlgorithm.PolylineEncoding.yml b/api-reference/1.0/PolylineAlgorithm.PolylineEncoding.yml new file mode 100644 index 00000000..127dbf53 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.PolylineEncoding.yml @@ -0,0 +1,529 @@ +### YamlMime:ApiPage +title: Class PolylineEncoding +body: +- api1: Class PolylineEncoding + id: PolylineAlgorithm_PolylineEncoding + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L23 + metadata: + uid: PolylineAlgorithm.PolylineEncoding + commentId: T:PolylineAlgorithm.PolylineEncoding +- facts: + - name: Namespace + value: + text: PolylineAlgorithm + url: PolylineAlgorithm.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: >- + Provides methods for encoding and decoding polyline data, as well as utilities for normalizing and de-normalizing + + geographic coordinate values. +- code: public static class PolylineEncoding +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: PolylineEncoding + url: PolylineAlgorithm.PolylineEncoding.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.MemberwiseClone() + url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Remarks +- markdown: >- + The class includes functionality for working with encoded polyline + data, such as reading and writing encoded values, as well as methods for normalizing and de-normalizing geographic + coordinates. It also provides validation utilities to ensure values conform to expected ranges for latitude and + longitude. +- h2: Methods +- api3: Denormalize(int, uint) + id: PolylineAlgorithm_PolylineEncoding_Denormalize_System_Int32_System_UInt32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L121 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.Denormalize(System.Int32,System.UInt32) + commentId: M:PolylineAlgorithm.PolylineEncoding.Denormalize(System.Int32,System.UInt32) +- markdown: Converts a normalized integer coordinate value back to its floating-point representation based on the specified precision. +- code: public static double Denormalize(int value, uint precision = 5) +- h4: Parameters +- parameters: + - name: value + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: The integer value to denormalize. Typically produced by the method. + - name: precision + type: + - text: uint + url: https://learn.microsoft.com/dotnet/api/system.uint32 + description: The number of decimal places used during normalization. Default is 5, matching standard polyline encoding precision. + optional: true +- h4: Returns +- parameters: + - type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: The denormalized floating-point coordinate value. +- h4: Remarks +- markdown: >- +

+ + This method reverses the normalization performed by . It takes an integer value and converts it + + to a double by dividing it by 10 raised to the power of the specified precision. If precision is 0, + + the value is returned as a double without division. + +

+ +

+ + The calculation is performed inside a checked block to ensure that any arithmetic overflow is detected + + and an is thrown. + +

+ +

+ + For example, with a precision of 5: + + +

  • A value of 3778903 becomes 37.78903
  • A value of -12241230 becomes -122.4123
+ +

+ +

+ + If the input value is 0, the method returns 0.0 immediately. + +

+- h4: Exceptions +- parameters: + - type: + - text: OverflowException + url: https://learn.microsoft.com/dotnet/api/system.overflowexception + description: Thrown if the arithmetic operation overflows during conversion. +- api3: GetRequiredBufferSize(int) + id: PolylineAlgorithm_PolylineEncoding_GetRequiredBufferSize_System_Int32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L297 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.GetRequiredBufferSize(System.Int32) + commentId: M:PolylineAlgorithm.PolylineEncoding.GetRequiredBufferSize(System.Int32) +- markdown: Calculates the number of characters required to encode a delta value in polyline format. +- code: public static int GetRequiredBufferSize(int delta) +- h4: Parameters +- parameters: + - name: delta + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: >- + The integer delta value to calculate the encoded size for. This value typically represents the difference between + + consecutive coordinate values in polyline encoding. +- h4: Returns +- parameters: + - type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: The number of characters required to encode the specified delta value. The minimum return value is 1. +- h4: Remarks +- markdown: >- +

+ + This method determines how many characters will be needed to represent an integer delta value when encoded + + using the polyline encoding algorithm. It performs the same zigzag encoding transformation as + + but only calculates the required buffer size without actually writing any data. + +

+ +

+ + The calculation process: + + +

  1. Applies zigzag encoding: left-shifts the value by 1 bit, then inverts all bits if the original value was negative
  2. Counts how many 5-bit chunks are needed to represent the encoded value
  3. Each chunk requires one character, with a minimum of 1 character for any value
+ +

+ +

+ + This method is useful for pre-allocating buffers of the correct size before encoding polyline data, helping to avoid + + buffer overflow checks during the actual encoding process. + +

+ +

+ + The method uses a long internally to prevent overflow during the left-shift operation on large negative values. + +

+- h4: See Also +- list: + - - text: PolylineEncoding + url: PolylineAlgorithm.PolylineEncoding.html + - . + - text: TryWriteValue + url: PolylineAlgorithm.PolylineEncoding.html#PolylineAlgorithm_PolylineEncoding_TryWriteValue_System_Int32_System_Span_System_Char__System_Int32__ + - ( + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + - ',' + - " " + - text: Span + url: https://learn.microsoft.com/dotnet/api/system.span-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + - ',' + - " " + - ref + - " " + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + - ) +- api3: Normalize(double, uint) + id: PolylineAlgorithm_PolylineEncoding_Normalize_System_Double_System_UInt32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L61 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.Normalize(System.Double,System.UInt32) + commentId: M:PolylineAlgorithm.PolylineEncoding.Normalize(System.Double,System.UInt32) +- markdown: Normalizes a geographic coordinate value to an integer representation based on the specified precision. +- code: public static int Normalize(double value, uint precision = 5) +- h4: Parameters +- parameters: + - name: value + type: + - text: double + url: https://learn.microsoft.com/dotnet/api/system.double + description: The numeric value to normalize. Must be a finite number (not NaN or infinity). + - name: precision + type: + - text: uint + url: https://learn.microsoft.com/dotnet/api/system.uint32 + description: >- + The number of decimal places of precision to preserve in the normalized value. + + The value is multiplied by 10^precision before rounding. + + Default is 5, which is standard for polyline encoding. + optional: true +- h4: Returns +- parameters: + - type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: An integer representing the normalized value. Returns 0 if the input value is 0.0. +- h4: Remarks +- markdown: >- +

+ + This method converts a floating-point coordinate value into a normalized integer by multiplying it by 10 raised + + to the power of the specified precision, then truncating the result to an integer. + +

+ +

+ + For example, with the default precision of 5: + + +

  • A value of 37.78903 becomes 3778903
  • A value of -122.4123 becomes -12241230
+ +

+ +

+ + The method validates that the input value is finite (not NaN or infinity) before performing normalization. + + If the precision is 0, the value is rounded without multiplication. + +

+- h4: Exceptions +- parameters: + - type: + - text: ArgumentOutOfRangeException + url: https://learn.microsoft.com/dotnet/api/system.argumentoutofrangeexception + description: Thrown when value is not a finite number (NaN or infinity). + - type: + - text: OverflowException + url: https://learn.microsoft.com/dotnet/api/system.overflowexception + description: Thrown when the normalized result exceeds the range of a 32-bit signed integer during the conversion from double to int. +- api3: TryReadValue(ref int, ReadOnlyMemory, ref int) + id: PolylineAlgorithm_PolylineEncoding_TryReadValue_System_Int32__System_ReadOnlyMemory_System_Char__System_Int32__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L168 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.TryReadValue(System.Int32@,System.ReadOnlyMemory{System.Char},System.Int32@) + commentId: M:PolylineAlgorithm.PolylineEncoding.TryReadValue(System.Int32@,System.ReadOnlyMemory{System.Char},System.Int32@) +- markdown: Attempts to read an encoded integer value from a polyline buffer, updating the specified delta and position. +- code: public static bool TryReadValue(ref int delta, ReadOnlyMemory buffer, ref int position) +- h4: Parameters +- parameters: + - name: delta + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: Reference to the integer accumulator that will be updated with the decoded value. + - name: buffer + type: + - text: ReadOnlyMemory + url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: The buffer containing polyline-encoded characters. + - name: position + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: Reference to the current position in the buffer. This value is updated as characters are read. +- h4: Returns +- parameters: + - type: + - text: bool + url: https://learn.microsoft.com/dotnet/api/system.boolean + description: true if a value was successfully read and decoded; false if the buffer ended before a complete value was read. +- h4: Remarks +- markdown: >- +

+ + This method decodes a value from a polyline-encoded character buffer, starting at the given position. It reads + + characters sequentially, applying the polyline decoding algorithm, and updates the delta with + + the decoded value. The position is advanced as characters are processed. + +

+ +

+ + The decoding process continues until a character with a value less than the algorithm's space constant is encountered, + + which signals the end of the encoded value. If the buffer is exhausted before a complete value is read, the method returns false. + +

+ +

+ + The decoded value is added to delta using zigzag decoding, which handles both positive and negative values. + +

+- api3: TryWriteValue(int, Span, ref int) + id: PolylineAlgorithm_PolylineEncoding_TryWriteValue_System_Int32_System_Span_System_Char__System_Int32__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L236 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.TryWriteValue(System.Int32,System.Span{System.Char},System.Int32@) + commentId: M:PolylineAlgorithm.PolylineEncoding.TryWriteValue(System.Int32,System.Span{System.Char},System.Int32@) +- markdown: Attempts to write an encoded integer value to a polyline buffer, updating the specified position. +- code: public static bool TryWriteValue(int delta, Span buffer, ref int position) +- h4: Parameters +- parameters: + - name: delta + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: >- + The integer value to encode and write to the buffer. This value typically represents the difference between consecutive + + coordinate values in polyline encoding. + - name: buffer + type: + - text: Span + url: https://learn.microsoft.com/dotnet/api/system.span-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: The destination buffer where the encoded characters will be written. Must have sufficient capacity to hold the encoded value. + - name: position + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: >- + Reference to the current position in the buffer. This value is updated as characters are written to reflect the new position + + after encoding is complete. +- h4: Returns +- parameters: + - type: + - text: bool + url: https://learn.microsoft.com/dotnet/api/system.boolean + description: >- + true if the value was successfully encoded and written to the buffer; false if the buffer + + does not have sufficient remaining capacity to hold the encoded value. +- h4: Remarks +- markdown: >- +

+ + This method encodes an integer delta value into a polyline-encoded format and writes it to the provided character buffer, + + starting at the given position. It applies zigzag encoding followed by the polyline encoding algorithm to represent + + both positive and negative values efficiently. + +

+ +

+ + The encoding process first converts the value using zigzag encoding (left shift by 1, with bitwise inversion for negative values), + + then writes it as a sequence of characters. Each character encodes 5 bits of data, with continuation bits indicating whether + + more characters follow. The position is advanced as characters are written. + +

+ +

+ + Before writing, the method validates that sufficient space is available in the buffer by calling . + + If the buffer does not have enough remaining capacity, the method returns false without modifying the buffer or position. + +

+ +

+ + This method is the inverse of and can be used to encode coordinate deltas for polyline serialization. + +

+- api3: ValidateBlockLength(ReadOnlySpan) + id: PolylineAlgorithm_PolylineEncoding_ValidateBlockLength_System_ReadOnlySpan_System_Char__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L437 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.ValidateBlockLength(System.ReadOnlySpan{System.Char}) + commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateBlockLength(System.ReadOnlySpan{System.Char}) +- markdown: Validates the block structure of a polyline segment, ensuring each encoded value does not exceed 7 characters and the polyline ends correctly. +- code: public static void ValidateBlockLength(ReadOnlySpan polyline) +- h4: Parameters +- parameters: + - name: polyline + type: + - text: ReadOnlySpan + url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: A span representing the polyline segment to validate. +- h4: Remarks +- markdown: >- +

+ + Iterates through the polyline, counting the length of each block (a sequence of characters representing an encoded value). + + Throws an if any block exceeds 7 characters or if the polyline does not end with a valid block terminator. + +

+- h4: Exceptions +- parameters: + - type: + - text: ArgumentException + url: https://learn.microsoft.com/dotnet/api/system.argumentexception + description: Thrown when a block exceeds 7 characters or the polyline does not end with a valid block terminator. +- api3: ValidateCharRange(ReadOnlySpan) + id: PolylineAlgorithm_PolylineEncoding_ValidateCharRange_System_ReadOnlySpan_System_Char__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L391 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.ValidateCharRange(System.ReadOnlySpan{System.Char}) + commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateCharRange(System.ReadOnlySpan{System.Char}) +- markdown: Validates that all characters in the polyline segment are within the allowed ASCII range for polyline encoding. +- code: public static void ValidateCharRange(ReadOnlySpan polyline) +- h4: Parameters +- parameters: + - name: polyline + type: + - text: ReadOnlySpan + url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: A span representing the polyline segment to validate. +- h4: Remarks +- markdown: >- +

+ + Uses SIMD vectorization for efficient validation of large spans. Falls back to scalar checks for any block where an invalid character is detected. + +

+ +

+ + The valid range is from '?' (63) to '_' (95), inclusive. If an invalid character is found, an is thrown. + +

+- h4: Exceptions +- parameters: + - type: + - text: ArgumentException + url: https://learn.microsoft.com/dotnet/api/system.argumentexception + description: Thrown when an invalid character is found in the polyline segment. +- api3: ValidateFormat(ReadOnlySpan) + id: PolylineAlgorithm_PolylineEncoding_ValidateFormat_System_ReadOnlySpan_System_Char__ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L369 + metadata: + uid: PolylineAlgorithm.PolylineEncoding.ValidateFormat(System.ReadOnlySpan{System.Char}) + commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateFormat(System.ReadOnlySpan{System.Char}) +- markdown: Validates the format of a polyline segment, ensuring all characters are valid and block structure is correct. +- code: public static void ValidateFormat(ReadOnlySpan polyline) +- h4: Parameters +- parameters: + - name: polyline + type: + - text: ReadOnlySpan + url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1 + - < + - text: char + url: https://learn.microsoft.com/dotnet/api/system.char + - '>' + description: A span representing the polyline segment to validate. +- h4: Remarks +- markdown: >- +

+ + This method performs two levels of validation on the provided polyline segment: + +

+ +
  1. + Character Range Validation: Checks that every character in the polyline is within the valid ASCII range for polyline encoding ('?' [63] to '_' [95], inclusive). + Uses SIMD acceleration for efficient validation of large segments. +
  2. + Block Structure Validation: Ensures that each encoded value (block) does not exceed 7 characters and that the polyline ends with a valid block terminator. +
+

+ + If an invalid character or block structure is detected, an is thrown with details about the error. + +

+- h4: Exceptions +- parameters: + - type: + - text: ArgumentException + url: https://learn.microsoft.com/dotnet/api/system.argumentexception + description: Thrown when an invalid character is found or the block structure is invalid. +languageId: csharp +metadata: + description: >- + Provides methods for encoding and decoding polyline data, as well as utilities for normalizing and de-normalizing + + geographic coordinate values. diff --git a/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptions.yml b/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptions.yml new file mode 100644 index 00000000..2e3880ce --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptions.yml @@ -0,0 +1,127 @@ +### YamlMime:ApiPage +title: Class PolylineEncodingOptions +body: +- api1: Class PolylineEncodingOptions + id: PolylineAlgorithm_PolylineEncodingOptions + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L29 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptions + commentId: T:PolylineAlgorithm.PolylineEncodingOptions +- facts: + - name: Namespace + value: + text: PolylineAlgorithm + url: PolylineAlgorithm.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Provides configuration options for polyline encoding operations. +- code: public sealed class PolylineEncodingOptions +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: PolylineEncodingOptions + url: PolylineAlgorithm.PolylineEncodingOptions.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Remarks +- markdown: >- +

+ + This class allows you to configure various aspects of polyline encoding, including: + +

+ +
  • The level for coordinate encoding
  • The for memory allocation strategy
  • The for diagnostic logging
+ +

+ + All properties have internal setters and should be configured through a builder or factory pattern. + +

+- h2: Properties +- api3: LoggerFactory + id: PolylineAlgorithm_PolylineEncodingOptions_LoggerFactory + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L41 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptions.LoggerFactory + commentId: P:PolylineAlgorithm.PolylineEncodingOptions.LoggerFactory +- markdown: Gets the logger factory used for diagnostic logging during encoding operations. +- code: public ILoggerFactory LoggerFactory { get; } +- h4: Property Value +- parameters: + - type: + - text: ILoggerFactory + url: https://learn.microsoft.com/dotnet/api/microsoft.extensions.logging.iloggerfactory +- h4: Remarks +- markdown: >- + The default logger factory is , which does not log any messages. + + To enable logging, provide a custom implementation. +- api3: Precision + id: PolylineAlgorithm_PolylineEncodingOptions_Precision + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L60 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptions.Precision + commentId: P:PolylineAlgorithm.PolylineEncodingOptions.Precision +- markdown: Gets the precision level used for encoding coordinate values. +- code: public uint Precision { get; } +- h4: Property Value +- parameters: + - type: + - text: uint + url: https://learn.microsoft.com/dotnet/api/system.uint32 +- h4: Remarks +- markdown: >- +

+ + The precision determines the number of decimal places to which each coordinate value (latitude or longitude) + + is multiplied and truncated (not rounded) before encoding. For example, a precision of 5 means each coordinate is multiplied by 10^5 + + and truncated to an integer before encoding. + +

+ +

+ + This setting does not directly correspond to a physical distance or accuracy in meters, but rather controls + + the granularity of the encoded values. + +

+- api3: StackAllocLimit + id: PolylineAlgorithm_PolylineEncodingOptions_StackAllocLimit + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L73 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptions.StackAllocLimit + commentId: P:PolylineAlgorithm.PolylineEncodingOptions.StackAllocLimit +- markdown: Gets the maximum buffer size (in characters) that can be allocated on the stack for encoding operations. +- code: public int StackAllocLimit { get; } +- h4: Property Value +- parameters: + - type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 +- h4: Remarks +- markdown: >- + When the required buffer size for encoding exceeds this limit, memory will be allocated on the heap instead of the stack. + + This setting specifically applies to stack allocation of character arrays (stackalloc char[]) used during polyline encoding, + + balancing performance and stack safety. +languageId: csharp +metadata: + description: Provides configuration options for polyline encoding operations. diff --git a/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml b/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml new file mode 100644 index 00000000..92e6d942 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml @@ -0,0 +1,141 @@ +### YamlMime:ApiPage +title: Class PolylineEncodingOptionsBuilder +body: +- api1: Class PolylineEncodingOptionsBuilder + id: PolylineAlgorithm_PolylineEncodingOptionsBuilder + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L15 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder + commentId: T:PolylineAlgorithm.PolylineEncodingOptionsBuilder +- facts: + - name: Namespace + value: + text: PolylineAlgorithm + url: PolylineAlgorithm.html + - name: Assembly + value: PolylineAlgorithm.dll +- markdown: Provides a builder for configuring options for polyline encoding operations. +- code: public sealed class PolylineEncodingOptionsBuilder +- h4: Inheritance +- inheritance: + - text: object + url: https://learn.microsoft.com/dotnet/api/system.object + - text: PolylineEncodingOptionsBuilder + url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html +- h4: Inherited Members +- list: + - text: object.Equals(object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object) + - text: object.Equals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object) + - text: object.GetHashCode() + url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode + - text: object.GetType() + url: https://learn.microsoft.com/dotnet/api/system.object.gettype + - text: object.ReferenceEquals(object, object) + url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals + - text: object.ToString() + url: https://learn.microsoft.com/dotnet/api/system.object.tostring +- h2: Methods +- api3: Build() + id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_Build + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L38 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.Build + commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.Build +- markdown: Builds a new instance using the configured options. +- code: public PolylineEncodingOptions Build() +- h4: Returns +- parameters: + - type: + - text: PolylineEncodingOptions + url: PolylineAlgorithm.PolylineEncodingOptions.html + description: A configured instance. +- api3: Create() + id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_Create + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L28 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.Create + commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.Create +- markdown: Creates a new instance for the specified coordinate type. +- code: public static PolylineEncodingOptionsBuilder Create() +- h4: Returns +- parameters: + - type: + - text: PolylineEncodingOptionsBuilder + url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html + description: An instance for configuring polyline encoding options. +- api3: WithLoggerFactory(ILoggerFactory) + id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithLoggerFactory_Microsoft_Extensions_Logging_ILoggerFactory_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L97 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory) + commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory) +- markdown: Configures the to be used for logging during polyline encoding operations. +- code: public PolylineEncodingOptionsBuilder WithLoggerFactory(ILoggerFactory loggerFactory) +- h4: Parameters +- parameters: + - name: loggerFactory + type: + - text: ILoggerFactory + url: https://learn.microsoft.com/dotnet/api/microsoft.extensions.logging.iloggerfactory + description: The instance to use for logging. If null, a will be used instead. +- h4: Returns +- parameters: + - type: + - text: PolylineEncodingOptionsBuilder + url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html + description: The current instance for method chaining. +- api3: WithPrecision(uint) + id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithPrecision_System_UInt32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L82 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithPrecision(System.UInt32) + commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithPrecision(System.UInt32) +- markdown: Sets the coordinate encoding precision. +- code: public PolylineEncodingOptionsBuilder WithPrecision(uint precision) +- h4: Parameters +- parameters: + - name: precision + type: + - text: uint + url: https://learn.microsoft.com/dotnet/api/system.uint32 + description: The number of decimal places to use for encoding coordinate values. Default is 5. +- h4: Returns +- parameters: + - type: + - text: PolylineEncodingOptionsBuilder + url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html + description: The current instance for method chaining. +- api3: WithStackAllocLimit(int) + id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithStackAllocLimit_System_Int32_ + src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L61 + metadata: + uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithStackAllocLimit(System.Int32) + commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithStackAllocLimit(System.Int32) +- markdown: Configures the buffer size used for stack allocation during polyline encoding operations. +- code: public PolylineEncodingOptionsBuilder WithStackAllocLimit(int stackAllocLimit) +- h4: Parameters +- parameters: + - name: stackAllocLimit + type: + - text: int + url: https://learn.microsoft.com/dotnet/api/system.int32 + description: The maximum buffer size to use for stack allocation. Must be greater than or equal to 1. +- h4: Returns +- parameters: + - type: + - text: PolylineEncodingOptionsBuilder + url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html + description: The current instance for method chaining. +- h4: Remarks +- markdown: This method allows customization of the internal buffer size for encoding, which can impact performance and memory usage. +- h4: Exceptions +- parameters: + - type: + - text: ArgumentOutOfRangeException + url: https://learn.microsoft.com/dotnet/api/system.argumentoutofrangeexception + description: Thrown if stackAllocLimit is less than 1. +languageId: csharp +metadata: + description: Provides a builder for configuring options for polyline encoding operations. diff --git a/api-reference/1.0/PolylineAlgorithm.yml b/api-reference/1.0/PolylineAlgorithm.yml new file mode 100644 index 00000000..b60dc3c0 --- /dev/null +++ b/api-reference/1.0/PolylineAlgorithm.yml @@ -0,0 +1,38 @@ +### YamlMime:ApiPage +title: Namespace PolylineAlgorithm +body: +- api1: Namespace PolylineAlgorithm + id: PolylineAlgorithm + metadata: + uid: PolylineAlgorithm + commentId: N:PolylineAlgorithm +- h3: Namespaces +- parameters: + - type: + text: PolylineAlgorithm.Abstraction + url: PolylineAlgorithm.Abstraction.html + - type: + text: PolylineAlgorithm.Extensions + url: PolylineAlgorithm.Extensions.html +- h3: Classes +- parameters: + - type: + text: InvalidPolylineException + url: PolylineAlgorithm.InvalidPolylineException.html + description: Exception thrown when a polyline is determined to be malformed or invalid during processing. + - type: + text: PolylineEncoding + url: PolylineAlgorithm.PolylineEncoding.html + description: >- + Provides methods for encoding and decoding polyline data, as well as utilities for normalizing and de-normalizing + + geographic coordinate values. + - type: + text: PolylineEncodingOptions + url: PolylineAlgorithm.PolylineEncodingOptions.html + description: Provides configuration options for polyline encoding operations. + - type: + text: PolylineEncodingOptionsBuilder + url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html + description: Provides a builder for configuring options for polyline encoding operations. +languageId: csharp diff --git a/api-reference/1.0/toc.yml b/api-reference/1.0/toc.yml new file mode 100644 index 00000000..290b7c63 --- /dev/null +++ b/api-reference/1.0/toc.yml @@ -0,0 +1,40 @@ +### YamlMime:TableOfContent +- name: PolylineAlgorithm + href: PolylineAlgorithm.yml + items: + - name: Classes + - name: InvalidPolylineException + href: PolylineAlgorithm.InvalidPolylineException.yml + - name: PolylineEncoding + href: PolylineAlgorithm.PolylineEncoding.yml + - name: PolylineEncodingOptions + href: PolylineAlgorithm.PolylineEncodingOptions.yml + - name: PolylineEncodingOptionsBuilder + href: PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml +- name: PolylineAlgorithm.Abstraction + href: PolylineAlgorithm.Abstraction.yml + items: + - name: Classes + - name: AbstractPolylineDecoder + href: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml + - name: AbstractPolylineEncoder + href: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml + - name: Interfaces + - name: IPolylineDecoder + href: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml + - name: IPolylineEncoder + href: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml +- name: PolylineAlgorithm.Extensions + href: PolylineAlgorithm.Extensions.yml + items: + - name: Classes + - name: PolylineDecoderExtensions + href: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml + - name: PolylineEncoderExtensions + href: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml +- name: PolylineAlgorithm.Internal.Diagnostics + href: PolylineAlgorithm.Internal.Diagnostics.yml + items: + - name: Classes + - name: ExceptionGuard + href: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml diff --git a/api-reference/api-reference.json b/api-reference/api-reference.json new file mode 100644 index 00000000..c5797921 --- /dev/null +++ b/api-reference/api-reference.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json", + "build": { + "xref": [ + "https://learn.microsoft.com/en-us/dotnet/.xrefmap.json" + ], + "content": [ + { + "files": [ + "index.md", + "toc.yml", + "guide/*.{md,yml}" + ], + "exclude": [ + "_docs/**" + ] + } + ], + "resource": [ + { + "files": [ + "media/**", + "versions.json" + ] + } + ], + "output": "_docs", + "template": [ + "default", + "modern", + "docs-versioning" + ], + "maxParallelism": 1, + "globalMetadata": { + "_appName": "PolylineAlgorithm for .NET", + "_appTitle": "PolylineAlgorithm for .NET", + "_enableSearch": true, + "_enableNewTab": true, + "_disableContribution": false, + "pdf": false + } + } +} \ No newline at end of file diff --git a/api-reference/assembly-metadata.json b/api-reference/assembly-metadata.json new file mode 100644 index 00000000..0416ceed --- /dev/null +++ b/api-reference/assembly-metadata.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json", + "metadata": [ + { + "src": [ + { + "src": "../src", + "files": [ + "**/*.csproj" + ] + } + ], + "dest": "temp", + "outputFormat": "apiPage" + } + ] +} \ No newline at end of file diff --git a/api-reference/docs-versioning/layout/_master.tmpl b/api-reference/docs-versioning/layout/_master.tmpl new file mode 100644 index 00000000..68043875 --- /dev/null +++ b/api-reference/docs-versioning/layout/_master.tmpl @@ -0,0 +1,163 @@ +{{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}} +{{!include(/^public/.*/)}} +{{!include(favicon.ico)}} +{{!include(logo.svg)}} + + + + + {{#redirect_url}} + + {{/redirect_url}} + {{^redirect_url}} + {{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}} {{#_appTitle}}| {{_appTitle}} {{/_appTitle}} + + + {{#_description}}{{/_description}} + {{#description}}{{/description}} + + + + + + {{#_noindex}}{{/_noindex}} + + {{#_disableNewTab}}{{/_disableNewTab}} + {{#_disableTocFilter}}{{/_disableTocFilter}} + {{#docurl}}{{/docurl}} + + + + + + + + + + + + + + + + + + {{#_googleAnalyticsTagId}} + + + {{/_googleAnalyticsTagId}} + {{/redirect_url}} + + + {{^redirect_url}} + +
+ {{^_disableNavbar}} + + {{/_disableNavbar}} +
+ +
+ {{^_disableToc}} +
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ {{/_disableToc}} + +
+
+ {{^_disableToc}} + + {{/_disableToc}} + + {{^_disableBreadcrumb}} + + {{/_disableBreadcrumb}} +
+ +
+ {{!body}} +
+ + {{^_disableContribution}} +
+ {{#sourceurl}} + {{__global.improveThisDoc}} + {{/sourceurl}} + {{^sourceurl}}{{#docurl}} + {{__global.improveThisDoc}} + {{/docurl}}{{/sourceurl}} +
+ {{/_disableContribution}} + + {{^_disableNextArticle}} + + {{/_disableNextArticle}} + +
+ + {{^_disableAffix}} +
+ +
+ {{/_disableAffix}} +
+ + {{#_enableSearch}} +
+ {{/_enableSearch}} + +
+
+
+ {{{_appFooter}}}{{^_appFooter}}Made with docfx{{/_appFooter}} +
+
+
+ + + {{/redirect_url}} + diff --git a/api-reference/docs-versioning/public/version-switcher.js b/api-reference/docs-versioning/public/version-switcher.js new file mode 100644 index 00000000..325a0531 --- /dev/null +++ b/api-reference/docs-versioning/public/version-switcher.js @@ -0,0 +1,86 @@ +(function () { + 'use strict'; + + function getVersionFromPath(pathname) { + var match = pathname.match(/\/(\d+\.\d+)\//); + return match ? match[1] : null; + } + + function getPathAfterVersion(pathname) { + var match = pathname.match(/\/\d+\.\d+\/(.*)/); + return match ? match[1] : ''; + } + + function getSiteRoot() { + var meta = document.querySelector('meta[name="docfx:rel"]'); + return meta ? meta.getAttribute('content') : './'; + } + + function initVersionPicker(versions, latest) { + var select = document.getElementById('version-picker'); + if (!select) return; + + var currentVersion = getVersionFromPath(window.location.pathname); + var relativePath = getPathAfterVersion(window.location.pathname); + + versions.forEach(function (v) { + var option = document.createElement('option'); + option.value = v; + option.textContent = v === latest ? 'v' + v + ' (latest)' : 'v' + v; + if (v === currentVersion) { + option.selected = true; + } + select.appendChild(option); + }); + + if (!currentVersion) { + var placeholder = document.createElement('option'); + placeholder.value = ''; + placeholder.textContent = 'Select version'; + placeholder.selected = true; + placeholder.disabled = true; + select.insertBefore(placeholder, select.firstChild); + } + + select.addEventListener('change', function () { + var targetVersion = select.value; + if (!targetVersion) return; + + var newPathname; + if (currentVersion && relativePath) { + newPathname = window.location.pathname.replace( + '/' + currentVersion + '/', + '/' + targetVersion + '/' + ); + } else { + newPathname = window.location.pathname.replace(/\/$/, '') + '/' + targetVersion + '/'; + } + + window.location.pathname = newPathname; + }); + } + + function loadVersions() { + var root = getSiteRoot(); + var url = root + 'versions.json'; + + fetch(url) + .then(function (r) { + if (!r.ok) throw new Error('versions.json not found'); + return r.json(); + }) + .then(function (data) { + initVersionPicker(data.versions, data.latest); + }) + .catch(function () { + var container = document.getElementById('version-picker-container'); + if (container) container.style.display = 'none'; + }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', loadVersions); + } else { + loadVersions(); + } +}()); diff --git a/api-reference/favicon.ico b/api-reference/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..eb57e8d716a3427562638ca13d1a4e7df39e7247 GIT binary patch literal 249170 zcmeFa2Xvg(wf;@8Ri^i%nUO{s_3GZMWLv#=$+EHOy;mFe-fb`~5E2rSKxiQy2sb43 zgc3?9ri6}-!Qfuy{r&bkmT~gkyVm#p*Z&f7uf#fxJQ|JO_nh9Vxf{^V0#B`Cah-72{Bf%XCyn(3N~B;7b0A*Sr&Oo1Y5uT8|}hl{IPL z8Q6j{-s`w6NcYyw`2yC*V`CraQNZLi3v@1Q_{sAYtnkZJ^8+X%k;e8 zWBSDBG41oY&AmRCMZ7Mn_!t4F`S=L(e87<`{7!F*GkIT%EBTXvGx>R+!*rk1W?E%V zPE=bkg}>8h3zS>*fA!Bm{|tQdGoYMY9dSCC9B)ZZnCZ5d7W!?L+k+14BaGJq4$EiY zdmn!OD7Y6MB>?7wF1rMs4u(^F4x9L#*aAktWdr+`_;8u95y{vH(^2fjK5WG&KBwh* zpWS?)$C9+lmYi@#(!i4|`1>V{AVWDvzkbLh^ndlwz<9i!>XiZMI zJaOQFM&ggbTwA{_U=se9ed*p*`>)!vkw^MYJQn?5HVyyxZueK`wdk8Euh;xsg!vqq zG;lzh!<=-P%WB@_b66h?IBn12%RgZ3Vf1>zsRx{Tyk011yCFC0@ZnsHnAlz+tO1jr0F{ec$b`#Nml6XBfvGcs$3NyeOczMo; z5)g1C5hd`5N`S>N7=c=We;$69^$=r+pX>A5&5tl{wkIcEVNMv(G2lBVjpLp&7^+aH zMeG0ipD_cvS96`_go{v*f05!bJri=9e@8ay`(&6F5s}VHN*JhWQ31ot=&vwg68gT5 zxkP4%#jEq&O^3r#P+e!nSvU|0CcF9GVPl8u&CKdX4JM z;1uuea2O-tAhNf^+8r)lYlq!C#pa7jbV#Y3a>-)3X4xieMHugH#~#=uno}&XkyT>P z93$pHj+h)iu@VW85d`~*h8^%~B*1IE*bJXT?ZH0|uU?zl2B+l^*S#a;uxtt0&3_8o zl7H;8B`+pQn5jwy_nOWyY(YOsWG4O%zu2_8Z_^y6g!4l#(~}{$X;08?IvOIQ#MqVM zGJlZbvOF7fnji4kk~dkC2VRgk@Z=gI#3B6N@d^`5vIY+Sd%jMN6Jhm%y8ok8;fzR1 z7|>)hC0y>aC*K%!ntqkyG`$dVnm++U`xw1JSU5@^(R_U1_rd$u!+0JnqSS*)leoaG zmB>EX84z12Lp(W?B&YOJnKA#T^25j9me;;IBDddrj|9R#ID$(YcAumVo+d-4FOrm1Ixs5l`-DF}wYS4e-MQ4F8Y4=(`TZ|MBm+HpRbT19;Ty<=O=sa3tcg?n(7n zKM1?6Ps1aAf^S%CP8v9qd!N7@WE`6d{;6B4|LdP;Kt%K@-81SZlJtA*C=dVAFEepI^)bB_>Kt^dh`}&oD!}J^W_$>}g!dz40$=!(qzcZ0L z$YCho{hyvmQtsnsWWk3gn3D#~beWSD2JFe-4?2<`VSe5q`?f

VU^~ROb=3{W!k* zaHhB->OVgGaB>}96g)H7H2G4+6&owzAw7~=zEFnG`k~a#c~}SYywJFFtHbpvB|7*X}e5#=t za5wW9U=$<{IC(OmREs5XKohVV&2uS?e@SRPaDZB(lcEkw(mbf%yBZ2A?eicm>4>`~ z-2-u9NyE#KEBR>HWjYjcn!dudL1&Yn$b+LL~YDTLNrK1gvO);rCIBZzGgcM`%H_#&Kl0XeUo zq0mO8^LwD+JO=E*-HHpg@Vwb34wF~x&TR2UCre=HIg(qkNyhZtFQpefD^&~sF4H%E zEH^#*mAvxB5&8SBLvsH^56SS6L&U}Vs0?682P6Xm1!a=azDiPne^&c-lGU+U@@HHp z`L!2`B@i>#)u)L;w^wp<3&fL>Ay!ua>cDk?cMsR;LN4&I);e4Wj!tZan|aHx1H{Ou*$+Q;TM|}T5>GxaVZe8)nYTj5|E7>p_lx3P!@ztn zUJ51bX1`p4``iR2yoY)E1LIM@-Sh*yIq5w1RWYwutbEg7C-b+*;⪼`@8$3ARlf? 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[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�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 +- `AbstractPolylineDecoder` + +### Example: Custom Encoder + +```csharp +public sealed class MyPolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> +{ + public MyPolylineEncoder() : base() { } + + public MyPolylineEncoder(PolylineEncodingOptions options) + : base(options) { } + + protected override double GetLatitude((double Latitude, double Longitude) coordinate) + => coordinate.Latitude; + + protected override double GetLongitude((double Latitude, double Longitude) coordinate) + => coordinate.Longitude; + + protected override string CreatePolyline(ReadOnlyMemory polyline) + => polyline.ToString(); +} +``` + +--- + +## Example: Custom Decoder + +```csharp +public sealed class MyPolylineDecoder : AbstractPolylineDecoder +{ + public MyPolylineDecoder() : base() { } + + public MyPolylineDecoder(PolylineEncodingOptions options) + : base(options) { } + + protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) + => (latitude, longitude); + + protected override ReadOnlyMemory GetReadOnlyMemory(ref string polyline) + => polyline.AsMemory(); +} +``` + +--- + +# Registering Custom Encoder and Decoder with `IServiceCollection` + +For ASP.NET Core or DI-enabled .NET applications, you can easily register your custom polyline encoder and decoder as services with `IServiceCollection` by defining an extension method. This enables constructor injection and central DI management. + +--- + +## Example: Register Custom Polyline Encoder/Decoder + +Suppose you have the following custom encoder and decoder (see [Advanced Usage](./advanced.md)): + +```csharp +public sealed class MyPolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> +{ + public MyPolylineEncoder(PolylineEncodingOptions options = null) + : base(options) { } + + // ... override required members ... +} + +public sealed class MyPolylineDecoder : AbstractPolylineDecoder +{ + public MyPolylineDecoder(PolylineEncodingOptions options = null) + : base(options) { } + + // ... override required members ... +} +``` + +--- + +## IServiceCollection Extension Method + +```csharp +using Microsoft.Extensions.DependencyInjection; +using PolylineAlgorithm; + +public static class PolylineServiceCollectionExtensions +{ + public static IServiceCollection AddMyPolylineEncoderDecoder( + this IServiceCollection services, + PolylineEncodingOptions options = null) + { + // Register encoder and decoder as singletons (adjust lifetime as needed) + services.AddSingleton>( + _ => new MyPolylineEncoder(options)); + services.AddSingleton>( + _ => new MyPolylineDecoder(options)); + return services; + } +} +``` + +--- + +## Usage + +In your application startup (e.g., `Program.cs` or `Startup.cs`): + +```csharp +using PolylineAlgorithm; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddMyPolylineEncoderDecoder( + PolylineEncodingOptionsBuilder.Create() + .WithStackAllocLimit(1024) + .Build() +); + +// Now you can inject IPolylineEncoder<(double, double), string> and IPolylineDecoder +``` + +--- + +## Benefits + +- **Central DI management** for polyline components +- Plug-and-play integration with ASP.NET Core and modern .NET project styles +- Easily swap out or configure encoders/decoders for different environments + +--- + +> **Tip:** +> You can generalize the extension method for different encoder/decoder types or include multiple algorithms by adding extra parameters. + +--- + +## Integration Guidance + +- **Batch or incremental processing:** + For large datasets, control the stack allocation limit via `PolylineEncodingOptions.StackAllocLimit`. +- **Thread safety:** + Default encoders/decoders are stateless and thread-safe. If extending for mutable types, ensure synchronization. +- **Logging:** + Integrate with .NET's `ILoggerFactory` when diagnostics or audit trails are needed. + +--- + +## Best Practices + +- Always validate input data—leverage built-in validation or extend for custom rules. +- Document all public APIs using XML comments for seamless integration with the auto-generated docs. +- For non-standard coordinate systems or precision, clearly specify semantics in your custom encoder/decoder. + +--- + +## More Resources + +- [Configuration](./configuration.md) +- [FAQ](./faq.md) +- [API Reference](https://petesramek.github.io/polyline-algorithm-csharp/) diff --git a/api-reference/guide/configuration.md b/api-reference/guide/configuration.md new file mode 100644 index 00000000..86f432fa --- /dev/null +++ b/api-reference/guide/configuration.md @@ -0,0 +1,75 @@ +# Configuration + +PolylineAlgorithm offers flexible configuration for encoding and decoding polylines, allowing you to fine-tune performance, control validation, and integrate diagnostics and logging. + +--- + +## PolylineEncodingOptions + +Most configuration is handled via the `PolylineEncodingOptions` object, which you can build using the fluent `PolylineEncodingOptionsBuilder`. + +### Example: Customizing Stack Alloc Limit + +```csharp +using PolylineAlgorithm; + +var options = PolylineEncodingOptionsBuilder.Create() + .WithStackAllocLimit(1024) // Set stack allocation threshold (bytes) + .Build(); + +var encoder = new PolylineEncoder(options); +``` + +--- + +## Logging and Diagnostics + +PolylineAlgorithm supports internal logging for advanced scenarios and diagnostic purposes. + +- Use your preferred .NET logging framework (`ILoggerFactory`) +- Attach loggers for encoding/decoding diagnostics, especially in automated or agent-based environments + +--- + +## Validation + +Input validation is always enabled by default: + +- Latitude: must be between -90 and 90 +- Longitude: must be between -180 and 180 +- Invalid or malformed coordinates throw descriptive exceptions + +For custom validation (e.g., for custom coordinate types), extend the provided interfaces or abstract base classes. + +--- + +## Advanced Configuration Options + +When using `PolylineEncodingOptionsBuilder`, you may set: + +- **Stack alloc limit:** Configure the threshold below which buffers are stack-allocated vs. rented from `ArrayPool` +- **Logging hooks:** Integrate your logger for troubleshooting/instrumentation +- **(Future)** Custom precision, additional metadata (as needed) + +See the XML API documentation for all available builder methods. + +--- + +## Example: Full Custom Encoder with Options + +```csharp +var options = PolylineEncodingOptionsBuilder.Create() + .WithStackAllocLimit(512) + .WithLoggerFactory(myLoggerFactory) + .Build(); + +var encoder = new PolylineEncoder(options); +``` + +--- + +## Further Reading + +- [Getting Started Guide](./guide.md) +- [Advanced Usage](./advanced.md) +- [API Reference](https://petesramek.github.io/polyline-algorithm-csharp/) diff --git a/api-reference/guide/faq.md b/api-reference/guide/faq.md new file mode 100644 index 00000000..186f97aa --- /dev/null +++ b/api-reference/guide/faq.md @@ -0,0 +1,63 @@ +# FAQ + +Frequently Asked Questions for PolylineAlgorithm + +--- + +## General + +**Q: What coordinate ranges are valid?** +A: Latitude must be between -90 and 90; longitude must be between -180 and 180. Passing out-of-range values throws `ArgumentOutOfRangeException`. + +**Q: Which .NET versions are supported?** +A: Any platform supporting `netstandard2.1`, including .NET Core, .NET 5+, Xamarin, Unity, and Blazor. + +**Q: Can the library be used in Unity, Xamarin, Blazor, or other .NET-compatible platforms?** +A: Yes! Any environment that supports `netstandard2.1` can use this library. + +--- + +## Usage & Extensibility + +**Q: How do I add a new polyline algorithm or coordinate type?** +A: Implement your own encoder/decoder using `AbstractPolylineEncoder` and `AbstractPolylineDecoder`. Add unit tests and XML doc comments, then submit a PR. + +**Q: How do I customize encoding options (e.g., buffer size, logging)?** +A: Use `PolylineEncodingOptionsBuilder` to set options, and pass the result to the encoder or decoder constructor. + +**Q: Is the library thread-safe?** +A: Yes, main encoding/decoding APIs are stateless and thread-safe. If you extend using shared mutable resources, ensure proper synchronization. + +**Q: What happens if I pass invalid or malformed input to the decoder?** +A: The decoder throws descriptive exceptions for malformed polyline strings. Ensure proper exception handling in your application. + +**Q: Does the library support streaming or incremental decoding of polylines?** +A: Currently, only batch encode/decode is supported. For streaming scenarios, implement your own logic using `PolylineEncoding` utilities. + +--- + +## Features & Support + +**Q: Is there support for elevation, timestamps, or third coordinate values?** +A: Not currently, and not planned for the core library. You may implement your own encoder/decoder using `PolylineEncoding` methods for extended coordinate data. + +**Q: How do I contribute documentation improvements?** +A: Update XML doc comments in the codebase and submit a pull request. To improve guides, update relevant markdown files in `/api-reference/guide`. + +**Q: Where can I report bugs or request features?** +A: Open a GitHub issue using the provided templates and tag `@petesramek`. + +--- + +## Documentation & Community + +**Q: Where can I find detailed API documentation?** +A: [API Reference](https://petesramek.github.io/polyline-algorithm-csharp/) + +**Q: How do I contribute?** +A: Read [CONTRIBUTING.md](../CONTRIBUTING.md), follow coding style and testing guidelines, and use issue/PR templates. + +**Q: Need more help?** +A: Open an issue in the [GitHub repository](https://github.com/petesramek/polyline-algorithm-csharp/issues). + +--- diff --git a/api-reference/guide/getting-started.md b/api-reference/guide/getting-started.md new file mode 100644 index 00000000..54d558c4 --- /dev/null +++ b/api-reference/guide/getting-started.md @@ -0,0 +1,76 @@ +# Getting Started + +PolylineAlgorithm is a lightweight, Google-compliant polyline encoding/decoding library for .NET Standard 2.1 and above. +Follow these simple steps to get started, encode and decode polylines, and configure advanced features. + +--- + +## Installation + +Install via the .NET CLI: + +```shell +dotnet add package PolylineAlgorithm +``` + +Or via NuGet Package Manager: + +```powershell +Install-Package PolylineAlgorithm +``` + +--- + +## Basic Usage + +### Encoding Coordinates + +```csharp +using PolylineAlgorithm; + +var coordinates = new List +{ + new Coordinate(48.858370, 2.294481), // Eiffel Tower + new Coordinate(51.500729, -0.124625) // Big Ben +}; + +var encoder = new PolylineEncoder(); +Polyline encoded = encoder.Encode(coordinates); + +Console.WriteLine(encoded.ToString()); // Prints the encoded polyline string +``` + +### Decoding a Polyline + +```csharp +using PolylineAlgorithm; + +var decoder = new PolylineDecoder(); +Polyline polyline = Polyline.FromString("yseiHoc_MwacOjnwM"); // Sample encoded string + +IEnumerable decoded = decoder.Decode(polyline); + +// Show decoded coordinates +foreach(var coord in decoded) +{ + Console.WriteLine($"{coord.Latitude}, {coord.Longitude}"); +} +``` + +--- + +## Customizing and Advanced Features + +- Use `PolylineEncodingOptionsBuilder` to customize settings (buffer size, logging, etc.) +- Implement custom encoder/decoder types for advanced coordinate representations +- See [API reference](https://petesramek.github.io/polyline-algorithm-csharp/) for details + +--- + +## Need More Help? + +- [FAQ](./faq.md) +- [Examples](./examples.md) +- [Report an Issue](https://github.com/petesramek/polyline-algorithm-csharp/issues) + +--- diff --git a/api-reference/guide/introduction.md b/api-reference/guide/introduction.md new file mode 100644 index 00000000..a0874834 --- /dev/null +++ b/api-reference/guide/introduction.md @@ -0,0 +1,33 @@ +# Introduction + +Welcome to **PolylineAlgorithm for .NET**, a modern library offering Google-compliant polyline encoding and decoding with strong input validation, extensible API design, and robust performance. + +## What is PolylineAlgorithm? + +PolylineAlgorithm provides tools for encoding a sequence of geographic coordinates into a compact string format used by Google Maps and other mapping platforms, and for decoding those strings back into coordinates. Its simple API and thorough documentation make it suitable for .NET Core, .NET 5+, Xamarin, Unity, Blazor, and any framework supporting `netstandard2.1`. + +## Key Benefits + +- **Standards compliance**: Implements Google’s Encoded Polyline Algorithm as specified +- **Immutable, strongly-typed objects**: Guarantees reliability and thread safety +- **Extensible**: Custom coordinate/polyline support via abstract base classes and interfaces +- **Robust input validation**: Throws descriptive exceptions for out-of-range or malformed input +- **Configuration and logging**: Advanced options and integration with `ILoggerFactory` +- **Full API documentation**: [Auto-generated API Reference](https://petesramek.github.io/polyline-algorithm-csharp/) +- **Benchmarked and tested**: Includes unit and performance tests + +## Who Should Use This Library? + +- .NET developers needing polyline encoding/decoding in mapping, GIS, logistics, or spatial applications +- Teams requiring reliability, easy integration, and customizable algorithms +- Anyone seeking a lightweight, modern, and maintainable polyline solution + +## How To Get Started + +- See the [Getting Started Guide](./guide.md) for installation and basic usage +- Explore [Examples](./examples.md) and [FAQ](./faq.md) for real-world scenarios and solutions +- Read about advanced [configuration](./configuration.md) and [customization](./advanced.md) + +--- + +For technical details, see the [API Reference](https://petesramek.github.io/polyline-algorithm-csharp/). diff --git a/api-reference/guide/sample.md b/api-reference/guide/sample.md new file mode 100644 index 00000000..336bc254 --- /dev/null +++ b/api-reference/guide/sample.md @@ -0,0 +1,115 @@ +# Sample Console Application: Using NetTopologySuite with PolylineAlgorithm + +This sample demonstrates how to encode and decode polylines using custom implementations (`NetTopologyPolylineEncoder` and `NetTopologyPolylineDecoder`) based on NetTopologySuite's `Point` type. + +--- + +## Prerequisites + +- Install the following NuGet packages: + - `PolylineAlgorithm` + - `NetTopologySuite` + +```shell +dotnet add package PolylineAlgorithm +dotnet add package NetTopologySuite +``` + +--- + +## Program.cs + +```csharp +using System; +using System.Collections.Generic; +using NetTopologySuite.Geometries; +using PolylineAlgorithm.Abstraction; + +class Program +{ + static void Main() + { + // Create some sample points (latitude, longitude) + var points = new List + { + new Point(48.858370, 2.294481), // Eiffel Tower + new Point(51.500729, -0.124625) // Big Ben + }; + + // Instantiate the custom encoder + var encoder = new NetTopologyPolylineEncoder(); + + // Encode the list of points to a polyline string + string encodedPolyline = encoder.Encode(points); + + Console.WriteLine("Encoded polyline string:"); + Console.WriteLine(encodedPolyline); + + // Instantiate the custom decoder + var decoder = new NetTopologyPolylineDecoder(); + + // Decode back to NetTopologySuite Point objects + IEnumerable decodedPoints = decoder.Decode(encodedPolyline); + + Console.WriteLine("\nDecoded coordinates:"); + foreach (var point in decodedPoints) + { + Console.WriteLine($"Latitude: {point.X}, Longitude: {point.Y}"); + } + } +} + +public sealed class NetTopologyPolylineDecoder : AbstractPolylineDecoder { + protected override Point CreateCoordinate(double latitude, double longitude) { + return new Point(latitude, longitude); + } + + protected override ReadOnlyMemory GetReadOnlyMemory(ref string polyline) { + return polyline.AsMemory(); + } +} + +public sealed class NetTopologyPolylineEncoder : AbstractPolylineEncoder { + protected override string CreatePolyline(ReadOnlyMemory polyline) { + if (polyline.IsEmpty) { + return string.Empty; + } + + return polyline.ToString(); + } + + protected override double GetLatitude(Point current) { + // Validate parameter + + return current.X; + } + + protected override double GetLongitude(Point current) { + // Validate parameter + + return current.Y; + } +} +``` + +--- + +## Expected Output + +```text +Encoded polyline string: +{sample output will be generated at runtime} + +Decoded coordinates: +Latitude: 48.85837, Longitude: 2.294481 +Latitude: 51.500729, Longitude: -0.124625 +``` + +--- + +## Notes + +- You can further extend this pattern to use any coordinate or geometry type supported by NetTopologySuite. +- The sample demonstrates real usage of a custom `PolylineEncoder`/`PolylineDecoder` in a typical .NET application. + +--- diff --git a/api-reference/guide/toc.yml b/api-reference/guide/toc.yml new file mode 100644 index 00000000..985c0293 --- /dev/null +++ b/api-reference/guide/toc.yml @@ -0,0 +1,12 @@ +- name: Introduction + href: introduction.md +- name: Getting Started + href: getting-started.md +- name: Configuration + href: configuration.md +- name: Advanced Scenarios + href: advanced-scenarios.md +- name: Sample + href: sample.md +- name: FAQ + href: faq.md diff --git a/api-reference/index.md b/api-reference/index.md new file mode 100644 index 00000000..8c5b8d16 --- /dev/null +++ b/api-reference/index.md @@ -0,0 +1,18 @@ +# PolylineAlgorithm API Reference + +Welcome! This documentation provides guides, configuration options, examples, and FAQs for the PolylineAlgorithm library. +For detailed class and method docs, see the [auto-generated API documentation](https://petesramek.github.io/polyline-algorithm-csharp/). + +## Contents + +- [Quick Start Guide](./guide.md) +- [Configuration Options](./configuration.md) +- [Advanced Usage](./advanced.md) +- [Examples](./examples.md) +- [FAQ](./faq.md) + +## Links + +- [API Reference Site](https://petesramek.github.io/polyline-algorithm-csharp/) +- [Contributing Guidelines](../CONTRIBUTING.md) +- [Changelog](./changelog.md) (if provided) diff --git a/api-reference/media/polyline-algorithm-50x46.png b/api-reference/media/polyline-algorithm-50x46.png new file mode 100644 index 0000000000000000000000000000000000000000..6e14d059850f8c0b0724f4b540c65d1b868946fd GIT binary patch literal 5385 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 p^UiP`9h3?RgB>gJn`?> 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

(na1a{c19R?f54CR(~Fk(-WYU~h6 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%0A2|*-U(tB55`UGl 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 mmYxuv=(P@ic` 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

Rqj>4&DcrBIB3QeTiB|TJ< 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 - - - Exe - net8.0 - enable - enable - - - - - - - - - - - diff --git a/benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs b/benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs deleted file mode 100644 index 798fd3ae..00000000 --- a/benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace DropoutCoder.PolylineAlgorithm.Benchmarks -{ - using BenchmarkDotNet.Attributes; - using BenchmarkDotNet.Engines; - using DropoutCoder.PolylineAlgorithm.Encoding; - - [MemoryDiagnoser] - [MarkdownExporter] - public class PolylineEncodingBenchmark - { - private Consumer _consumer = new Consumer(); - - [Params(10_000, 100_000, 1_000_000, Priority = 2)] - public int N; - - public IEnumerable<(double, double)> Coordinates; - - public PolylineEncoding Encoding { get; private set; } - - public string Polyline; - - [GlobalSetup] - public void Setup() - { - Encoding = new PolylineEncoding(); - Coordinates = new[] { (42.88895, -100.30630), (44.91513, 19.22495), (20.40244, 7.97495), (-15.52130, -63.74380), (-78.95116, -72.18130), (38.63072, 88.13120), (60.81071, 151.41245), (-58.20769, -173.43130), (59.40939, 83.91245), (-58.20769, 61.41245), (-20.86278, -119.99380), (34.10374, -150.93130), (-71.15367, 31.88120), (-72.04138, -153.74380), (-49.99635, -107.33755), (76.12614, 135.94370), (70.05664, 41.72495), (63.43879, -77.80630), (13.68456, -90.46255), (-75.90519, -7.49380), (74.71112, -127.02505), (-66.61109, 17.81870), (-49.08384, 37.50620) }; - Polyline = "}vwdGjafcRsvjKi}pxUhsrtCngtcAjjgzEdqvtLrscbKj}nr@wetlUc`nq]}_kfCyrfaK~wluUl`u}|@wa{lUmmuap@va{lU~oihCu||bF`|era@wsnnIjny{DxamaScqxza@dklDf{}kb@mtpeCavfzGqhx`Wyzzkm@jm`d@dba~Pppkg@h}pxU|rtnHp|flA|~xaPuykyN}fhv[h}pxUx~p}Ymx`sZih~iB{edwB"; - } - - [Benchmark] - public void Decode() => Encoding - .Decode(Polyline) - .Consume(_consumer); - - [Benchmark] - public void Encode() => Encoding - .Encode(Coordinates) - .Consume(_consumer); - } -} diff --git a/benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/Program.cs b/benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/Program.cs deleted file mode 100644 index d6e3655e..00000000 --- a/benchmarks/DropoutCoder.PolylineAlgorithm.Benchmarks/Program.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace DropoutCoder.PolylineAlgorithm.Benchmarks -{ - using BenchmarkDotNet.Running; - - internal class Program - { - static void Main(string[] args) - { - BenchmarkRunner - .Run(); - } - } -} diff --git a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Constants.cs b/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Constants.cs deleted file mode 100644 index 9854d042..00000000 --- a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Constants.cs +++ /dev/null @@ -1,82 +0,0 @@ -// -// Copyright (c) Petr Šrámek. All rights reserved. -// Licensed under the MIT License. See LICENSE file in the project root for full license information. -// - -namespace DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks -{ - ///

- /// Defines global constant values - /// - internal static class Constants - { - #region Constants - - /// - /// Defines the coordinate precision - /// - public const double Precision = 1E5; - - /// - /// Defines the shift length - /// - public const int ShiftLength = 5; - - #endregion - - /// - /// Defines ASCII characters constant values - /// - internal static class ASCII - { - #region Constants - - /// - /// Defines the ASCII Question Mark - /// - public const int QuestionMark = 63; - - /// - /// Defines the ASCII Space - /// - public const int Space = 32; - - /// - /// Defines the ASCII Unit Separator - /// - public const int UnitSeparator = 31; - - #endregion - } - - /// - /// Defines coordinates constant values - /// - internal static class Coordinate - { - #region Constants - - /// - /// Defines the maximum value for latitude - /// - public const int MaxLatitude = 90; - - /// - /// Defines the maximum value for longitude - /// - public const int MaxLongitude = 180; - - /// - /// Defines the minimum value for latitude - /// - public const int MinLatitude = -MaxLatitude; - - /// - /// Defines the minimum value for longitude - /// - public const int MinLongitude = -MaxLongitude; - - #endregion - } - } -} diff --git a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DecodePerformanceBenchmark.cs b/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DecodePerformanceBenchmark.cs deleted file mode 100644 index 43289f5d..00000000 --- a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DecodePerformanceBenchmark.cs +++ /dev/null @@ -1,200 +0,0 @@ -namespace DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks -{ - using BenchmarkDotNet.Attributes; - using BenchmarkDotNet.Engines; - using System; - - [MemoryDiagnoser] - public class DecodePerformanceBenchmark - { - private Consumer _consumer = new Consumer(); - public static IEnumerable<(int, char[])> Polylines() - { - yield return (1, "mz}lHssngJj`gqSnx~lEcovfTnms{Zdy~qQj_deI".ToCharArray()); - yield return (2, "}vwdGjafcRsvjKi}pxUhsrtCngtcAjjgzEdqvtLrscbKj}nr@wetlUc`nq]}_kfCyrfaK~wluUl`u}|@wa{lUmmuap@va{lU~oihCu||bF`|era@wsnnIjny{DxamaScqxza@dklDf{}kb@mtpeCavfzGqhx`Wyzzkm@jm`d@dba~Pppkg@h}pxU|rtnHp|flA|~xaPuykyN}fhv[h}pxUx~p}Ymx`sZih~iB{edwB".ToCharArray()); - yield return (3, "}adrJh}}cVazlw@uykyNhaqeE`vfzG_~kY}~`eTsr{~Cwn~aOty_g@thapJvvoqKxt{sStfahDmtvmIfmiqBhjq|HujpgComs{Z}dhdKcidPymnvBqmquE~qrfI`x{lPf|ftGn~}d_@q}saAurjmu@bwr_DxrfaK~{rO~bidPwfduXwlioFlpum@twvfFpmi~VzxcsOqyejYhh|i@pbnr[twvfF_ueUujvbSa_d~ZkcnjZla~f[pmquEebxo[j}nr@xnn|H{gyiKbh{yH`oenn@y{mpIrbd~EmipgH}fuov@hjqtTp|flAttvkFrym_d@|eyCwn~aOfvdNmeawM??{yxdUcidPca{}D_atqGenzcAlra{@trgWhn{aZ??tluqOgu~sH".ToCharArray()); - } - - [Benchmark(Baseline = true)] - [ArgumentsSource(nameof(Polylines))] - public void Decode_V1((int, char[]) arg) => V1.Decode(arg.Item2).Consume(_consumer); - - [Benchmark] - [ArgumentsSource(nameof(Polylines))] - public void Decode_V1_Parallel((int, char[]) arg) => Parallel.For(0, 100, (i) => V1.Decode(arg.Item2).Consume(_consumer)); - - [Benchmark] - [ArgumentsSource(nameof(Polylines))] - public void Decode_V2((int, char[]) arg) => V2.Decode(arg.Item2).Consume(_consumer); - - [Benchmark] - [ArgumentsSource(nameof(Polylines))] - public void Decode_V2_Parallel((int, char[]) arg) => Parallel.For(0, 100, (i) => V2.Decode(arg.Item2).Consume(_consumer)); - - private class V1 - { - public static IEnumerable<(double Latitude, double Longitude)> Decode(char[] polyline) - { - if (polyline is null || polyline.Length == 0) - { - throw new ArgumentException(nameof(polyline)); - } - - int index = 0; - int latitude = 0; - int longitude = 0; - - var result = new List<(double Latitude, double Longitude)>(); - - while (index < polyline.Length) - { - if (!TryCalculateNext(ref polyline, ref index, ref latitude)) - { - throw new InvalidOperationException(); - } - - if (!TryCalculateNext(ref polyline, ref index, ref longitude)) - { - throw new InvalidOperationException(); - } - - var coordinate = (GetDoubleRepresentation(latitude), GetDoubleRepresentation(longitude)); - - if (!CoordinateValidator.IsValid(coordinate)) - { - throw new InvalidOperationException(); - } - - result.Add(coordinate); - } - - return result; - } - - private static bool TryCalculateNext(ref char[] polyline, ref int index, ref int value) - { - int chunk; - int sum = 0; - int shifter = 0; - - do - { - chunk = polyline[index++] - Constants.ASCII.QuestionMark; - sum |= (chunk & Constants.ASCII.UnitSeparator) << shifter; - shifter += Constants.ShiftLength; - } while (chunk >= Constants.ASCII.Space && index < polyline.Length); - - if (index >= polyline.Length && chunk >= Constants.ASCII.Space) - return false; - - value += (sum & 1) == 1 ? ~(sum >> 1) : sum >> 1; - - return true; - } - - private static double GetDoubleRepresentation(int value) - { - return Convert.ToDouble(value) / Constants.Precision; - } - - public static class CoordinateValidator - { - public static bool IsValid((double Latitude, double Longitude) coordinate) - { - return IsValidLatitude(coordinate.Latitude) && IsValidLongitude(coordinate.Longitude); - } - - public static bool IsValidLatitude(double latitude) - { - return latitude >= Constants.Coordinate.MinLatitude && latitude <= Constants.Coordinate.MaxLatitude; - } - - public static bool IsValidLongitude(double longitude) - { - return longitude >= Constants.Coordinate.MinLongitude && longitude <= Constants.Coordinate.MaxLongitude; - } - } - } - - private class V2 - { - public static IEnumerable<(double Latitude, double Longitude)> Decode(char[] polyline) - { - if (polyline is null || polyline.Length == 0) - { - throw new ArgumentException(nameof(polyline)); - } - - int offset = 0; - int latitude = 0; - int longitude = 0; - - while (offset < polyline.Length) - { - if (!TryCalculateNext(ref polyline, ref offset, ref latitude)) - { - throw new InvalidOperationException(); - } - - if (!TryCalculateNext(ref polyline, ref offset, ref longitude)) - { - throw new InvalidOperationException(); - } - - var coordinate = (GetDoubleRepresentation(latitude), GetDoubleRepresentation(longitude)); - - if (!CoordinateValidator.IsValid(coordinate)) - { - throw new InvalidOperationException(); - } - - yield return (latitude, longitude); - } - } - - private static bool TryCalculateNext(ref char[] polyline, ref int offset, ref int value) - { - int chunk; - int sum = 0; - int shifter = 0; - - do - { - chunk = polyline[offset++] - Constants.ASCII.QuestionMark; - sum |= (chunk & Constants.ASCII.UnitSeparator) << shifter; - shifter += Constants.ShiftLength; - } while (chunk >= Constants.ASCII.Space && offset < polyline.Length); - - if (offset >= polyline.Length && chunk >= Constants.ASCII.Space) - return false; - - value += (sum & 1) == 1 ? ~(sum >> 1) : sum >> 1; - - return true; - } - - private static double GetDoubleRepresentation(int value) - { - return value / Constants.Precision; - } - - public static class CoordinateValidator - { - public static bool IsValid((double Latitude, double Longitude) coordinate) - { - return IsValidLatitude(coordinate.Latitude) && IsValidLongitude(coordinate.Longitude); - } - - public static bool IsValidLatitude(double latitude) - { - return latitude >= Constants.Coordinate.MinLatitude && latitude <= Constants.Coordinate.MaxLatitude; - } - - public static bool IsValidLongitude(double longitude) - { - return longitude >= Constants.Coordinate.MinLongitude && longitude <= Constants.Coordinate.MaxLongitude; - } - } - } - } -} diff --git a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks.csproj b/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks.csproj deleted file mode 100644 index d799ba3b..00000000 --- a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - Exe - net8.0 - enable - enable - - - - - - - - - - - - diff --git a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/EncodePerformanceBenchmark.cs b/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/EncodePerformanceBenchmark.cs deleted file mode 100644 index d7a75e02..00000000 --- a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/EncodePerformanceBenchmark.cs +++ /dev/null @@ -1,222 +0,0 @@ -namespace DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks -{ - using BenchmarkDotNet.Attributes; - using BenchmarkDotNet.Engines; - using Microsoft.Extensions.ObjectPool; - using System.Collections.Generic; - using System.Text; - - [MemoryDiagnoser] - public class EncodePerformanceBenchmark - { - private Consumer _consumer = new Consumer(); - - public IEnumerable<(int, IEnumerable<(double, double)>)> Coordinates() - { - yield return (1, new[] { (49.47383, 59.06250), (-58.37407, 25.31250), (52.99363, -120.93750), (-44.49024, -174.37500) }); - yield return (2, new[] { (42.88895, -100.30630), (44.91513, 19.22495), (20.40244, 7.97495), (-15.52130, -63.74380), (-78.95116, -72.18130), (38.63072, 88.13120), (60.81071, 151.41245), (-58.20769, -173.43130), (59.40939, 83.91245), (-58.20769, 61.41245), (-20.86278, -119.99380), (34.10374, -150.93130), (-71.15367, 31.88120), (-72.04138, -153.74380), (-49.99635, -107.33755), (76.12614, 135.94370), (70.05664, 41.72495), (63.43879, -77.80630), (13.68456, -90.46255), (-75.90519, -7.49380), (74.71112, -127.02505), (-66.61109, 17.81870), (-49.08384, 37.50620) }); - yield return (3, new[] { (60.81071, -121.40005), (70.05664, -38.43130), (37.52379, -84.83755), (41.85003, 26.25620), (68.04709, 110.63120), (61.48922, 50.16245), (-4.46018, -58.11880), (-32.16061, -3.27505), (-50.89185, -55.30630), (-28.52070, 90.94370), (35.26009, 93.75620), (54.83622, 128.91245), (1.16022, 37.50620), (-44.26398, -131.24380), (-33.34325, 154.22495), (-59.65879, 90.94370), (-62.38215, 0.94370), (72.32117, 40.31870), (64.66910, 2.34995), (-61.04971, -84.83755), (77.10238, -91.86880), (-72.88859, -129.83755), (-69.24987, -24.36880), (77.41254, 119.06870), (-70.69409, 83.91245), (78.85650, 75.47495), (26.83989, 140.16245), (-24.75069, -108.74380), (30.53968, -145.30630), (79.12503, 145.78745), (-34.51006, 133.13120), (-73.29753, -60.93130), (-74.08712, 23.44370), (-76.57404, 100.78745), (-76.57404, 100.78745), (39.72082, 103.59995), (70.99412, 148.59995), (82.27591, 138.75620), (78.29964, -3.27505), (78.29964, -3.27505), (-8.65039, 47.34995) }); - } - - [Benchmark(Baseline = true)] - [ArgumentsSource(nameof(Coordinates))] - public void Encode_V1((int, IEnumerable<(double, double)>) arg) => V1.Encode(arg.Item2).Consume(_consumer); - - [Benchmark] - [ArgumentsSource(nameof(Coordinates))] - public void Encode_V1_Parallel((int, IEnumerable<(double, double)>) arg) => Parallel.For(100, 200, (i) => V1.Encode(arg.Item2).Consume(_consumer)); - - - [Benchmark] - [ArgumentsSource(nameof(Coordinates))] - public void Encode_V2((int, IEnumerable<(double, double)>) arg) => V2.Encode(arg.Item2).Consume(_consumer); - - - [Benchmark] - [ArgumentsSource(nameof(Coordinates))] - public void Encode_V2_Parallel((int, IEnumerable<(double, double)>) arg) => Parallel.For(100, 200, (i) => V2.Encode(arg.Item2).Consume(_consumer)); - - private class V1 - { - public static string Encode(IEnumerable<(double Latitude, double Longitude)> coordinates) - { - if (coordinates is null || !coordinates.Any()) - { - throw new ArgumentException(nameof(coordinates)); - } - - EnsureCoordinates(coordinates); - - int lastLatitude = 0; - int lastLongitude = 0; - var sb = new StringBuilder(); - - foreach (var coordinate in coordinates) - { - int latitude = GetIntegerRepresentation(coordinate.Latitude); - int longitude = GetIntegerRepresentation(coordinate.Longitude); - - sb.Append(GetEncodedCharacters(latitude - lastLatitude).ToArray()); - sb.Append(GetEncodedCharacters(longitude - lastLongitude).ToArray()); - - lastLatitude = latitude; - lastLongitude = longitude; - } - - return sb.ToString(); - } - - private static void EnsureCoordinates(IEnumerable<(double Latitude, double Longitude)> coordinates) - { - var invalidCoordinates = coordinates - .Where(c => !CoordinateValidator.IsValid(c)); - - if (invalidCoordinates.Any()) - { - throw new AggregateException( - invalidCoordinates - .Select(c => - new ArgumentOutOfRangeException() - ) - ); - } - } - - private static IEnumerable GetEncodedCharacters(int value) - { - int shifted = value << 1; - if (value < 0) - shifted = ~shifted; - - int rem = shifted; - - while (rem >= Constants.ASCII.Space) - { - yield return (char)((Constants.ASCII.Space | rem & Constants.ASCII.UnitSeparator) + Constants.ASCII.QuestionMark); - - rem >>= Constants.ShiftLength; - } - - yield return (char)(rem + Constants.ASCII.QuestionMark); - } - - private static int GetIntegerRepresentation(double value) - { - return (int)Math.Round(value * Constants.Precision); - } - - public static class CoordinateValidator - { - public static bool IsValid((double Latitude, double Longitude) coordinate) - { - return IsValidLatitude(coordinate.Latitude) && IsValidLongitude(coordinate.Longitude); - } - - public static bool IsValidLatitude(double latitude) - { - return latitude >= Constants.Coordinate.MinLatitude && latitude <= Constants.Coordinate.MaxLatitude; - } - - public static bool IsValidLongitude(double longitude) - { - return longitude >= Constants.Coordinate.MinLongitude && longitude <= Constants.Coordinate.MaxLongitude; - } - } - } - - private class V2 - { - private static readonly ObjectPool _pool = new DefaultObjectPoolProvider().CreateStringBuilderPool(5, int.MaxValue); - - public static string Encode(IEnumerable<(double Latitude, double Longitude)> coordinates) - { - if (coordinates is null || !coordinates.Any()) - { - throw new ArgumentException(nameof(coordinates)); - } - - EnsureCoordinates(coordinates); - - int previousLatitude = 0; - int previousLongitude = 0; - - var sb = _pool.Get(); - - foreach (var coordinate in coordinates) - { - int latitude = GetIntegerRepresentation(coordinate.Latitude); - int longitude = GetIntegerRepresentation(coordinate.Longitude); - - sb.Append(GetEncodedCharacters(latitude - previousLatitude).ToArray()); - sb.Append(GetEncodedCharacters(longitude - previousLongitude).ToArray()); - - previousLatitude = latitude; - previousLongitude = longitude; - } - - var result = sb.ToString(); - - _pool.Return(sb); - - return result; - } - - private static void EnsureCoordinates(IEnumerable<(double Latitude, double Longitude)> coordinates) - { - var invalidCoordinates = coordinates - .Where(c => !CoordinateValidator.IsValid(c)); - - if (invalidCoordinates.Any()) - { - throw new AggregateException( - invalidCoordinates - .Select(c => - new ArgumentOutOfRangeException() - ) - ); - } - } - - private static IEnumerable GetEncodedCharacters(int value) - { - int shifted = value << 1; - if (value < 0) - shifted = ~shifted; - - int rem = shifted; - - while (rem >= Constants.ASCII.Space) - { - yield return (char)((Constants.ASCII.Space | rem & Constants.ASCII.UnitSeparator) + Constants.ASCII.QuestionMark); - - rem >>= Constants.ShiftLength; - } - - yield return (char)(rem + Constants.ASCII.QuestionMark); - } - - private static int GetIntegerRepresentation(double value) - { - return (int)Math.Round(value * Constants.Precision); - } - - public static class CoordinateValidator - { - public static bool IsValid((double Latitude, double Longitude) coordinate) - { - return IsValidLatitude(coordinate.Latitude) && IsValidLongitude(coordinate.Longitude); - } - - public static bool IsValidLatitude(double latitude) - { - return latitude >= Constants.Coordinate.MinLatitude && latitude <= Constants.Coordinate.MaxLatitude; - } - - public static bool IsValidLongitude(double longitude) - { - return longitude >= Constants.Coordinate.MinLongitude && longitude <= Constants.Coordinate.MaxLongitude; - } - } - } - } -} diff --git a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Program.cs b/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Program.cs deleted file mode 100644 index 1a591c1c..00000000 --- a/benchmarks/DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks/Program.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace DropoutCoder.PolylineAlgorithm.Implementation.Benchmarks -{ - using BenchmarkDotNet.Running; - - internal class Program - { - static void Main(string[] args) - { - BenchmarkRunner - .Run(); - BenchmarkRunner - .Run(); - } - } -} diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineAlgorithm.Benchmarks.csproj b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineAlgorithm.Benchmarks.csproj new file mode 100644 index 00000000..99b5011f --- /dev/null +++ b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineAlgorithm.Benchmarks.csproj @@ -0,0 +1,26 @@ + + + + Exe + net8.0;net9.0;net10.0 + + + + pdbonly + true + + + + false + + + + + + + + + + + + diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs new file mode 100644 index 00000000..f28c8141 --- /dev/null +++ b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs @@ -0,0 +1,124 @@ +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace PolylineAlgorithm.Benchmarks; + +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Engines; +using PolylineAlgorithm.Abstraction; +using PolylineAlgorithm.Utility; + +/// +/// Benchmarks for . +/// +public class PolylineDecoderBenchmark { + private readonly Consumer _consumer = new(); + + [Params(1, 100, 1_000)] + public int CoordinatesCount { get; set; } + +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. + /// + /// Encoded polyline as string. + /// + public string String { get; private set; } + + /// + /// Encoded polyline as char array. + /// + public char[] CharArray { get; private set; } + + /// + /// Encoded polyline as read-only memory. + /// + public ReadOnlyMemory Memory { get; private set; } + +#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. + + /// + /// String polyline decoder instance. + /// + private readonly StringPolylineDecoder _stringDecoder = new(); + + /// + /// Char array polyline decoder instance. + /// + private readonly CharArrayPolylineDecoder _charArrayDecoder = new(); + + /// + /// String polyline decoder instance. + /// + private readonly MemoryCharPolylineDecoder _memoryCharDecoder = new(); + + /// + /// Sets up benchmark data. + /// + [GlobalSetup] + public void SetupData() { + String = RandomValueProvider.GetPolyline(CoordinatesCount); + CharArray = RandomValueProvider.GetPolyline(CoordinatesCount).ToCharArray(); + Memory = RandomValueProvider.GetPolyline(CoordinatesCount).AsMemory(); + } + + /// + /// Benchmark: decode from string. + /// + [Benchmark] + public void PolylineDecoder_Decode_String() { + _stringDecoder + .Decode(String) + .Consume(_consumer); + } + + /// + /// Benchmark: decode from char array. + /// + [Benchmark] + public void PolylineDecoder_Decode_CharArray() { + _charArrayDecoder + .Decode(CharArray) + .Consume(_consumer); + } + + /// + /// Benchmark: decode from memory. + /// + [Benchmark] + public void PolylineDecoder_Decode_Memory() { + _memoryCharDecoder + .Decode(Memory) + .Consume(_consumer); + } + + private sealed class StringPolylineDecoder : AbstractPolylineDecoder { + protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) { + return (latitude, longitude); + } + + protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) { + return polyline?.AsMemory() ?? Memory.Empty; + } + } + + private sealed class CharArrayPolylineDecoder : AbstractPolylineDecoder { + protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) { + return (latitude, longitude); + } + + protected override ReadOnlyMemory GetReadOnlyMemory(in char[] polyline) { + return polyline?.AsMemory() ?? Memory.Empty; + } + } + + private sealed class MemoryCharPolylineDecoder : AbstractPolylineDecoder, (double Latitude, double Longitude)> { + protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) { + return (latitude, longitude); + } + + protected override ReadOnlyMemory GetReadOnlyMemory(in ReadOnlyMemory polyline) { + return polyline; + } + } +} \ No newline at end of file diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs new file mode 100644 index 00000000..e0b97c5c --- /dev/null +++ b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs @@ -0,0 +1,92 @@ +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace PolylineAlgorithm.Benchmarks; + +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Engines; +using PolylineAlgorithm.Abstraction; +using PolylineAlgorithm.Extensions; +using PolylineAlgorithm.Utility; +using System.Collections.Generic; + +/// +/// Benchmarks for . +/// +public class PolylineEncoderBenchmark { + private readonly Consumer _consumer = new(); + + /// + /// Number of coordinates for benchmarks. + /// + [Params(1, 100, 1_000)] + public int CoordinatesCount { get; set; } + +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. + /// + /// Coordinates as list. + /// + public List<(double Latitude, double Longitude)> List { get; private set; } + + /// + /// Coordinates as array. + /// + public (double Latitude, double Longitude)[] Array { get; private set; } + + /// + /// Coordinates as read-only memory. + /// + public ReadOnlyMemory<(double Latitude, double Longitude)> Memory { get; private set; } + +#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. + + /// + /// Polyline encoder instance. + /// + private readonly StringPolylineEncoder _encoder = new(); + + /// + /// Sets up benchmark data. + /// + [GlobalSetup] + public void SetupData() { + List = [.. RandomValueProvider.GetCoordinates(CoordinatesCount)]; + Array = [.. List]; + Memory = Array.AsMemory(); + } + + /// + /// Benchmark: encode coordinates from span. + /// + [Benchmark] + public void PolylineEncoder_Encode_Span() { + var polyline = _encoder.Encode(Memory.Span); + _consumer.Consume(polyline); + } + + /// + /// Benchmark: encode coordinates from array. + /// + [Benchmark] + public void PolylineEncoder_Encode_Array() { + var polyline = _encoder.Encode(Array); + _consumer.Consume(polyline); + } + + /// + /// Benchmark: encode coordinates from list. + /// + [Benchmark] + public void PolylineEncoder_Encode_List() { + var polyline = _encoder.Encode(List); + _consumer.Consume(polyline); + } + + private sealed class StringPolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> { + protected override string CreatePolyline(ReadOnlyMemory polyline) => polyline.ToString(); + protected override double GetLatitude((double Latitude, double Longitude) current) => current.Latitude; + protected override double GetLongitude((double Latitude, double Longitude) current) => current.Longitude; + } +} diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs new file mode 100644 index 00000000..861ad85f --- /dev/null +++ b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncodingBenchmark.cs @@ -0,0 +1,38 @@ +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace PolylineAlgorithm.Benchmarks; + +using BenchmarkDotNet.Attributes; +using PolylineAlgorithm.Utility; + +/// +/// Benchmarks for the polyline encoding validation methods in . +/// +public class PolylineEncodingBenchmark { +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. + private string polyline; +#pragma warning restore CS8618 + + /// + /// Number of coordinates for benchmarks. Set by BenchmarkDotNet. + /// + [Params(8, 64, 128, 1024, 4096, 20480, 102400)] + public int CoordinatesCount { get; set; } + + [GlobalSetup] + public void Setup() { + polyline = RandomValueProvider.GetPolyline(CoordinatesCount); + } + + [Benchmark(Baseline = true)] + public void ValidateCharRange() => PolylineEncoding.ValidateCharRange(polyline); + + [Benchmark] + public void ValidateBlockLength() => PolylineEncoding.ValidateBlockLength(polyline); + + [Benchmark] + public void ValidateFormat() => PolylineEncoding.ValidateFormat(polyline); +} \ No newline at end of file diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/Program.cs b/benchmarks/PolylineAlgorithm.Benchmarks/Program.cs new file mode 100644 index 00000000..92c38c10 --- /dev/null +++ b/benchmarks/PolylineAlgorithm.Benchmarks/Program.cs @@ -0,0 +1,23 @@ +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace PolylineAlgorithm.Benchmarks; + +using BenchmarkDotNet.Running; + +/// +/// Main entry point for benchmarks. +/// +internal static class Program { + /// + /// Runs the benchmarks. + /// + /// Command-line arguments. + static void Main(string[] args) { + BenchmarkSwitcher + .FromAssembly(typeof(Program).Assembly) + .Run(args); + } +} \ No newline at end of file diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/Properties/CodeCoverage.cs b/benchmarks/PolylineAlgorithm.Benchmarks/Properties/CodeCoverage.cs new file mode 100644 index 00000000..04094932 --- /dev/null +++ b/benchmarks/PolylineAlgorithm.Benchmarks/Properties/CodeCoverage.cs @@ -0,0 +1,8 @@ +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +using System.Diagnostics.CodeAnalysis; + +[assembly: ExcludeFromCodeCoverage] \ No newline at end of file diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/Properties/GlobalSuppressions.cs b/benchmarks/PolylineAlgorithm.Benchmarks/Properties/GlobalSuppressions.cs new file mode 100644 index 00000000..10dc609e --- /dev/null +++ b/benchmarks/PolylineAlgorithm.Benchmarks/Properties/GlobalSuppressions.cs @@ -0,0 +1,15 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores", Justification = "Benchmarks.")] +[assembly: SuppressMessage("Performance", "CA1819:Properties should not return arrays", Justification = "Benchmarks.")] +[assembly: SuppressMessage("Design", "MA0016:Prefer using collection abstraction instead of implementation", Justification = "Benchmarks.")] +[assembly: SuppressMessage("Design", "CA1002:Do not expose generic lists", Justification = "Benchmarks.")] +[assembly: SuppressMessage("Naming", "CA1720:Identifier contains type name", Justification = "Benchmarks.")] +[assembly: SuppressMessage("Maintainability", "CA1515:Consider making public types internal", Justification = "Benchmarks.")] +[assembly: SuppressMessage("Security", "CA5394:Do not use insecure randomness", Justification = "Benchmarks.")] +[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "Benchmarks need instance methods.")] \ No newline at end of file diff --git a/code-coverage-settings.xml b/code-coverage-settings.xml new file mode 100644 index 00000000..c22f21e5 --- /dev/null +++ b/code-coverage-settings.xml @@ -0,0 +1,26 @@ + + + + + + + src/** + + + + + + + + ^System\.Diagnostics\.DebuggerHiddenAttribute$ + ^System\.Diagnostics\.DebuggerNonUserCodeAttribute$ + ^System\.CodeDom\.Compiler\.GeneratedCodeAttribute$ + ^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$ + + + + True + True + + + \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index 4378419e..00000000 --- a/docs/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -############### -# folder # -############### -/**/DROP/ -/**/TEMP/ -/**/packages/ -/**/bin/ -/**/obj/ -_site diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..fadcbe7d --- /dev/null +++ b/docs/README.md @@ -0,0 +1,23 @@ +# Developer Documentation + +Welcome to the developer documentation for **PolylineAlgorithm**. This section covers everything you need to contribute code, tests, benchmarks, and automation to the project. + +## Contents + +| Document | Description | +|---|---| +| [Local Development](./local-development.md) | Build, test, and format the codebase locally | +| [Testing](./testing.md) | How to write and run unit tests | +| [Benchmarks](./benchmarks.md) | How to write and run performance benchmarks | +| [Composite Actions](./composite-actions.md) | Reusable GitHub Actions used across workflows | +| [Workflows](./workflows.md) | CI/CD pipelines and how they connect | +| [Branch Strategy](./branch-strategy.md) | Branch lifecycle and environment mapping | +| [Versioning](./versioning.md) | Branch naming convention and the version pipeline | +| [API Documentation](./api-documentation.md) | How DocFX generates and publishes the API reference site | +| [Extensibility](./extensibility.md) | How to add new encoding algorithms | + +## Quick Links + +- [Contributing Guidelines](../CONTRIBUTING.md) +- [API Reference Site](https://petesramek.github.io/polyline-algorithm-csharp/) +- [GitHub Issues](https://github.com/petesramek/polyline-algorithm-csharp/issues) diff --git a/docs/api-documentation.md b/docs/api-documentation.md new file mode 100644 index 00000000..d709fe74 --- /dev/null +++ b/docs/api-documentation.md @@ -0,0 +1,136 @@ +# API Documentation + +This document explains how API documentation is generated and published for PolylineAlgorithm. + +## Toolchain + +Documentation is built with [DocFX](https://dotnet.github.io/docfx/), a static site generator for .NET API references and Markdown guides. + +## Repository Layout + +``` +api-reference/ +├── api-reference.json # DocFX build manifest (site generation) +├── assembly-metadata.json # DocFX metadata manifest (API extraction only) +├── toc.yml # Top-level table of contents +├── index.md # Landing page +├── favicon.ico +├── media/ # Images and other static assets +├── guide/ # Markdown guide articles +│ ├── toc.yml +│ ├── introduction.md +│ ├── getting-started.md +│ ├── configuration.md +│ ├── advanced-scenarios.md +│ ├── sample.md +│ └── faq.md +├── 0.0/ # Auto-generated API metadata for version 0.0 +├── 1.0/ # Auto-generated API metadata for version 1.0 +│ └── *.yml # DocFX apiPage YAML files (one per type) +└── _docs/ # Build output (excluded from DocFX content, gitignored) +``` + +## Two DocFX Manifests + +### `assembly-metadata.json` — API Extraction + +Used by the `documentation/docfx-metadata` composite action during CI builds to extract XML documentation comments from source code and produce DocFX-compatible YAML files. + +```json +{ + "metadata": [{ + "src": [{ "src": "../src", "files": ["**/*.csproj"] }], + "dest": "temp", + "outputFormat": "apiPage" + }] +} +``` + +- **Input:** All `.csproj` files under `src/` +- **Output:** YAML files in `api-reference/temp/`, then copied to `api-reference//` +- **When it runs:** Automatically after every successful `build` workflow run. The resulting YAML files are committed to the repository under `api-reference//` (e.g., `api-reference/1.2/`). + +### `api-reference.json` — Site Build + +Used by the `documentation/docfx-build` composite action to build the full documentation site. + +```json +{ + "build": { + "content": [ + { "files": ["index.md", "toc.yml", "guide/*.{md,yml}"], "exclude": ["_docs/**"] }, + { "dest": "", "files": ["*.yml"], "group": "v1.0", "src": "1.0" }, + { "dest": "", "files": ["*.yml"], "group": "v1.1", "src": "1.1" } + ], + "output": "_docs", + "template": ["default", "modern"] + } +} +``` + +- **Input:** Markdown guide articles + versioned API YAML files +- **Output:** Static HTML site in `api-reference/_docs/` +- **When it runs:** During `release.yml` (automatic on every push to `preview/**` or `release/**`) and `publish-documentation.yml` (manual trigger). + +## Publishing Flow + +``` +src/ changed + │ + ▼ +[build.yml] → docfx metadata → commit YAML to api-reference// + │ + ▼ + [release.yml] or [publish-documentation.yml] + │ + ▼ + docfx build → api-reference/_docs/ + │ + ▼ + GitHub Pages → petesramek.github.io/polyline-algorithm-csharp +``` + +## Adding a New Version to the Site + +When bumping the version to `X.Y`: + +1. The `build` workflow automatically generates metadata YAML files into `api-reference/X.Y/` after the first build on the new branch. +2. Add a new entry to `api-reference.json` under `build.content`: + ```json + { "dest": "", "files": ["*.yml"], "group": "vX.Y", "src": "X.Y", "rootTocPath": "~/toc.html" } + ``` +3. Add a matching group definition: + ```json + "vX.Y": { "dest": "X.Y" } + ``` +4. Add the new version to `api-reference/toc.yml` so it appears in the navigation dropdown: + ```yaml + - name: vX.Y + href: X.Y/PolylineAlgorithm.html + ``` + +## Writing API Documentation + +All public types, interfaces, and members must have XML doc comments. DocFX picks these up automatically: + +```csharp +/// +/// Encodes a sequence of coordinates into a polyline string. +/// +/// The coordinates to encode. +/// An encoded polyline string. +public string Encode(IEnumerable<(double Latitude, double Longitude)> coordinates) { ... } +``` + +After merging a change, verify the rendered documentation at the [API Reference Site](https://petesramek.github.io/polyline-algorithm-csharp/). + +## Local Preview + +To preview the documentation locally: + +```bash +dotnet tool update -g docfx +docfx build ./api-reference/api-reference.json --serve +``` + +Then open `http://localhost:8080` in your browser. diff --git a/docs/api/.gitignore b/docs/api/.gitignore deleted file mode 100644 index da7c71b8..00000000 --- a/docs/api/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -############### -# temp file # -############### -*.yml diff --git a/docs/api/.manifest b/docs/api/.manifest deleted file mode 100644 index 794f97a0..00000000 --- a/docs/api/.manifest +++ /dev/null @@ -1,23 +0,0 @@ -{ - "DropoutCoder.PolylineAlgorithm": "DropoutCoder.PolylineAlgorithm.yml", - "DropoutCoder.PolylineAlgorithm.Encoding": "DropoutCoder.PolylineAlgorithm.Encoding.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.IPolylineEncoding`1": "DropoutCoder.PolylineAlgorithm.Encoding.IPolylineEncoding-1.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.IPolylineEncoding`1.Decode(System.String)": "DropoutCoder.PolylineAlgorithm.Encoding.IPolylineEncoding-1.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.IPolylineEncoding`1.Encode(System.Collections.Generic.IEnumerable{`0})": "DropoutCoder.PolylineAlgorithm.Encoding.IPolylineEncoding-1.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncoding": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncoding.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncoding.CreateResult(System.Double,System.Double)": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncoding.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncoding.GetCoordinate(System.ValueTuple{System.Double,System.Double})": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncoding.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase`1": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase-1.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase`1.CreateResult(System.Double,System.Double)": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase-1.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase`1.Decode(System.String)": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase-1.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase`1.Encode(System.Collections.Generic.IEnumerable{`0})": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase-1.yml", - "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase`1.GetCoordinate(`0)": "DropoutCoder.PolylineAlgorithm.Encoding.PolylineEncodingBase-1.yml", - "DropoutCoder.PolylineAlgorithm.PolylineAlgorithm": "DropoutCoder.PolylineAlgorithm.PolylineAlgorithm.yml", - "DropoutCoder.PolylineAlgorithm.PolylineAlgorithm.Decode(System.Char[])": "DropoutCoder.PolylineAlgorithm.PolylineAlgorithm.yml", - "DropoutCoder.PolylineAlgorithm.PolylineAlgorithm.Encode(System.Collections.Generic.IEnumerable{System.ValueTuple{System.Double,System.Double}})": "DropoutCoder.PolylineAlgorithm.PolylineAlgorithm.yml", - "DropoutCoder.PolylineAlgorithm.Validation": "DropoutCoder.PolylineAlgorithm.Validation.yml", - "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator": "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator.yml", - "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator.IsValid(System.ValueTuple{System.Double,System.Double})": "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator.yml", - "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator.IsValidLatitude(System.Double)": "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator.yml", - "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator.IsValidLongitude(System.Double)": "DropoutCoder.PolylineAlgorithm.Validation.CoordinateValidator.yml" -} \ No newline at end of file diff --git a/docs/api/index.md b/docs/api/index.md deleted file mode 100644 index 306e118e..00000000 --- a/docs/api/index.md +++ /dev/null @@ -1,4 +0,0 @@ -# This is the API docs homepage. -Refer to [Markdown](http://daringfireball.net/projects/markdown/) for how to write markdown files. -## Quick Start Notes: -1. Add images to the *images* folder if the file is referencing an image. diff --git a/docs/benchmarks.md b/docs/benchmarks.md new file mode 100644 index 00000000..208cc0e2 --- /dev/null +++ b/docs/benchmarks.md @@ -0,0 +1,132 @@ +# Benchmarks + +This guide explains the benchmark project structure and how to write and run performance benchmarks. + +## Project Structure + +All benchmarks live in the `benchmarks/` directory: + +``` +benchmarks/ +└── PolylineAlgorithm.Benchmarks/ + ├── PolylineEncoderBenchmark.cs # Benchmarks for AbstractPolylineEncoder + ├── PolylineDecoderBenchmark.cs # Benchmarks for PolylineDecoder + ├── PolylineEncodingBenchmark.cs # Benchmarks for PolylineEncoding helpers + ├── Program.cs # BenchmarkSwitcher entry point + └── PolylineAlgorithm.Benchmarks.csproj +``` + +The project targets `net8.0`, `net9.0`, and `net10.0` and references the main `PolylineAlgorithm` library along with the `PolylineAlgorithm.Utility` helper project. + +## Framework + +Benchmarks use [BenchmarkDotNet](https://benchmarkdotnet.org/). Key packages: + +| Package | Purpose | +|---|---| +| `BenchmarkDotNet` | Core benchmarking framework | + +## Writing a New Benchmark + +1. Create a new `.cs` file in `benchmarks/PolylineAlgorithm.Benchmarks/`. +2. Add the standard copyright header. +3. Annotate the class with `[MemoryDiagnoser]` if you want allocation tracking. +4. Use `[Params]` to parameterize input sizes. +5. Mark benchmark methods with `[Benchmark]`. Mark one with `[Benchmark(Baseline = true)]` when comparing variants. +6. Use `[GlobalSetup]` to prepare shared data once per parameter combination. + +Example: + +```csharp +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace PolylineAlgorithm.Benchmarks; + +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Engines; + +/// +/// Benchmarks for . +/// +[MemoryDiagnoser] +public class MyEncoderBenchmark { + private readonly Consumer _consumer = new(); + + [Params(1, 100, 1_000)] + public int CoordinatesCount { get; set; } + + private (double Latitude, double Longitude)[] _data = []; + + [GlobalSetup] + public void Setup() { + _data = [.. RandomValueProvider.GetCoordinates(CoordinatesCount)]; + } + + [Benchmark(Baseline = true)] + public void EncodeArray() => new MyEncoder().Encode(_data).Consume(_consumer); +} +``` + +## Running Benchmarks Locally + +Benchmarks **must** run in Release configuration to produce meaningful results: + +```bash +dotnet run \ + --project ./benchmarks/PolylineAlgorithm.Benchmarks/PolylineAlgorithm.Benchmarks.csproj \ + --configuration Release \ + --framework net10.0 \ + -- --filter '*' +``` + +### Useful CLI flags + +| Flag | Description | +|---|---| +| `--filter '*'` | Run all benchmarks | +| `--filter '*Encoder*'` | Run benchmarks whose name contains `Encoder` | +| `--runtimes net8.0 net9.0 net10.0` | Run on multiple runtimes | +| `--exporters GitHub` | Export results as GitHub Flavored Markdown | +| `--memory` | Enable memory diagnoser output | +| `--iterationTime 100` | Iteration time in milliseconds | +| `--join` | Merge results from multiple runs | +| `--artifacts ` | Output directory for results | + +### Example: multi-runtime run with GitHub export + +```bash +dotnet run \ + --project ./benchmarks/PolylineAlgorithm.Benchmarks/PolylineAlgorithm.Benchmarks.csproj \ + --configuration Release \ + --framework net10.0 \ + -- --runtimes net8.0 net9.0 net10.0 \ + --filter '*' \ + --exporters GitHub \ + --memory \ + --iterationTime 100 \ + --join \ + --artifacts /tmp/benchmarks +``` + +## Benchmarks in CI + +The `pull-request` workflow runs benchmarks on Ubuntu, Windows, and macOS when `vars.BENCHMARKDOTNET_RUN_OVERRIDE == 'true'` or when building a release branch. Results are uploaded as artifacts (`benchmark-`) and written to the workflow step summary as a Markdown table. + +Relevant workflow variables: + +| Variable | Description | +|---|---| +| `BENCHMARKDOTNET_WORKING_DIRECTORY` | Working directory for `dotnet run` | +| `BENCHMARKDOTNET_RUNTIMES` | Space-separated runtimes to bench | +| `BENCHMARKDOTNET_FILTER` | Filter expression passed to `--filter` | +| `DEFAULT_BUILD_FRAMEWORK` | Framework used with `--framework` | +| `BENCHMARKDOTNET_RUN_OVERRIDE` | Set to `true` to force benchmark run on PRs | + +## When to Add or Update Benchmarks + +- Add a new benchmark file when introducing a new encoding/decoding code path. +- Update an existing benchmark when changing the algorithmic implementation of an existing path. +- Attach benchmark results to pull requests that affect performance-sensitive code (see [CONTRIBUTING.md](../CONTRIBUTING.md)). diff --git a/docs/branch-strategy.md b/docs/branch-strategy.md new file mode 100644 index 00000000..fb13f779 --- /dev/null +++ b/docs/branch-strategy.md @@ -0,0 +1,113 @@ +# Branch Strategy + +This document describes the branch model, the purpose of each branch type, and how a change moves from a feature branch all the way to a stable release. + +## Branch Types + +| Pattern | Purpose | Protected | +|---|---|---| +| `main` | Latest stable source of truth | ✅ Yes | +| `develop/X.Y` | Active feature development sink for version X.Y | ✅ Yes (PR only) | +| `support/X.Y` | Maintenance / backport development sink for version X.Y | ✅ Yes (PR only) | +| `feature/-` | Individual feature work, merged into `develop/X.Y` via PR | ❌ No | +| `bugfix/-` | Bug fix work, merged into `support/X.Y` via PR | ❌ No | +| `preview/X.Y` | Pre-release stabilization | ✅ Yes (1 approval required) | +| `release/X.Y` | Release stabilization | ✅ Yes (1 approval required) | + +## Change Lifecycle + +``` +1. Feature work + └─ feature/123-my-feature + │ + │ PR → develop/X.Y + │ +2. Bug fix work + └─ bugfix/124-my-fix + │ + │ PR → support/X.Y + │ +3. Promote to preview + └─ promote-branch.yml (manual) → creates preview/X.Y + PR: develop/X.Y → preview/X.Y + │ + │ PR open → [pull-request.yml]: compile, test, pack, benchmark (optional) + │ PR merged → [release.yml]: compile, test, pack, publish-NuGet (pre-release), GitHub release, docs + │ +4. Promote to release + └─ promote-branch.yml (manual) → creates release/X.Y + PR: preview/X.Y → release/X.Y + │ + │ PR open → [pull-request.yml] + │ PR merged → [release.yml]: publish-NuGet (stable), GitHub release, docs, creates support/X.Y (first time only) + │ +5. Back-merge to main (automatic, highest version only) + └─ [release.yml] creates PR: release/X.Y → main (only when X.Y is the highest release branch) + │ + │ PR merged → main is updated to the latest stable source +``` + +## Rules Per Branch Type + +### `main` + +- Represents the latest stable release — always in sync with the highest released version. +- Direct pushes are not allowed (protected). +- Updated automatically via a PR created by `release.yml` whenever the highest `release/X.Y` branch publishes a stable release. +- Serves as the baseline for version bumps: new development versions are derived from the state of `main` at the point the previous release left off. +- The `build.yml` workflow does **not** trigger on `main` pushes (branch-ignore pattern excludes `preview/**` and `release/**`, and `main` does not match `src/**` changes by default in the context of the ignore rules — check the workflow for current specifics). + +### `develop/X.Y` + +- Naming convention: `develop/.` (e.g. `develop/1.2`). +- Protected: all changes are merged via pull request from `feature/**` branches. +- The `build.yml` CI pipeline runs on every push to `src/`. +- When ready for stabilization, use `promote-branch.yml` to create a `preview/X.Y` branch and open a PR. + +### `support/X.Y` + +- Naming convention: `support/.` (e.g. `support/1.0`). +- Auto-created when the first stable release from `release/X.Y` is published. +- Protected: all changes are merged via pull request from `bugfix/**` branches. +- Can be promoted to `preview/X.Y` for a patch release. + +### `feature/-` + +- Short-lived branch for individual feature work (e.g. `feature/123-async-decoder`). +- Merged into the appropriate `develop/X.Y` via pull request. +- Not protected — deleted after merging. + +### `bugfix/-` + +- Short-lived branch for bug fixes (e.g. `bugfix/124-decode-overflow`). +- Merged into the appropriate `support/X.Y` via pull request. +- Not protected — deleted after merging. + +### `preview/X.Y` + +- Created automatically by `promote-branch.yml`. +- Locked immediately: requires at least one PR approval before any merge. +- The `pull-request.yml` workflow runs on every PR targeting this branch. +- On merge, `release.yml` publishes a **pre-release** NuGet package. +- When all pre-release validation is done, promote to `release/X.Y`. + +### `release/X.Y` + +- Created automatically by `promote-branch.yml` from `preview/X.Y`. +- Locked immediately: requires at least one PR approval. +- On merge, `release.yml` publishes a **stable** NuGet package and a GitHub release. +- After the first stable release, a corresponding `support/X.Y` branch is auto-created. +- When `X.Y` is the highest release branch, `release.yml` automatically opens a PR to merge back into `main`, keeping `main` in sync with the latest stable state. + +## Version in Branch Names + +The `X.Y` in `preview/X.Y` and `release/X.Y` drives the version pipeline. See [Versioning](./versioning.md) for details. + +## Environments + +| GitHub Environment | Used by | NuGet feed | +|---|---|---| +| `Development` | `build.yml`, `pull-request.yml` | Azure Artifacts | +| `Production` | `release.yml` | NuGet.org | + +## Locking and Unlocking Branches + +`preview/**` and `release/**` branches are locked via the [`github/branch-protection/lock`](./composite-actions.md#githubbranch-protectionlock) composite action when created. `develop/X.Y` and `support/X.Y` branches must be manually configured as protected in repository settings (PR required, no direct pushes). The [`github/branch-protection/unlock`](./composite-actions.md#githubbranch-protectionunlock) action temporarily removes protection when a workflow needs to push directly (e.g., `bump-version.yml`). Branches are always re-locked immediately after. diff --git a/docs/composite-actions.md b/docs/composite-actions.md new file mode 100644 index 00000000..66243f45 --- /dev/null +++ b/docs/composite-actions.md @@ -0,0 +1,307 @@ +# Composite Actions + +All reusable GitHub Actions live under `.github/actions/`. They are referenced with `uses: './.github/actions/'` inside workflows. This document catalogs each action, its inputs, outputs, and typical use. + +## documentation/docfx-build + +**Path:** `.github/actions/documentation/docfx-build` +**Description:** Installs the `docfx` global tool, builds a DocFX site from a JSON manifest, and uploads the generated output as a workflow artifact. + +| Input | Required | Default | Description | +|---|---|---|---| +| `artifact-name` | ✅ | — | Name of the uploaded artifact | +| `docfx-json-manifest` | ✅ | — | Path to the `docfx.json` build manifest | +| `output-directory` | ✅ | — | Target directory where DocFX writes output | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version to use | + +**Used by:** `publish-documentation` workflow. + +--- + +## documentation/docfx-metadata + +**Path:** `.github/actions/documentation/docfx-metadata` +**Description:** Runs `docfx metadata` to extract API metadata from source (`.yml` files), copies the result to an output directory, and uploads it as a workflow artifact. + +| Input | Required | Default | Description | +|---|---|---|---| +| `artifact-name` | ✅ | — | Name of the uploaded artifact | +| `docfx-json-manifest` | ✅ | — | Path to the metadata-only `docfx.json` manifest | +| `temporary-directory` | ✅ | — | Temp folder DocFX writes raw metadata into | +| `output-directory` | ✅ | — | Final output directory for the metadata | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version to use | + +**Used by:** `build` workflow (to regenerate versioned assembly metadata). + +--- + +## git/push-changes + +**Path:** `.github/actions/git/push-changes` +**Description:** Optionally downloads an artifact, stages all changes in a working directory, and pushes them to the current (or a specified target) branch. Skips the commit if there are no staged changes. + +| Input | Required | Default | Description | +|---|---|---|---| +| `commit-message` | ✅ | — | Commit message | +| `artifact-name` | ❌ | `''` | Artifact to download before staging | +| `working-directory` | ❌ | `.` | Directory to stage and commit from | +| `target-branch` | ❌ | `''` | Branch to push to (creates it if absent) | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version | + +**Used by:** `source/format`, `build` (assembly metadata), and other workflows that commit generated artefacts. + +--- + +## github/branch-protection/lock + +**Path:** `.github/actions/github/branch-protection/lock` +**Description:** Applies branch protection rules to a branch via the GitHub API: requires at least one PR approval, disables force pushes and deletions. + +| Input | Required | Description | +|---|---|---| +| `branch` | ✅ | Branch name to protect | + +**Requires:** `administration: write` permission on the workflow token. +**Used by:** `promote-branch` workflow (after creating a new `preview/**` or `release/**` branch). + +--- + +## github/branch-protection/unlock + +**Path:** `.github/actions/github/branch-protection/unlock` +**Description:** Removes all branch protection rules from a branch so a workflow can push directly to it. Always re-lock immediately after. + +| Input | Required | Description | +|---|---|---| +| `branch` | ✅ | Branch name to unprotect | + +**Requires:** `administration: write` permission on the workflow token. +**Used by:** Workflows that need to push commits directly to protected branches (e.g., `bump-version`). + +--- + +## github/create-release + +**Path:** `.github/actions/github/create-release` +**Description:** Creates a git tag and a GitHub release with auto-generated release notes. Supports pre-release flag and a notes-start-tag for scoping the changelog. + +| Input | Required | Default | Description | +|---|---|---|---| +| `release-version` | ✅ | — | SemVer string used for both the tag and the release name | +| `is-preview` | ✅ | — | `'true'` marks the release as pre-release | +| `notes-start-tag` | ❌ | `''` | Git tag from which to start auto-generated notes | + +**Used by:** `release` workflow. + +--- + +## github/write-file-to-summary + +**Path:** `.github/actions/github/write-file-to-summary` +**Description:** Appends the contents of a file (matched by glob) to the GitHub step summary (`GITHUB_STEP_SUMMARY`). + +| Input | Required | Default | Description | +|---|---|---|---| +| `file-glob-pattern` | ✅ | — | Glob pattern for the file(s) to append | +| `working-directory` | ❌ | `${{ github.workspace }}` | Directory to resolve the glob against | + +--- + +## nuget/publish-package + +**Path:** `.github/actions/nuget/publish-package` +**Description:** Downloads a NuGet package artifact and pushes it to either a public NuGet feed or an Azure Artifacts feed. Validates the `nuget-feed-server` value before proceeding. + +| Input | Required | Default | Description | +|---|---|---|---| +| `package-artifact-name` | ✅ | — | Name of the artifact containing `.nupkg` files | +| `nuget-feed-url` | ✅ | — | Feed endpoint URL | +| `nuget-feed-api-key` | ✅ | — | API key / PAT for the feed | +| `nuget-feed-server` | ✅ | — | `'NuGet'` or `'AzureArtifacts'` | +| `dotnet-sdk-version` | ❌ | `10.x` | .NET SDK version | +| `working-directory` | ❌ | `${{ github.workspace }}` | Directory containing `.nupkg` files | + +**Used by:** `build` (Development environment) and `release` (NuGet.org) workflows. + +--- + +## source/compile + +**Path:** `.github/actions/source/compile` +**Description:** Builds a project in Release configuration, injecting version properties, and uploads the binary output as a workflow artifact. + +| Input | Required | Default | Description | +|---|---|---|---| +| `assembly-version` | ✅ | — | `AssemblyVersion` MSBuild property | +| `assembly-informational-version` | ✅ | — | `AssemblyInformationalVersion` MSBuild property | +| `file-version` | ✅ | — | `FileVersion` MSBuild property | +| `treat-warnins-as-error` | ✅ | — | When `'true'`, runs `dotnet format analyzers --verify-no-changes` | +| `project-path` | ✅ | — | Glob pattern for project files | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version | +| `build-configuration` | ❌ | `Release` | Build configuration | +| `build-platform` | ❌ | `Any CPU` | MSBuild platform | +| `upload-build-artifacts` | ❌ | `true` | Whether to upload binary output | +| `build-artifacts-name` | ❌ | `build` | Artifact name | + +**Used by:** `build` and `pull-request` workflows. + +--- + +## source/format + +**Path:** `.github/actions/source/format` +**Description:** Runs `dotnet format whitespace`, `dotnet format style`, and optionally `dotnet format analyzers` on the codebase, then pushes any changes back to the branch via `git/push-changes`. + +| Input | Required | Default | Description | +|---|---|---|---| +| `project-path` | ✅ | — | Path or glob for the project/solution | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version | +| `format-whitespace` | ❌ | `true` | Run `dotnet format whitespace` | +| `format-style` | ❌ | `true` | Run `dotnet format style` | +| `format-analyzers` | ❌ | `false` | Run `dotnet format analyzers` | +| `format-analyzers-diagnostics-parameter` | ❌ | `''` | Extra `--diagnostics` argument | + +**Used by:** `build` workflow (`format` job). + +--- + +## testing/test + +**Path:** `.github/actions/testing/test` +**Description:** Runs `dotnet test` with optional TRX logging and code coverage collection, then uploads all test result files as a workflow artifact. + +| Input | Required | Default | Description | +|---|---|---|---| +| `project-path` | ✅ | — | Glob pattern for test project files | +| `test-results-directory` | ❌ | `test-results` | Directory where test outputs are written | +| `code-coverage-settings-file` | ❌ | `''` | Path to the coverage settings XML | +| `use-trf-logger` | ❌ | `true` | Enable TRX logger (`--report-trx`) | +| `collect-code-coverage` | ❌ | `true` | Enable code coverage (`--coverage`) | +| `code-coverage-output-format` | ❌ | `cobertura` | Coverage output format | +| `upload-test-artifacts` | ❌ | `true` | Upload collected test result files | +| `test-artifacts-name` | ❌ | `test-results` | Artifact name | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version | + +**Used by:** `build` and `pull-request` workflows (`test` job). + +--- + +## testing/test-report + +**Path:** `.github/actions/testing/test-report` +**Description:** Installs `LiquidTestReports.Cli` and converts `.trx` files in the test result folder into a single Markdown report. + +| Input | Required | Default | Description | +|---|---|---|---| +| `test-result-folder` | ✅ | — | Folder containing `.trx` files | +| `test-report-filename` | ❌ | `test-report.md` | Output filename | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version | + +| Output | Description | +|---|---| +| `test-report-file` | Full path to the generated Markdown report | + +**Used by:** `build` and `pull-request` workflows (report written to step summary). + +--- + +## testing/code-coverage + +**Path:** `.github/actions/testing/code-coverage` +**Description:** Merges multiple Cobertura coverage files using `dotnet-coverage`, then generates a Markdown summary report with `reportgenerator`. + +| Input | Required | Default | Description | +|---|---|---|---| +| `test-result-folder` | ✅ | — | Folder containing `*.cobertura.xml` files | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version | + +| Output | Description | +|---|---| +| `code-coverage-report-file` | Path to the generated `Summary.md` | +| `code-coverage-merge-file` | Path to the merged Cobertura XML file | + +**Used by:** `build` and `pull-request` workflows (report written to step summary). + +--- + +## versioning/extract-version + +**Path:** `.github/actions/versioning/extract-version` +**Description:** Extracts a `MAJOR.MINOR` version from a branch name using a configurable regex (default `(\d+).(\d+)`). Falls back to a default version if no match is found. + +| Input | Required | Default | Description | +|---|---|---|---| +| `branch-name` | ✅ | — | Branch name to parse | +| `default-version` | ❌ | `0.0` | Fallback when no version is found | +| `version-format` | ❌ | `(\d+).(\d+)` | Regex to extract the version | +| `dotnet_sdk_version` | ❌ | `10.x` | .NET SDK version | + +| Output | Description | +|---|---| +| `version` | Extracted `MAJOR.MINOR` string | + +**Used by:** All versioning-aware workflows. + +--- + +## versioning/format-version + +**Path:** `.github/actions/versioning/format-version` +**Description:** Produces all version strings used for .NET assembly metadata and NuGet package versions from a base `MAJOR.MINOR` version plus context inputs. + +| Input | Required | Description | +|---|---|---| +| `version` | ✅ | Base `MAJOR.MINOR` version | +| `patch` | ✅ | GitHub run number (used as patch segment) | +| `build-number` | ✅ | Commit count ahead of `main` | +| `sha` | ✅ | Commit SHA (appended to informational version) | +| `pre-release-tag` | ✅ | Pre-release label (`preview`, branch slug, or empty for stable) | + +| Output | Description | +|---|---| +| `friendly-version` | `MAJOR.MINOR` (human-readable label) | +| `assembly-version` | `MAJOR.MINOR.patch.buildNumber` | +| `assembly-informational-version` | `MAJOR.MINOR.patch+sha` | +| `file-version` | Same as `assembly-version` | +| `release-version` | `MAJOR.MINOR.patch[-preTag.buildNumber]` (NuGet version) | + +See [Versioning](./versioning.md) for the full pipeline. + +--- + +## Creating a New Composite Action + +1. Create a new directory under `.github/actions///`. +2. Add an `action.yml` file with `runs.using: composite`. +3. Declare all `inputs` with `description` and `required`. +4. Declare all `outputs` (if any) with `value` expressions referencing step outputs. +5. Keep each action focused on a single responsibility. +6. Reference optional `.NET SDK` version via an `inputs.dotnet_sdk_version` input (default `10.x`) for consistency with existing actions. +7. Use `actions/checkout@v6` as the first step when the action needs file access. + +```yaml +name: 'My Action' +author: 'Pete Sramek' +description: 'Short description of what this action does.' +inputs: + my-input: + description: 'Description of the input.' + required: true + dotnet_sdk_version: + description: '.NET SDK version. Default: 10.x' + required: false + default: '10.x' +outputs: + my-output: + description: 'Description of the output.' + value: ${{ steps.my-step.outputs.my-output }} +runs: + using: composite + steps: + - name: 'Checkout ${{ github.head_ref || github.ref }}' + uses: actions/checkout@v6 + - name: 'My step' + id: my-step + shell: bash + run: echo "my-output=value" >> $GITHUB_OUTPUT +``` diff --git a/docs/docfx.json b/docs/docfx.json deleted file mode 100644 index 86263ff4..00000000 --- a/docs/docfx.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "metadata": [ - { - "src": [ - { - "files": [ - "**.csproj" - ], - "src": "../src/" - } - ], - "dest": "api", - "disableGitFeatures": false - } - ], - "build": { - "content": [ - { - "files": [ - "**.yml", - "index.md" - ], - "src": "api", - "dest": "." - } - ], - "resource": [ - { - "files": [ - "images/**" - ] - } - ], - "overwrite": [ - { - "files": [ - "apidoc/**.md" - ], - "exclude": [ - "obj/**", - "_site/**" - ] - } - ], - "dest": "_site", - "globalMetadataFiles": [], - "fileMetadataFiles": [], - "template": [ - "default", - "modern" - ], - "postProcessors": [], - "noLangKeyword": false, - "keepFileLink": false, - "cleanupCacheHistory": false, - "disableGitFeatures": false - } -} \ No newline at end of file diff --git a/docs/extensibility.md b/docs/extensibility.md new file mode 100644 index 00000000..6df0d90a --- /dev/null +++ b/docs/extensibility.md @@ -0,0 +1,128 @@ +# Extensibility + +This guide explains how to use PolylineAlgorithm with your own coordinate types and polyline representations. + +## Design Overview + +The library is built around two generic abstract base classes: + +| Class | Purpose | +|---|---| +| `AbstractPolylineEncoder` | Encodes a sequence of coordinates into an encoded polyline | +| `AbstractPolylineDecoder` | Decodes an encoded polyline into a sequence of coordinates | + +Both implement corresponding interfaces (`IPolylineEncoder` and `IPolylineDecoder`). + +Type parameters: + +| Parameter | Meaning | Examples | +|---|---|---| +| `TCoordinate` | Your coordinate type | `(double Lat, double Lon)`, a custom `GeoPoint` class | +| `TPolyline` | Your polyline representation | `string`, `char[]`, `ReadOnlyMemory`, a custom wrapper | + +## Adding a Custom Encoder + +Subclass `AbstractPolylineEncoder` and implement the three abstract methods: + +| Method | Signature | What to return | +|---|---|---| +| `GetLatitude` | `double GetLatitude(TCoordinate current)` | The latitude in decimal degrees | +| `GetLongitude` | `double GetLongitude(TCoordinate current)` | The longitude in decimal degrees | +| `CreatePolyline` | `TPolyline CreatePolyline(ReadOnlyMemory polyline)` | Your output type built from the encoded char buffer | + +Example — encode `(double Latitude, double Longitude)` tuples to `string`: + +```csharp +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace PolylineAlgorithm; + +using PolylineAlgorithm.Abstraction; + +/// +/// Encodes geographic coordinate tuples into a Google-encoded polyline string. +/// +public sealed class TuplePolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> { + /// + protected override string CreatePolyline(ReadOnlyMemory polyline) + => polyline.ToString(); + + /// + protected override double GetLatitude((double Latitude, double Longitude) current) + => current.Latitude; + + /// + protected override double GetLongitude((double Latitude, double Longitude) current) + => current.Longitude; +} +``` + +To use custom encoding options (e.g. precision 6): + +```csharp +var options = new PolylineEncodingOptionsBuilder() + .WithPrecision(6) + .Build(); + +var encoder = new TuplePolylineEncoder(options); +``` + +## Adding a Custom Decoder + +Subclass `AbstractPolylineDecoder` and implement the two abstract methods: + +| Method | Signature | What to return | +|---|---|---| +| `GetReadOnlyMemory` | `ReadOnlyMemory GetReadOnlyMemory(in TPolyline polyline)` | A `ReadOnlyMemory` view over the encoded polyline | +| `CreateCoordinate` | `TCoordinate CreateCoordinate(double latitude, double longitude)` | An instance of your coordinate type | + +Example — decode a `string` polyline into `(double Latitude, double Longitude)` tuples: + +```csharp +// +// Copyright © Pete Sramek. All rights reserved. +// Licensed under the MIT License. See LICENSE file in the project root for full license information. +// + +namespace PolylineAlgorithm; + +using PolylineAlgorithm.Abstraction; + +/// +/// Decodes a Google-encoded polyline string into geographic coordinate tuples. +/// +public sealed class TuplePolylineDecoder : AbstractPolylineDecoder { + /// + protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) + => polyline.AsMemory(); + + /// + protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) + => (latitude, longitude); +} +``` + +## Encoding Options + +`PolylineEncodingOptions` controls shared behavior. Configure it via `PolylineEncodingOptionsBuilder`: + +```csharp +var options = new PolylineEncodingOptionsBuilder() + .WithPrecision(5) // decimal digits (default: 5) + .WithLoggerFactory(myLoggerFactory) // enables internal logging + .Build(); +``` + +Pass the options to the constructor of any encoder or decoder: + +```csharp +var encoder = new TuplePolylineEncoder(options); +var decoder = new TuplePolylineDecoder(options); +``` + +## Extension Methods + +The library provides extension methods for `IPolylineEncoder` and `IPolylineDecoder` to support common collection types (`IEnumerable`, arrays, `ReadOnlyMemory`). These are in `PolylineAlgorithm.Extensions`. Your custom implementations automatically benefit from these extension methods as long as you implement the interfaces. diff --git a/docs/favicon.ico b/docs/favicon.ico deleted file mode 100644 index 71570f61efd250abdc3bffd77a96c6986109bb85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99678 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 IhS>=GA3>?ZjsO4v diff --git a/docs/fonts/glyphicons-halflings-regular.eot b/docs/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953fff68df523aa7656497ee339d6026d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20127 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/fonts/glyphicons-halflings-regular.ttf b/docs/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609ab6f21774de0cb7e01360095584f65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 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 G`u_lkUM?>H diff --git a/docs/fonts/glyphicons-halflings-regular.woff2 b/docs/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18028 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 diff --git a/docs/local-development.md b/docs/local-development.md new file mode 100644 index 00000000..48fa5f76 --- /dev/null +++ b/docs/local-development.md @@ -0,0 +1,74 @@ +# Local Development + +This guide explains how to build, test, and format the PolylineAlgorithm codebase locally. + +## Prerequisites + +- [.NET 10 SDK](https://dotnet.microsoft.com/download) (or newer) +- A terminal / shell + +## Building + +Build the main library using the solution file: + +```bash +dotnet build PolylineAlgorithm.slnx +``` + +To build in Release configuration (required before running tests or benchmarks): + +```bash +dotnet build PolylineAlgorithm.slnx --configuration Release +``` + +## Running Tests + +Run all unit tests: + +```bash +dotnet test ./tests/PolylineAlgorithm.Tests/PolylineAlgorithm.Tests.csproj --configuration Release +``` + +> **Note:** Always use Release configuration when running tests. The Debug configuration contains a `Debug.Assert` in `AbstractPolylineEncoderTest` that will crash the test runner. + +To collect code coverage at the same time: + +```bash +dotnet test ./tests/PolylineAlgorithm.Tests/PolylineAlgorithm.Tests.csproj \ + --configuration Release \ + --coverage \ + --coverage-output-format cobertura \ + --coverage-settings ./code-coverage-settings.xml +``` + +## Running Benchmarks + +See [Benchmarks](./benchmarks.md) for full details. Quick run: + +```bash +dotnet run --project ./benchmarks/PolylineAlgorithm.Benchmarks/PolylineAlgorithm.Benchmarks.csproj \ + --configuration Release \ + --framework net10.0 \ + -- --filter '*' +``` + +## Formatting + +The project uses `dotnet format` for code style enforcement. Run all format steps before committing: + +```bash +# Fix whitespace +dotnet format whitespace + +# Fix code style +dotnet format style + +# Fix analyzer warnings (optional — run when you want to fix diagnostics) +dotnet format analyzers +``` + +The CI `format` job also runs `dotnet format` automatically on every push to non-release branches and pushes the formatted result back to the branch. + +## Editor Configuration + +Code style rules are stored in `.editorconfig` at the repository root. Any compliant IDE (Visual Studio, VS Code with C# Dev Kit, Rider) will pick these up automatically. diff --git a/docs/logo.svg b/docs/logo.svg deleted file mode 100644 index ccb2d7bc..00000000 --- a/docs/logo.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Created by Docfx - - - - - - - diff --git a/docs/manifest.json b/docs/manifest.json deleted file mode 100644 index 202b1ff4..00000000 --- a/docs/manifest.json +++ /dev/null @@ -1 +0,0 @@ -{"homepages":[],"source_base_path":"C:/Projects/GitHub/Cloudikka/polyline-algorithm-csharp/src/Cloudikka.PolylineAlgorithm","xrefmap":"xrefmap.yml","files":[{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.PolylineAlgorithm.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.PolylineAlgorithm.html","hash":"DuxXQJFG0JnJK4XZfGoqSw=="}},"is_incremental":false},{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.Validation.CoordinateValidator.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.Validation.CoordinateValidator.html","hash":"bHKr12B+LaPPoDIiM/GdEw=="}},"is_incremental":false},{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.Validation.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.Validation.html","hash":"JRNjS8Iv+pO6MsunBCDXvA=="}},"is_incremental":false},{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.html","hash":"m5VwU6ucCYySNK9o1V+ObQ=="}},"is_incremental":false},{"type":"Toc","source_relative_path":"../../docs/source/api/toc.yml","output":{".html":{"relative_path":"api/toc.html","hash":"MJBrHUiuNZAV/fYefVG24A=="}},"is_incremental":false},{"type":"Toc","source_relative_path":"../../docs/source/toc.yml","output":{".html":{"relative_path":"toc.html","hash":"ErjYhgldNN21zQh8L4Olrg=="}},"is_incremental":false},{"type":"Toc","source_relative_path":"../../docs/source/articles/toc.yml","output":{".html":{"relative_path":"articles/toc.html","hash":"dsfYf/xjrWq6mnqKHgnW9g=="}},"is_incremental":false},{"type":"Conceptual","source_relative_path":"../../docs/source/api/index.md","output":{".html":{"relative_path":"api/index.html","hash":"dPgHIsVe2ZXJr7/R6lmg7Q=="}},"is_incremental":false},{"type":"Conceptual","source_relative_path":"../../docs/source/index.md","output":{".html":{"relative_path":"index.html","hash":"OqddFoprNY6Yz18TAcxrrA=="}},"is_incremental":false},{"type":"Conceptual","source_relative_path":"../../docs/source/articles/intro.md","output":{".html":{"relative_path":"articles/intro.html","hash":"bhq6zzP77tZUevOHXJu4fw=="}},"is_incremental":false},{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.Encoding.IPolylineEncoding-1.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.Encoding.IPolylineEncoding-1.html","hash":"TcaAT5pBvPQKZDEXksnw6w=="}},"is_incremental":false},{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.Encoding.PolylineEncoding.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.Encoding.PolylineEncoding.html","hash":"AkMKRIs+xaAFilAKiDfIRA=="}},"is_incremental":false},{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.Encoding.PolylineEncodingBase-1.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.Encoding.PolylineEncodingBase-1.html","hash":"xGg93o6lzLNcZTa046c4cQ=="}},"is_incremental":false},{"type":"ManagedReference","source_relative_path":"../../docs/source/api/Cloudikka.PolylineAlgorithm.Encoding.yml","output":{".html":{"relative_path":"api/Cloudikka.PolylineAlgorithm.Encoding.html","hash":"q9cIXLi1Eu31lwAwDxYBmA=="}},"is_incremental":false}]} \ No newline at end of file diff --git a/docs/search-stopwords.json b/docs/search-stopwords.json deleted file mode 100644 index 0bdcc2c0..00000000 --- a/docs/search-stopwords.json +++ /dev/null @@ -1,121 +0,0 @@ -[ - "a", - "able", - "about", - "across", - "after", - "all", - "almost", - "also", - "am", - "among", - "an", - "and", - "any", - "are", - "as", - "at", - "be", - "because", - "been", - "but", - "by", - "can", - "cannot", - "could", - "dear", - "did", - "do", - "does", - "either", - "else", - "ever", - "every", - "for", - "from", - "get", - "got", - "had", - "has", - "have", - "he", - "her", - "hers", - "him", - "his", - "how", - "however", - "i", - "if", - "in", - "into", - "is", - "it", - "its", - "just", - "least", - "let", - "like", - "likely", - "may", - "me", - "might", - "most", - "must", - "my", - "neither", - "no", - "nor", - "not", - "of", - "off", - "often", - "on", - "only", - "or", - "other", - "our", - "own", - "rather", - "said", - "say", - "says", - "she", - "should", - "since", - "so", - "some", - "than", - "that", - "the", - "their", - "them", - "then", - "there", - "these", - "they", - "this", - "tis", - "to", - "too", - "twas", - "us", - "wants", - "was", - "we", - "were", - "what", - "when", - "where", - "which", - "while", - "who", - "whom", - "why", - "will", - "with", - "would", - "yet", - "you", - "your" -] diff --git a/docs/styles/docfx.css b/docs/styles/docfx.css deleted file mode 100644 index 83800086..00000000 --- a/docs/styles/docfx.css +++ /dev/null @@ -1,882 +0,0 @@ -/* Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */ -html, -body { - font-family: 'Segoe UI', Tahoma, Helvetica, sans-serif; - height: 100%; -} -button, -a { - color: #337ab7; - cursor: pointer; -} -button:hover, -button:focus, -a:hover, -a:focus { - color: #23527c; - text-decoration: none; -} -a.disable, -a.disable:hover { - text-decoration: none; - cursor: default; - color: #000000; -} - -/* workaround for leave space for fixed navbar with # anchor url*/ - -h1:before, -h2:before, -h3:before, -h4:before { - content: ''; - display: block; - position: relative; - width: 0; - height: 100px; - margin-top: -100px; -} - -h1, h2, h3, h4, h5, h6, span.xref { - word-wrap: break-word; - word-break: break-all; -} - -h1 mark, -h2 mark, -h3 mark, -h4 mark, -h5 mark, -h6 mark { - padding: 0; -} - -.inheritance .level0:before, -.inheritance .level1:before, -.inheritance .level2:before, -.inheritance .level3:before, -.inheritance .level4:before, -.inheritance .level5:before { - content: '↳'; - margin-right: 5px; -} - -.inheritance .level0 { - margin-left: 0em; -} - -.inheritance .level1 { - margin-left: 1em; -} - -.inheritance .level2 { - margin-left: 2em; -} - -.inheritance .level3 { - margin-left: 3em; -} - -.inheritance .level4 { - margin-left: 4em; -} - -.inheritance .level5 { - margin-left: 5em; -} - -span.parametername, -span.paramref, -span.typeparamref { - font-style: italic; -} -span.languagekeyword{ - font-weight: bold; -} - -svg:hover path { - fill: #ffffff; -} - -.hljs { - display: inline; - background-color: inherit; - padding: 0; -} -/* additional spacing fixes */ -.btn + .btn { - margin-left: 10px; -} -.btn.pull-right { - margin-left: 10px; - margin-top: 5px; -} -.table { - margin-bottom: 10px; -} -table p { - margin-bottom: 0; -} -table a { - display: inline-block; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 15px; - margin-bottom: 10px; - font-weight: 400; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 5px; -} -.navbar { - margin-bottom: 0; -} -#wrapper { - min-height: 100%; - position: relative; -} -/* blends header footer and content together with gradient effect */ -.grad-top { - /* For Safari 5.1 to 6.0 */ - /* For Opera 11.1 to 12.0 */ - /* For Firefox 3.6 to 15 */ - background: linear-gradient(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0)); - /* Standard syntax */ - height: 5px; -} -.grad-bottom { - /* For Safari 5.1 to 6.0 */ - /* For Opera 11.1 to 12.0 */ - /* For Firefox 3.6 to 15 */ - background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.05)); - /* Standard syntax */ - height: 5px; -} -.divider { - margin: 0 5px; - color: #cccccc; -} -hr { - border-color: #cccccc; -} -header { - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 1000; -} -header .navbar { - border-width: 0 0 1px; - border-radius: 0; -} -.navbar-brand { - font-size: inherit; - padding: 0; -} -.navbar-collapse { - margin: 0 -15px; -} -.subnav { - min-height: 40px; -} - -.inheritance h5, .inheritedMembers h5{ - padding-bottom: 5px; - border-bottom: 1px solid #ccc; -} - -article h1, article h2, article h3, article h4{ - margin-top: 25px; -} - -article h4{ - border-bottom: 1px solid #ccc; -} - -article span.small.pull-right{ - margin-top: 20px; -} - -article section { - margin-left: 1em; -} - -/*.expand-all { - padding: 10px 0; -}*/ -.breadcrumb { - margin: 0; - padding: 10px 0; - background-color: inherit; - white-space: nowrap; -} -.breadcrumb > li + li:before { - content: "\00a0/"; -} -#autocollapse.collapsed .navbar-header { - float: none; -} -#autocollapse.collapsed .navbar-toggle { - display: block; -} -#autocollapse.collapsed .navbar-collapse { - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -} -#autocollapse.collapsed .navbar-collapse.collapse { - display: none !important; -} -#autocollapse.collapsed .navbar-nav { - float: none !important; - margin: 7.5px -15px; -} -#autocollapse.collapsed .navbar-nav > li { - float: none; -} -#autocollapse.collapsed .navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; -} -#autocollapse.collapsed .collapse.in, -#autocollapse.collapsed .collapsing { - display: block !important; -} -#autocollapse.collapsed .collapse.in .navbar-right, -#autocollapse.collapsed .collapsing .navbar-right { - float: none !important; -} -#autocollapse .form-group { - width: 100%; -} -#autocollapse .form-control { - width: 100%; -} -#autocollapse .navbar-header { - margin-left: 0; - margin-right: 0; -} -#autocollapse .navbar-brand { - margin-left: 0; -} -.collapse.in, -.collapsing { - text-align: center; -} -.collapsing .navbar-form { - margin: 0 auto; - max-width: 400px; - padding: 10px 15px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -} -.collapsed .collapse.in .navbar-form { - margin: 0 auto; - max-width: 400px; - padding: 10px 15px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -} -.navbar .navbar-nav { - display: inline-block; -} -.docs-search { - background: white; - vertical-align: middle; -} -.docs-search > .search-query { - font-size: 14px; - border: 0; - width: 120%; - color: #555; -} -.docs-search > .search-query:focus { - outline: 0; -} -.search-results-frame { - clear: both; - display: table; - width: 100%; -} -.search-results.ng-hide { - display: none; -} -.search-results-container { - padding-bottom: 1em; - border-top: 1px solid #111; - background: rgba(25, 25, 25, 0.5); -} -.search-results-container .search-results-group { - padding-top: 50px !important; - padding: 10px; -} -.search-results-group-heading { - font-family: "Open Sans"; - padding-left: 10px; - color: white; -} -.search-close { - position: absolute; - left: 50%; - margin-left: -100px; - color: white; - text-align: center; - padding: 5px; - background: #333; - border-top-right-radius: 5px; - border-top-left-radius: 5px; - width: 200px; - box-shadow: 0 0 10px #111; -} -#search { - display: none; -} - -/* Search results display*/ -#search-results { - max-width: 960px !important; - margin-top: 120px; - margin-bottom: 115px; - margin-left: auto; - margin-right: auto; - line-height: 1.8; - display: none; -} - -#search-results>.search-list { - text-align: center; - font-size: 2.5rem; - margin-bottom: 50px; -} - -#search-results p { - text-align: center; -} - -#search-results .sr-items { - font-size: 24px; -} - -.sr-item { - margin-bottom: 25px; -} - -.sr-item>.item-href { - font-size: 14px; - color: #093; -} - -.sr-item>.item-brief { - font-size: 13px; -} - -.pagination>li>a { - color: #47A7A0 -} - -.pagination>.active>a { - background-color: #47A7A0; - border-color: #47A7A0; -} - -.fixed_header { - position: fixed; - width: 100%; - padding-bottom: 10px; - padding-top: 10px; - margin: 0px; - top: 0; - z-index: 9999; - left: 0; -} - -.fixed_header+.toc{ - margin-top: 50px; - margin-left: 0; -} - -.sidenav, .fixed_header, .toc { - background-color: #f1f1f1; -} - -.sidetoc { - position: fixed; - width: 260px; - top: 150px; - bottom: 0; - overflow-x: hidden; - overflow-y: auto; - background-color: #f1f1f1; - border-left: 1px solid #e7e7e7; - border-right: 1px solid #e7e7e7; - z-index: 1; -} - -body .toc{ - background-color: #f1f1f1; - overflow-x: hidden; -} - -.sidetoggle.ng-hide { - display: block !important; -} -.sidetoc-expand > .caret { - margin-left: 0px; - margin-top: -2px; -} -.sidetoc-expand > .caret-side { - border-left: 4px solid; - border-top: 4px solid transparent; - border-bottom: 4px solid transparent; - margin-left: 4px; - margin-top: -4px; -} -.sidetoc-heading { - font-weight: 500; -} - -.toc { - margin: 0px 0 0 10px; - padding: 0 10px; -} -.expand-stub { - position: absolute; - left: -10px; -} -.toc .nav > li > a.sidetoc-expand { - position: absolute; - top: 0; - left: 0; -} -.toc .nav > li > a { - color: #666666; - display: inline; - padding: 0; -} -.toc .nav > li > .expand-stub + a { - margin-left: 5px; - display: block; -} -.toc .nav > li > a:hover, -.toc .nav > li > a:focus { - color: #000000; - background: none; - text-decoration: inherit; -} -.toc .nav > li.active > a { - color: #337ab7; -} -.toc .nav > li.active > a:hover, -.toc .nav > li.active > a:focus { - color: #23527c; -} - -.toc .nav > li> .expand-stub { - cursor: pointer; -} - -.toc .nav > li.active > .expand-stub::before, -.toc .nav > li.in > .expand-stub::before, -.toc .nav > li.in.active > .expand-stub::before, -.toc .nav > li.filtered > .expand-stub::before { - content: "-"; -} - -.toc .nav > li > .expand-stub::before, -.toc .nav > li.active > .expand-stub::before { - content: "+"; -} - -.toc .nav > li.filtered > ul, -.toc .nav > li.in > ul { - display: block; -} - -.toc .nav > li > ul { - display: none; -} - -.toc .level1 > li { - font-weight: bold; - margin-top: 10px; - position: relative; -} -.toc .level2 { - font-weight: normal; - margin-top: 5px; - margin-left: 15px; - font-size: 14px; -} -.toc .level3 { - font-size: 12px; -} -.toc-toggle { - display: none; - margin: 0 15px 0px 15px; -} -.sidefilter { - position: fixed; - top: 90px; - width: 260px; - background-color: #f1f1f1; - padding: 15px; - border-left: 1px solid #e7e7e7; - border-right: 1px solid #e7e7e7; - z-index: 1; -} -.toc-filter { - border-radius: 5px; - background: #fff; - color: #666666; - padding: 5px; - position: relative; - margin: 0 5px 0 5px; -} -.toc-filter > input { - border: 0; - color: #666666; - padding-left: 20px; - width: 100%; -} -.toc-filter > input:focus { - outline: 0; -} -.toc-filter > .filter-icon { - position: absolute; - top: 10px; - left: 5px; -} -.article { - margin-top: 120px; - margin-bottom: 115px; -} - -#_content>a{ - margin-top: 105px; -} - -.article.grid-right { - margin-left: 280px; -} - -.inheritance hr { - margin-top: 5px; - margin-bottom: 5px; -} -.article img { - max-width: 100%; -} -.sideaffix { - margin-top: 50px; - font-size: 12px; - max-height: 100%; - overflow: hidden; - top: 100px; - bottom: 10px; - position: fixed; -} -.affix { - position: relative; - height: 100%; -} -.sideaffix > div.contribution { - margin-bottom: 20px; -} -.sideaffix > div.contribution > ul > li > a.contribution-link { - padding: 6px 10px; - font-weight: bold; - font-size: 14px; -} -.sideaffix > div.contribution > ul > li > a.contribution-link:hover { - background-color: #ffffff; -} -.sideaffix ul.nav > li > a:focus { - background: none; -} -.affix h5 { - font-weight: bold; - text-transform: uppercase; - padding-left: 10px; - font-size: 12px; -} -.affix > ul.level1 { - overflow: hidden; - padding-bottom: 10px; - height: calc(100% - 100px); - margin-right: -20px; -} -.affix ul > li > a:before { - color: #cccccc; - position: absolute; -} -.affix ul > li > a:hover { - background: none; - color: #666666; -} -.affix ul > li.active > a, -.affix ul > li.active > a:before { - color: #337ab7; -} -.affix ul > li > a { - padding: 5px 12px; - color: #666666; -} -.affix > ul > li.active:last-child { - margin-bottom: 50px; -} -.affix > ul > li > a:before { - content: "|"; - font-size: 16px; - top: 1px; - left: 0; -} -.affix > ul > li.active > a, -.affix > ul > li.active > a:before { - color: #337ab7; - font-weight: bold; -} -.affix ul ul > li > a { - padding: 2px 15px; -} -.affix ul ul > li > a:before { - content: ">"; - font-size: 14px; - top: -1px; - left: 5px; -} -.affix ul > li > a:before, -.affix ul ul { - display: none; -} -.affix ul > li.active > ul, -.affix ul > li.active > a:before, -.affix ul > li > a:hover:before { - display: block; - white-space: nowrap; -} -.codewrapper { - position: relative; -} -.trydiv { - height: 0px; -} -.tryspan { - position: absolute; - top: 0px; - right: 0px; - border-style: solid; - border-radius: 0px 4px; - box-sizing: border-box; - border-width: 1px; - border-color: #cccccc; - text-align: center; - padding: 2px 8px; - background-color: white; - font-size: 12px; - cursor: pointer; - z-index: 100; - display: none; - color: #767676; -} -.tryspan:hover { - background-color: #3b8bd0; - color: white; - border-color: #3b8bd0; -} -.codewrapper:hover .tryspan { - display: block; -} -.sample-response .response-content{ - max-height: 200px; -} -footer { - position: absolute; - left: 0; - right: 0; - bottom: 0; - z-index: 1000; -} -.footer { - border-top: 1px solid #e7e7e7; - background-color: #f8f8f8; - padding: 15px 0; -} -@media (min-width: 768px) { - #sidetoggle.collapse { - display: block; - } - .topnav .navbar-nav { - float: none; - white-space: nowrap; - } - .topnav .navbar-nav > li { - float: none; - display: inline-block; - } -} -@media only screen and (max-width: 768px) { - #mobile-indicator { - display: block; - } - /* TOC display for responsive */ - .article { - margin-top: 30px !important; - } - header { - position: static; - } - .topnav { - text-align: center; - } - .sidenav { - padding: 15px 0; - margin-left: -15px; - margin-right: -15px; - } - .sidefilter { - position: static; - width: auto; - float: none; - border: none; - } - .sidetoc { - position: static; - width: auto; - float: none; - padding-bottom: 0px; - border: none; - } - .toc .level2 > li { - display: inline-block; - } - .toc .level2 > li:after { - margin-left: -3px; - margin-right: 5px; - content: ", "; - color: #666666; - } - .article.grid-right { - margin-left: 0; - } - .grad-top, - .grad-bottom { - display: none; - } - .toc-toggle { - display: block; - } - .sidetoggle.ng-hide { - display: none !important; - } - /*.expand-all { - display: none; - }*/ - .sideaffix { - display: none; - } - .mobile-hide { - display: none; - } - .breadcrumb { - white-space: inherit; - } - - /* workaround for #hashtag url is no longer needed*/ - h1:before, - h2:before, - h3:before, - h4:before { - content: ''; - display: none; - } -} - -/* For toc iframe */ -@media (max-width: 260px) { - .toc .level2 > li { - display: block; - } - - .toc .level2 > li:after { - display: none; - } -} - -/* For code snippet line highlight */ -pre > code .line-highlight { - background-color: #ffffcc; -} - -/* Alerts */ -.alert h5 { - text-transform: uppercase; - font-weight: bold; - margin-top: 0; -} - -.alert h5:before { - position:relative; - top:1px; - display:inline-block; - font-family:'Glyphicons Halflings'; - line-height:1; - -webkit-font-smoothing:antialiased; - -moz-osx-font-smoothing:grayscale; - margin-right: 5px; - font-weight: normal; -} - -.alert-info h5:before { - content:"\e086" -} - -.alert-warning h5:before { - content:"\e127" -} - -.alert-danger h5:before { - content:"\e107" -} - -/* For Embedded Video */ -div.embeddedvideo { - padding-top: 56.25%; - position: relative; - width: 100%; -} - -div.embeddedvideo iframe { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - width: 100%; - height: 100%; -} - -/* For printer */ -@media print{ - .article.grid-right { - margin-top: 0px; - margin-left: 0px; - } - .sideaffix { - display: none; - } - .mobile-hide { - display: none; - } - .footer { - display: none; - } -} \ No newline at end of file diff --git a/docs/styles/docfx.js b/docs/styles/docfx.js deleted file mode 100644 index 0f84531f..00000000 --- a/docs/styles/docfx.js +++ /dev/null @@ -1,700 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information. -$(function () { - var active = 'active'; - var expanded = 'in'; - var collapsed = 'collapsed'; - var filtered = 'filtered'; - var show = 'show'; - var hide = 'hide'; - - // Styling for tables in conceptual documents using Bootstrap. - // See http://getbootstrap.com/css/#tables - (function () { - $('table').addClass('table table-bordered table-striped table-condensed'); - })(); - - // Styling for alerts. - (function () { - $('.NOTE, .TIP').addClass('alert alert-info'); - $('.WARNING').addClass('alert alert-warning'); - $('.IMPORTANT, .CAUTION').addClass('alert alert-danger'); - })(); - - // Enable highlight.js - (function () { - $('pre code').each(function(i, block) { - hljs.highlightBlock(block); - }); - })(); - - // Line highlight for code snippet - (function () { - $('pre code[highlight-lines]').each(function (i, block) { - if (block.innerHTML === "") return; - var lines = block.innerHTML.split('\n'); - - queryString = block.getAttribute('highlight-lines'); - if (!queryString) return; - - var ranges = queryString.split(','); - for (var j = 0, range; range = ranges[j++];) { - var found = range.match(/^(\d+)\-(\d+)?$/); - if (found) { - // consider region as `{startlinenumber}-{endlinenumber}`, in which {endlinenumber} is optional - var start = +found[1]; - var end = +found[2]; - if (isNaN(end) || end > lines.length) { - end = lines.length; - } - } else { - // consider region as a sigine line number - if (isNaN(range)) continue; - var start = +range; - var end = start; - } - if (start <= 0 || end <= 0 || start > end || start > lines.length) { - // skip current region if invalid - continue; - } - lines[start - 1] = '' + lines[start - 1]; - lines[end - 1] = lines[end - 1] + ''; - } - - block.innerHTML = lines.join('\n'); - }); - })(); - - //Adjust the position of search box in navbar - (function () { - autoCollapse(); - $(window).on('resize', autoCollapse); - $(document).on('click', '.navbar-collapse.in', function (e) { - if ($(e.target).is('a')) { - $(this).collapse('hide'); - } - }); - - function autoCollapse() { - var navbar = $('#autocollapse'); - if (navbar.height() === null) { - setTimeout(autoCollapse, 300); - } - navbar.removeClass(collapsed); - if (navbar.height() > 60) { - navbar.addClass(collapsed); - } - } - })(); - - // Support full-text-search - (function () { - var query; - var relHref = $("meta[property='docfx\\:rel']").attr("content") || ""; - var search = searchFactory(); - search(); - highlightKeywords(); - addSearchEvent(); - - // Search factory - function searchFactory() { - var worker = new Worker(relHref + 'styles/search-worker.js'); - if (!worker) return localSearch; - return window.Worker ? webWorkerSearch : localSearch; - - function localSearch() { - console.log("using local search"); - var lunrIndex = lunr(function () { - this.ref('href'); - this.field('title', { boost: 50 }); - this.field('keywords', { boost: 20 }); - }); - lunr.tokenizer.seperator = /[\s\-\.]+/; - var searchData = {}; - var searchDataRequest = new XMLHttpRequest(); - - var indexPath = relHref + "index.json"; - if (indexPath) { - searchDataRequest.open('GET', indexPath); - searchDataRequest.onload = function () { - searchData = JSON.parse(this.responseText); - for (var prop in searchData) { - lunrIndex.add(searchData[prop]); - } - } - searchDataRequest.send(); - } - - $("body").bind("queryReady", function () { - var hits = lunrIndex.search(query); - var results = []; - hits.forEach(function (hit) { - var item = searchData[hit.ref]; - results.push({ 'href': item.href, 'title': item.title, 'keywords': item.keywords }); - }); - handleSearchResults(results); - }); - } - - function webWorkerSearch() { - console.log("using Web Worker"); - var indexReady = $.Deferred(); - - worker.onmessage = function (oEvent) { - switch (oEvent.data.e) { - case 'index-ready': - indexReady.resolve(); - break; - case 'query-ready': - var hits = oEvent.data.d; - handleSearchResults(hits); - break; - } - } - - indexReady.promise().done(function () { - $("body").bind("queryReady", function () { - worker.postMessage({ q: query }); - }); - }); - } - }; - - // Highlight the searching keywords - function highlightKeywords() { - var q = url('?q'); - if (q !== null) { - var keywords = q.split("%20"); - keywords.forEach(function (keyword) { - if (keyword !== "") { - $('.data-searchable *').mark(keyword); - $('article *').mark(keyword); - } - }); - } - } - - function addSearchEvent() { - $('body').bind("searchEvent", function () { - $('#search-query').keypress(function (e) { - return e.which !== 13; - }); - - $('#search-query').keyup(function () { - query = $(this).val(); - if (query.length < 3) { - flipContents("show"); - } else { - flipContents("hide"); - $("body").trigger("queryReady"); - $('#search-results>.search-list').text('Search Results for "' + query + '"'); - } - }).off("keydown"); - }); - } - - function flipContents(action) { - if (action === "show") { - $('.hide-when-search').show(); - $('#search-results').hide(); - } else { - $('.hide-when-search').hide(); - $('#search-results').show(); - } - } - - function relativeUrlToAbsoluteUrl(currentUrl, relativeUrl) { - var currentItems = currentUrl.split(/\/+/); - var relativeItems = relativeUrl.split(/\/+/); - var depth = currentItems.length - 1; - var items = []; - for (var i = 0; i < relativeItems.length; i++) { - if (relativeItems[i] === '..') { - depth--; - } else if (relativeItems[i] !== '.') { - items.push(relativeItems[i]); - } - } - return currentItems.slice(0, depth).concat(items).join('/'); - } - - function extractContentBrief(content) { - var briefOffset = 512; - var words = query.split(/\s+/g); - var queryIndex = content.indexOf(words[0]); - var briefContent; - if (queryIndex > briefOffset) { - return "..." + content.slice(queryIndex - briefOffset, queryIndex + briefOffset) + "..."; - } else if (queryIndex <= briefOffset) { - return content.slice(0, queryIndex + briefOffset) + "..."; - } - } - - function handleSearchResults(hits) { - var numPerPage = 10; - $('#pagination').empty(); - $('#pagination').removeData("twbs-pagination"); - if (hits.length === 0) { - $('#search-results>.sr-items').html('

No results found

'); - } else { - $('#pagination').twbsPagination({ - totalPages: Math.ceil(hits.length / numPerPage), - visiblePages: 5, - onPageClick: function (event, page) { - var start = (page - 1) * numPerPage; - var curHits = hits.slice(start, start + numPerPage); - $('#search-results>.sr-items').empty().append( - curHits.map(function (hit) { - var currentUrl = window.location.href; - var itemRawHref = relativeUrlToAbsoluteUrl(currentUrl, relHref + hit.href); - var itemHref = relHref + hit.href + "?q=" + query; - var itemTitle = hit.title; - var itemBrief = extractContentBrief(hit.keywords); - - var itemNode = $('
').attr('class', 'sr-item'); - var itemTitleNode = $('
').attr('class', 'item-title').append($('').attr('href', itemHref).attr("target", "_blank").text(itemTitle)); - var itemHrefNode = $('
').attr('class', 'item-href').text(itemRawHref); - var itemBriefNode = $('
').attr('class', 'item-brief').text(itemBrief); - itemNode.append(itemTitleNode).append(itemHrefNode).append(itemBriefNode); - return itemNode; - }) - ); - query.split(/\s+/).forEach(function (word) { - if (word !== '') { - $('#search-results>.sr-items *').mark(word); - } - }); - } - }); - } - } - })(); - - // Update href in navbar - (function () { - var toc = $('#sidetoc'); - var breadcrumb = new Breadcrumb(); - loadNavbar(); - loadToc(); - function loadNavbar() { - var navbarPath = $("meta[property='docfx\\:navrel']").attr("content"); - var tocPath = $("meta[property='docfx\\:tocrel']").attr("content"); - if (tocPath) tocPath = tocPath.replace(/\\/g, '/'); - if (navbarPath) navbarPath = navbarPath.replace(/\\/g, '/'); - $.get(navbarPath, function (data) { - $(data).find("#toc>ul").appendTo("#navbar"); - if ($('#search-results').length !== 0) { - $('#search').show(); - $('body').trigger("searchEvent"); - } - var index = navbarPath.lastIndexOf('/'); - var navrel = ''; - if (index > -1) { - navrel = navbarPath.substr(0, index + 1); - } - $('#navbar>ul').addClass('navbar-nav'); - var currentAbsPath = getAbsolutePath(window.location.pathname); - // set active item - $('#navbar').find('a[href]').each(function (i, e) { - var href = $(e).attr("href"); - if (isRelativePath(href)) { - href = navrel + href; - $(e).attr("href", href); - - // TODO: currently only support one level navbar - var isActive = false; - var originalHref = e.name; - if (originalHref) { - originalHref = navrel + originalHref; - if (getDirectory(getAbsolutePath(originalHref)) === getDirectory(getAbsolutePath(tocPath))) { - isActive = true; - } - } else { - if (getAbsolutePath(href) === currentAbsPath) { - isActive = true; - } - } - if (isActive) { - $(e).parent().addClass(active); - if (!breadcrumb.isNavPartLoaded) { - breadcrumb.insert({ - href: e.href, - name: e.innerHTML - }, 0); - breadcrumb.isNavPartLoaded = true; - } - } else { - $(e).parent().removeClass(active) - } - } - }); - }); - } - - function loadToc() { - var tocPath = $("meta[property='docfx\\:tocrel']").attr("content"); - if (tocPath) tocPath = tocPath.replace(/\\/g, '/'); - $('#sidetoc').load(tocPath + " #sidetoggle > div", function () { - registerTocEvents(); - - var index = tocPath.lastIndexOf('/'); - var tocrel = ''; - if (index > -1) { - tocrel = tocPath.substr(0, index + 1); - } - var currentHref = getAbsolutePath(window.location.pathname); - $('#sidetoc').find('a[href]').each(function (i, e) { - var href = $(e).attr("href"); - if (isRelativePath(href)) { - href = tocrel + href; - $(e).attr("href", href); - } - - if (getAbsolutePath(e.href) === currentHref) { - $(e).parent().addClass(active); - var parent = $(e).parent().parents('li').children('a'); - if (!breadcrumb.isTocPartLoaded) { - for (var i = parent.length - 1; i >= 0; i--) { - breadcrumb.push({ - href: parent[i].href, - name: parent[i].innerHTML - }); - } - breadcrumb.push({ - href: e.href, - name: e.innerHTML - }); - breadcrumb.isTocPartLoaded = true; - } - if (parent.length > 0) { - parent.addClass(active); - } - // for active li, expand it - $(e).parents('ul.nav>li').addClass(expanded); - - // Scroll to active item - var top = 0; - $(e).parents('li').each(function (i, e) { - top += $(e).position().top; - }); - // 50 is the size of the filter box - $('.sidetoc').scrollTop(top - 50); - if ($('footer').is(':visible')) { - $(".sidetoc").css("bottom", "70px"); - } - } else { - $(e).parent().removeClass(active); - $(e).parents('li').children('a').removeClass(active); - } - }); - }); - } - - function registerTocEvents() { - $('.toc .nav > li > .expand-stub').click(function (e) { - $(e.target).parent().toggleClass(expanded); - }); - $('.toc .nav > li > .expand-stub + a:not([href])').click(function (e) { - $(e.target).parent().toggleClass(expanded); - }); - $('#toc_filter_input').on('input', function (e) { - var val = this.value; - if (val === '') { - // Clear 'filtered' class - $('#toc li').removeClass(filtered).removeClass(hide); - return; - } - - // Get leaf nodes - $('#toc li>a').filter(function (i, e) { - return $(e).siblings().length === 0 - }).each(function (i, anchor) { - var text = $(anchor).text(); - var parent = $(anchor).parent(); - var parentNodes = parent.parents('ul>li'); - for (var i = 0; i < parentNodes.length; i++) { - var parentText = $(parentNodes[i]).children('a').text(); - if (parentText) text = parentText + '.' + text; - }; - if (filterNavItem(text, val)) { - parent.addClass(show); - parent.removeClass(hide); - } else { - parent.addClass(hide); - parent.removeClass(show); - } - }); - $('#toc li>a').filter(function (i, e) { - return $(e).siblings().length > 0 - }).each(function (i, anchor) { - var parent = $(anchor).parent(); - if (parent.find('li.show').length > 0) { - parent.addClass(show); - parent.addClass(filtered); - parent.removeClass(hide); - } else { - parent.addClass(hide); - parent.removeClass(show); - parent.removeClass(filtered); - } - }) - - function filterNavItem(name, text) { - if (!text) return true; - if (name.toLowerCase().indexOf(text.toLowerCase()) > -1) return true; - return false; - } - }); - } - - function Breadcrumb() { - var breadcrumb = []; - var isNavPartLoaded = false; - var isTocPartLoaded = false; - this.push = pushBreadcrumb; - this.insert = insertBreadcrumb; - - function pushBreadcrumb(obj) { - breadcrumb.push(obj); - setupBreadCrumb(breadcrumb); - } - - function insertBreadcrumb(obj, index) { - breadcrumb.splice(index, 0, obj); - setupBreadCrumb(breadcrumb); - } - - function setupBreadCrumb() { - var html = formList(breadcrumb, 'breadcrumb'); - $('#breadcrumb').html(html); - } - } - - function getAbsolutePath(href) { - // Use anchor to normalize href - var anchor = $('')[0]; - // Ignore protocal, remove search and query - return anchor.host + anchor.pathname; - } - - function isRelativePath(href) { - return !isAbsolutePath(href); - } - - function isAbsolutePath(href) { - return (/^(?:[a-z]+:)?\/\//i).test(href); - } - - function getDirectory(href) { - if (!href) return ''; - var index = href.lastIndexOf('/'); - if (index == -1) return ''; - if (index > -1) { - return href.substr(0, index); - } - } - })(); - - //Setup Affix - (function () { - var hierarchy = getHierarchy(); - if (hierarchy.length > 0) { - var html = '
In This Article
' - html += formList(hierarchy, ['nav', 'bs-docs-sidenav']); - $("#affix").append(html); - if ($('footer').is(':visible')) { - $(".sideaffix").css("bottom", "70px"); - } - $('#affix').on('activate.bs.scrollspy', function (e) { - if (e.target) { - if ($(e.target).find('li.active').length > 0) { - return; - } - var top = $(e.target).position().top; - $(e.target).parents('li').each(function (i, e) { - top += $(e).position().top; - }); - var container = $('#affix > ul'); - var height = container.height(); - container.scrollTop(container.scrollTop() + top - height/2); - } - }) - } - - function getHierarchy() { - // supported headers are h1, h2, h3, and h4 - // The topest header is ignored - var selector = ".article article"; - var affixSelector = "#affix"; - var headers = ['h4', 'h3', 'h2', 'h1']; - var hierarchy = []; - var toppestIndex = -1; - var startIndex = -1; - // 1. get header hierarchy - for (var i = headers.length - 1; i >= 0; i--) { - var header = $(selector + " " + headers[i]); - var length = header.length; - - // If contains no header in current selector, find the next one - if (length === 0) continue; - - // If the toppest header contains only one item, e.g. title, ignore - if (length === 1 && hierarchy.length === 0 && toppestIndex < 0) { - toppestIndex = i; - continue; - } - - // Get second level children - var nextLevelSelector = i > 0 ? headers[i - 1] : null; - var prevSelector; - for (var j = length - 1; j >= 0; j--) { - var e = header[j]; - var id = e.id; - if (!id) continue; // For affix, id is a must-have - var item = { - name: htmlEncode($(e).text()), - href: "#" + id, - items: [] - }; - if (nextLevelSelector) { - var selector = '#' + id + "~" + nextLevelSelector; - var currentSelector = selector; - if (prevSelector) currentSelector += ":not(" + prevSelector + ")"; - $(header[j]).siblings(currentSelector).each(function (index, e) { - if (e.id) { - item.items.push({ - name: htmlEncode($(e).text()), // innerText decodes text while innerHTML not - href: "#" + e.id - - }) - } - }) - prevSelector = selector; - } - hierarchy.push(item); - } - break; - }; - hierarchy.reverse(); - return hierarchy; - } - - function htmlEncode(str) { - return String(str) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); - } - - function htmlDecode(value) { - return String(value) - .replace(/"/g, '"') - .replace(/'/g, "'") - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/&/g, '&'); - } - })(); - - function formList(item, classes) { - var level = 1; - var model = { - items: item - }; - var cls = [].concat(classes).join(" "); - return getList(model, cls); - - function getList(model, cls) { - if (!model || !model.items) return null; - var l = model.items.length; - if (l === 0) return null; - var html = '
    '; - level++; - for (var i = 0; i < l; i++) { - var item = model.items[i]; - var href = item.href; - var name = item.name; - if (!name) continue; - html += href ? '
  • ' + name + '' : '
  • ' + name; - html += getList(item, cls) || ''; - html += '
  • '; - } - html += '
'; - return html; - } - } - - // Show footer - (function () { - initFooter(); - $(window).on("scroll", showFooter); - - function initFooter() { - if (needFooter()) { - shiftUpBottomCss(); - $("footer").show(); - } else { - resetBottomCss(); - $("footer").hide(); - } - } - - function showFooter() { - if (needFooter()) { - shiftUpBottomCss(); - $("footer").fadeIn(); - } else { - resetBottomCss(); - $("footer").fadeOut(); - } - } - - function needFooter() { - var scrollHeight = $(document).height(); - var scrollPosition = $(window).height() + $(window).scrollTop(); - return (scrollHeight - scrollPosition) < 1; - } - - function resetBottomCss() { - $(".sidetoc").css("bottom", "0"); - $(".sideaffix").css("bottom", "10px"); - } - - function shiftUpBottomCss() { - $(".sidetoc").css("bottom", "70px"); - $(".sideaffix").css("bottom", "70px"); - } - })(); - - // For LOGO SVG - // Replace SVG with inline SVG - // http://stackoverflow.com/questions/11978995/how-to-change-color-of-svg-image-using-css-jquery-svg-image-replacement - jQuery('img.svg').each(function () { - var $img = jQuery(this); - var imgID = $img.attr('id'); - var imgClass = $img.attr('class'); - var imgURL = $img.attr('src'); - - jQuery.get(imgURL, function (data) { - // Get the SVG tag, ignore the rest - var $svg = jQuery(data).find('svg'); - - // Add replaced image's ID to the new SVG - if (typeof imgID !== 'undefined') { - $svg = $svg.attr('id', imgID); - } - // Add replaced image's classes to the new SVG - if (typeof imgClass !== 'undefined') { - $svg = $svg.attr('class', imgClass + ' replaced-svg'); - } - - // Remove any invalid XML tags as per http://validator.w3.org - $svg = $svg.removeAttr('xmlns:a'); - - // Replace image with new SVG - $img.replaceWith($svg); - - }, 'xml'); - }); -}) diff --git a/docs/styles/docfx.vendor.css b/docs/styles/docfx.vendor.css deleted file mode 100644 index b8c40352..00000000 --- a/docs/styles/docfx.vendor.css +++ /dev/null @@ -1,1466 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -.label,sub,sup{vertical-align:baseline} -hr,img{border:0} -body,figure{margin:0} -.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.dropdown-menu{float:left} -.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px} -html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%} -article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block} -audio,canvas,progress,video{display:inline-block;vertical-align:baseline} -audio:not([controls]){display:none;height:0} -[hidden],template{display:none} -a{background-color:transparent} -a:active,a:hover{outline:0} -b,optgroup,strong{font-weight:700} -dfn{font-style:italic} -h1{margin:.67em 0} -mark{color:#000;background:#ff0} -sub,sup{position:relative;font-size:75%;line-height:0} -sup{top:-.5em} -sub{bottom:-.25em} -img{vertical-align:middle} -svg:not(:root){overflow:hidden} -hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box} -pre,textarea{overflow:auto} -code,kbd,pre,samp{font-size:1em} -button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit} -.glyphicon,address{font-style:normal} -button{overflow:visible} -button,select{text-transform:none} -button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer} -button[disabled],html input[disabled]{cursor:default} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0} -input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0} -input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto} -input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none} -table{border-spacing:0;border-collapse:collapse} -td,th{padding:0} -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print{blockquote,img,pre,tr{page-break-inside:avoid} -*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important} -a,a:visited{text-decoration:underline} -a[href]:after{content:" (" attr(href) ")"} -abbr[title]:after{content:" (" attr(title) ")"} -a[href^="javascript:"]:after,a[href^="#"]:after{content:""} -blockquote,pre{border:1px solid #999} -thead{display:table-header-group} -img{max-width:100%!important} -h2,h3,p{orphans:3;widows:3} -h2,h3{page-break-after:avoid} -.navbar{display:none} -.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important} -.label{border:1px solid #000} -.table{border-collapse:collapse!important} -.table td,.table th{background-color:#fff!important} -.table-bordered td,.table-bordered th{border:1px solid #ddd!important} -} -.dropdown-menu,.modal-content{-webkit-background-clip:padding-box} -.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none} -.img-thumbnail,body{background-color:#fff} -@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')} -.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} -.glyphicon-asterisk:before{content:"\002a"} -.glyphicon-plus:before{content:"\002b"} -.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"} -.glyphicon-minus:before{content:"\2212"} -.glyphicon-cloud:before{content:"\2601"} -.glyphicon-envelope:before{content:"\2709"} -.glyphicon-pencil:before{content:"\270f"} -.glyphicon-glass:before{content:"\e001"} -.glyphicon-music:before{content:"\e002"} -.glyphicon-search:before{content:"\e003"} -.glyphicon-heart:before{content:"\e005"} -.glyphicon-star:before{content:"\e006"} -.glyphicon-star-empty:before{content:"\e007"} -.glyphicon-user:before{content:"\e008"} -.glyphicon-film:before{content:"\e009"} -.glyphicon-th-large:before{content:"\e010"} -.glyphicon-th:before{content:"\e011"} -.glyphicon-th-list:before{content:"\e012"} -.glyphicon-ok:before{content:"\e013"} -.glyphicon-remove:before{content:"\e014"} -.glyphicon-zoom-in:before{content:"\e015"} -.glyphicon-zoom-out:before{content:"\e016"} -.glyphicon-off:before{content:"\e017"} -.glyphicon-signal:before{content:"\e018"} -.glyphicon-cog:before{content:"\e019"} -.glyphicon-trash:before{content:"\e020"} -.glyphicon-home:before{content:"\e021"} -.glyphicon-file:before{content:"\e022"} -.glyphicon-time:before{content:"\e023"} -.glyphicon-road:before{content:"\e024"} -.glyphicon-download-alt:before{content:"\e025"} -.glyphicon-download:before{content:"\e026"} -.glyphicon-upload:before{content:"\e027"} -.glyphicon-inbox:before{content:"\e028"} -.glyphicon-play-circle:before{content:"\e029"} -.glyphicon-repeat:before{content:"\e030"} -.glyphicon-refresh:before{content:"\e031"} -.glyphicon-list-alt:before{content:"\e032"} -.glyphicon-lock:before{content:"\e033"} -.glyphicon-flag:before{content:"\e034"} -.glyphicon-headphones:before{content:"\e035"} -.glyphicon-volume-off:before{content:"\e036"} -.glyphicon-volume-down:before{content:"\e037"} -.glyphicon-volume-up:before{content:"\e038"} -.glyphicon-qrcode:before{content:"\e039"} -.glyphicon-barcode:before{content:"\e040"} -.glyphicon-tag:before{content:"\e041"} -.glyphicon-tags:before{content:"\e042"} -.glyphicon-book:before{content:"\e043"} -.glyphicon-bookmark:before{content:"\e044"} -.glyphicon-print:before{content:"\e045"} -.glyphicon-camera:before{content:"\e046"} -.glyphicon-font:before{content:"\e047"} -.glyphicon-bold:before{content:"\e048"} -.glyphicon-italic:before{content:"\e049"} -.glyphicon-text-height:before{content:"\e050"} -.glyphicon-text-width:before{content:"\e051"} -.glyphicon-align-left:before{content:"\e052"} -.glyphicon-align-center:before{content:"\e053"} -.glyphicon-align-right:before{content:"\e054"} -.glyphicon-align-justify:before{content:"\e055"} -.glyphicon-list:before{content:"\e056"} -.glyphicon-indent-left:before{content:"\e057"} -.glyphicon-indent-right:before{content:"\e058"} -.glyphicon-facetime-video:before{content:"\e059"} -.glyphicon-picture:before{content:"\e060"} -.glyphicon-map-marker:before{content:"\e062"} -.glyphicon-adjust:before{content:"\e063"} -.glyphicon-tint:before{content:"\e064"} -.glyphicon-edit:before{content:"\e065"} -.glyphicon-share:before{content:"\e066"} -.glyphicon-check:before{content:"\e067"} -.glyphicon-move:before{content:"\e068"} -.glyphicon-step-backward:before{content:"\e069"} -.glyphicon-fast-backward:before{content:"\e070"} -.glyphicon-backward:before{content:"\e071"} -.glyphicon-play:before{content:"\e072"} -.glyphicon-pause:before{content:"\e073"} -.glyphicon-stop:before{content:"\e074"} -.glyphicon-forward:before{content:"\e075"} -.glyphicon-fast-forward:before{content:"\e076"} -.glyphicon-step-forward:before{content:"\e077"} -.glyphicon-eject:before{content:"\e078"} -.glyphicon-chevron-left:before{content:"\e079"} -.glyphicon-chevron-right:before{content:"\e080"} -.glyphicon-plus-sign:before{content:"\e081"} -.glyphicon-minus-sign:before{content:"\e082"} -.glyphicon-remove-sign:before{content:"\e083"} -.glyphicon-ok-sign:before{content:"\e084"} -.glyphicon-question-sign:before{content:"\e085"} -.glyphicon-info-sign:before{content:"\e086"} -.glyphicon-screenshot:before{content:"\e087"} -.glyphicon-remove-circle:before{content:"\e088"} -.glyphicon-ok-circle:before{content:"\e089"} -.glyphicon-ban-circle:before{content:"\e090"} -.glyphicon-arrow-left:before{content:"\e091"} -.glyphicon-arrow-right:before{content:"\e092"} -.glyphicon-arrow-up:before{content:"\e093"} -.glyphicon-arrow-down:before{content:"\e094"} -.glyphicon-share-alt:before{content:"\e095"} -.glyphicon-resize-full:before{content:"\e096"} -.glyphicon-resize-small:before{content:"\e097"} -.glyphicon-exclamation-sign:before{content:"\e101"} -.glyphicon-gift:before{content:"\e102"} -.glyphicon-leaf:before{content:"\e103"} -.glyphicon-fire:before{content:"\e104"} -.glyphicon-eye-open:before{content:"\e105"} -.glyphicon-eye-close:before{content:"\e106"} -.glyphicon-warning-sign:before{content:"\e107"} -.glyphicon-plane:before{content:"\e108"} -.glyphicon-calendar:before{content:"\e109"} -.glyphicon-random:before{content:"\e110"} -.glyphicon-comment:before{content:"\e111"} -.glyphicon-magnet:before{content:"\e112"} -.glyphicon-chevron-up:before{content:"\e113"} -.glyphicon-chevron-down:before{content:"\e114"} -.glyphicon-retweet:before{content:"\e115"} -.glyphicon-shopping-cart:before{content:"\e116"} -.glyphicon-folder-close:before{content:"\e117"} -.glyphicon-folder-open:before{content:"\e118"} -.glyphicon-resize-vertical:before{content:"\e119"} -.glyphicon-resize-horizontal:before{content:"\e120"} -.glyphicon-hdd:before{content:"\e121"} -.glyphicon-bullhorn:before{content:"\e122"} -.glyphicon-bell:before{content:"\e123"} -.glyphicon-certificate:before{content:"\e124"} -.glyphicon-thumbs-up:before{content:"\e125"} -.glyphicon-thumbs-down:before{content:"\e126"} -.glyphicon-hand-right:before{content:"\e127"} -.glyphicon-hand-left:before{content:"\e128"} -.glyphicon-hand-up:before{content:"\e129"} -.glyphicon-hand-down:before{content:"\e130"} -.glyphicon-circle-arrow-right:before{content:"\e131"} -.glyphicon-circle-arrow-left:before{content:"\e132"} -.glyphicon-circle-arrow-up:before{content:"\e133"} -.glyphicon-circle-arrow-down:before{content:"\e134"} -.glyphicon-globe:before{content:"\e135"} -.glyphicon-wrench:before{content:"\e136"} -.glyphicon-tasks:before{content:"\e137"} -.glyphicon-filter:before{content:"\e138"} -.glyphicon-briefcase:before{content:"\e139"} -.glyphicon-fullscreen:before{content:"\e140"} -.glyphicon-dashboard:before{content:"\e141"} -.glyphicon-paperclip:before{content:"\e142"} -.glyphicon-heart-empty:before{content:"\e143"} -.glyphicon-link:before{content:"\e144"} -.glyphicon-phone:before{content:"\e145"} -.glyphicon-pushpin:before{content:"\e146"} -.glyphicon-usd:before{content:"\e148"} -.glyphicon-gbp:before{content:"\e149"} -.glyphicon-sort:before{content:"\e150"} -.glyphicon-sort-by-alphabet:before{content:"\e151"} -.glyphicon-sort-by-alphabet-alt:before{content:"\e152"} -.glyphicon-sort-by-order:before{content:"\e153"} -.glyphicon-sort-by-order-alt:before{content:"\e154"} -.glyphicon-sort-by-attributes:before{content:"\e155"} -.glyphicon-sort-by-attributes-alt:before{content:"\e156"} -.glyphicon-unchecked:before{content:"\e157"} -.glyphicon-expand:before{content:"\e158"} -.glyphicon-collapse-down:before{content:"\e159"} -.glyphicon-collapse-up:before{content:"\e160"} -.glyphicon-log-in:before{content:"\e161"} -.glyphicon-flash:before{content:"\e162"} -.glyphicon-log-out:before{content:"\e163"} -.glyphicon-new-window:before{content:"\e164"} -.glyphicon-record:before{content:"\e165"} -.glyphicon-save:before{content:"\e166"} -.glyphicon-open:before{content:"\e167"} -.glyphicon-saved:before{content:"\e168"} -.glyphicon-import:before{content:"\e169"} -.glyphicon-export:before{content:"\e170"} -.glyphicon-send:before{content:"\e171"} -.glyphicon-floppy-disk:before{content:"\e172"} -.glyphicon-floppy-saved:before{content:"\e173"} -.glyphicon-floppy-remove:before{content:"\e174"} -.glyphicon-floppy-save:before{content:"\e175"} -.glyphicon-floppy-open:before{content:"\e176"} -.glyphicon-credit-card:before{content:"\e177"} -.glyphicon-transfer:before{content:"\e178"} -.glyphicon-cutlery:before{content:"\e179"} -.glyphicon-header:before{content:"\e180"} -.glyphicon-compressed:before{content:"\e181"} -.glyphicon-earphone:before{content:"\e182"} -.glyphicon-phone-alt:before{content:"\e183"} -.glyphicon-tower:before{content:"\e184"} -.glyphicon-stats:before{content:"\e185"} -.glyphicon-sd-video:before{content:"\e186"} -.glyphicon-hd-video:before{content:"\e187"} -.glyphicon-subtitles:before{content:"\e188"} -.glyphicon-sound-stereo:before{content:"\e189"} -.glyphicon-sound-dolby:before{content:"\e190"} -.glyphicon-sound-5-1:before{content:"\e191"} -.glyphicon-sound-6-1:before{content:"\e192"} -.glyphicon-sound-7-1:before{content:"\e193"} -.glyphicon-copyright-mark:before{content:"\e194"} -.glyphicon-registration-mark:before{content:"\e195"} -.glyphicon-cloud-download:before{content:"\e197"} -.glyphicon-cloud-upload:before{content:"\e198"} -.glyphicon-tree-conifer:before{content:"\e199"} -.glyphicon-tree-deciduous:before{content:"\e200"} -.glyphicon-cd:before{content:"\e201"} -.glyphicon-save-file:before{content:"\e202"} -.glyphicon-open-file:before{content:"\e203"} -.glyphicon-level-up:before{content:"\e204"} -.glyphicon-copy:before{content:"\e205"} -.glyphicon-paste:before{content:"\e206"} -.glyphicon-alert:before{content:"\e209"} -.glyphicon-equalizer:before{content:"\e210"} -.glyphicon-king:before{content:"\e211"} -.glyphicon-queen:before{content:"\e212"} -.glyphicon-pawn:before{content:"\e213"} -.glyphicon-bishop:before{content:"\e214"} -.glyphicon-knight:before{content:"\e215"} -.glyphicon-baby-formula:before{content:"\e216"} -.glyphicon-tent:before{content:"\26fa"} -.glyphicon-blackboard:before{content:"\e218"} -.glyphicon-bed:before{content:"\e219"} -.glyphicon-apple:before{content:"\f8ff"} -.glyphicon-erase:before{content:"\e221"} -.glyphicon-hourglass:before{content:"\231b"} -.glyphicon-lamp:before{content:"\e223"} -.glyphicon-duplicate:before{content:"\e224"} -.glyphicon-piggy-bank:before{content:"\e225"} -.glyphicon-scissors:before{content:"\e226"} -.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"} -.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"} -.glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"} -.glyphicon-scale:before{content:"\e230"} -.glyphicon-ice-lolly:before{content:"\e231"} -.glyphicon-ice-lolly-tasted:before{content:"\e232"} -.glyphicon-education:before{content:"\e233"} -.glyphicon-option-horizontal:before{content:"\e234"} -.glyphicon-option-vertical:before{content:"\e235"} -.glyphicon-menu-hamburger:before{content:"\e236"} -.glyphicon-modal-window:before{content:"\e237"} -.glyphicon-oil:before{content:"\e238"} -.glyphicon-grain:before{content:"\e239"} -.glyphicon-sunglasses:before{content:"\e240"} -.glyphicon-text-size:before{content:"\e241"} -.glyphicon-text-color:before{content:"\e242"} -.glyphicon-text-background:before{content:"\e243"} -.glyphicon-object-align-top:before{content:"\e244"} -.glyphicon-object-align-bottom:before{content:"\e245"} -.glyphicon-object-align-horizontal:before{content:"\e246"} -.glyphicon-object-align-left:before{content:"\e247"} -.glyphicon-object-align-vertical:before{content:"\e248"} -.glyphicon-object-align-right:before{content:"\e249"} -.glyphicon-triangle-right:before{content:"\e250"} -.glyphicon-triangle-left:before{content:"\e251"} -.glyphicon-triangle-bottom:before{content:"\e252"} -.glyphicon-triangle-top:before{content:"\e253"} -.glyphicon-console:before{content:"\e254"} -.glyphicon-superscript:before{content:"\e255"} -.glyphicon-subscript:before{content:"\e256"} -.glyphicon-menu-left:before{content:"\e257"} -.glyphicon-menu-right:before{content:"\e258"} -.glyphicon-menu-down:before{content:"\e259"} -.glyphicon-menu-up:before{content:"\e260"} -*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} -html{font-size:10px;-webkit-tap-highlight-color:transparent} -body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333} -button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit} -a{color:#337ab7;text-decoration:none} -a:focus,a:hover{color:#23527c;text-decoration:underline} -a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px} -.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto} -.img-rounded{border-radius:6px} -.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out} -.img-circle{border-radius:50%} -hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee} -.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0} -.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} -[role=button]{cursor:pointer} -.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit} -.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777} -.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px} -.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%} -.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px} -.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%} -.h1,h1{font-size:36px} -.h2,h2{font-size:30px} -.h3,h3{font-size:24px} -.h4,h4{font-size:18px} -.h5,h5{font-size:14px} -.h6,h6{font-size:12px} -p{margin:0 0 10px} -.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4} -dt,kbd kbd,label{font-weight:700} -address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143} -@media (min-width:768px){.lead{font-size:21px} -} -.small,small{font-size:85%} -.mark,mark{padding:.2em;background-color:#fcf8e3} -.list-inline,.list-unstyled{padding-left:0;list-style:none} -.text-left{text-align:left} -.text-right{text-align:right} -.text-center{text-align:center} -.text-justify{text-align:justify} -.text-nowrap{white-space:nowrap} -.text-lowercase{text-transform:lowercase} -.text-uppercase{text-transform:uppercase} -.text-capitalize{text-transform:capitalize} -.text-muted{color:#777} -.text-primary{color:#337ab7} -a.text-primary:focus,a.text-primary:hover{color:#286090} -.text-success{color:#3c763d} -a.text-success:focus,a.text-success:hover{color:#2b542c} -.text-info{color:#31708f} -a.text-info:focus,a.text-info:hover{color:#245269} -.text-warning{color:#8a6d3b} -a.text-warning:focus,a.text-warning:hover{color:#66512c} -.text-danger{color:#a94442} -a.text-danger:focus,a.text-danger:hover{color:#843534} -.bg-primary{color:#fff;background-color:#337ab7} -a.bg-primary:focus,a.bg-primary:hover{background-color:#286090} -.bg-success{background-color:#dff0d8} -a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3} -.bg-info{background-color:#d9edf7} -a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee} -.bg-warning{background-color:#fcf8e3} -a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5} -.bg-danger{background-color:#f2dede} -a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9} -pre code,table{background-color:transparent} -.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee} -dl,ol,ul{margin-top:0} -blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0} -address,dl{margin-bottom:20px} -ol,ul{margin-bottom:10px} -.list-inline{margin-left:-5px} -.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px} -dd{margin-left:0} -@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap} -.dl-horizontal dd{margin-left:180px} -.container{width:750px} -} -abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777} -.initialism{font-size:90%;text-transform:uppercase} -blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee} -blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777} -legend,pre{display:block;color:#333} -blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'} -.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0} -code,kbd{padding:2px 4px;font-size:90%} -caption,th{text-align:left} -.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''} -.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'} -code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace} -code{color:#c7254e;background-color:#f9f2f4;border-radius:4px} -kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)} -kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none} -pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px} -.container,.container-fluid{margin-right:auto;margin-left:auto} -pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0} -.container,.container-fluid{padding-right:15px;padding-left:15px} -.pre-scrollable{overflow-y:scroll} -@media (min-width:992px){.container{width:970px} -} -@media (min-width:1200px){.container{width:1170px} -} -.row{margin-right:-15px;margin-left:-15px} -.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px} -.col-xs-12{width:100%} -.col-xs-11{width:91.66666667%} -.col-xs-10{width:83.33333333%} -.col-xs-9{width:75%} -.col-xs-8{width:66.66666667%} -.col-xs-7{width:58.33333333%} -.col-xs-6{width:50%} -.col-xs-5{width:41.66666667%} -.col-xs-4{width:33.33333333%} -.col-xs-3{width:25%} -.col-xs-2{width:16.66666667%} -.col-xs-1{width:8.33333333%} -.col-xs-pull-12{right:100%} -.col-xs-pull-11{right:91.66666667%} -.col-xs-pull-10{right:83.33333333%} -.col-xs-pull-9{right:75%} -.col-xs-pull-8{right:66.66666667%} -.col-xs-pull-7{right:58.33333333%} -.col-xs-pull-6{right:50%} -.col-xs-pull-5{right:41.66666667%} -.col-xs-pull-4{right:33.33333333%} -.col-xs-pull-3{right:25%} -.col-xs-pull-2{right:16.66666667%} -.col-xs-pull-1{right:8.33333333%} -.col-xs-pull-0{right:auto} -.col-xs-push-12{left:100%} -.col-xs-push-11{left:91.66666667%} -.col-xs-push-10{left:83.33333333%} -.col-xs-push-9{left:75%} -.col-xs-push-8{left:66.66666667%} -.col-xs-push-7{left:58.33333333%} -.col-xs-push-6{left:50%} -.col-xs-push-5{left:41.66666667%} -.col-xs-push-4{left:33.33333333%} -.col-xs-push-3{left:25%} -.col-xs-push-2{left:16.66666667%} -.col-xs-push-1{left:8.33333333%} -.col-xs-push-0{left:auto} -.col-xs-offset-12{margin-left:100%} -.col-xs-offset-11{margin-left:91.66666667%} -.col-xs-offset-10{margin-left:83.33333333%} -.col-xs-offset-9{margin-left:75%} -.col-xs-offset-8{margin-left:66.66666667%} -.col-xs-offset-7{margin-left:58.33333333%} -.col-xs-offset-6{margin-left:50%} -.col-xs-offset-5{margin-left:41.66666667%} -.col-xs-offset-4{margin-left:33.33333333%} -.col-xs-offset-3{margin-left:25%} -.col-xs-offset-2{margin-left:16.66666667%} -.col-xs-offset-1{margin-left:8.33333333%} -.col-xs-offset-0{margin-left:0} -@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left} -.col-sm-12{width:100%} -.col-sm-11{width:91.66666667%} -.col-sm-10{width:83.33333333%} -.col-sm-9{width:75%} -.col-sm-8{width:66.66666667%} -.col-sm-7{width:58.33333333%} -.col-sm-6{width:50%} -.col-sm-5{width:41.66666667%} -.col-sm-4{width:33.33333333%} -.col-sm-3{width:25%} -.col-sm-2{width:16.66666667%} -.col-sm-1{width:8.33333333%} -.col-sm-pull-12{right:100%} -.col-sm-pull-11{right:91.66666667%} -.col-sm-pull-10{right:83.33333333%} -.col-sm-pull-9{right:75%} -.col-sm-pull-8{right:66.66666667%} -.col-sm-pull-7{right:58.33333333%} -.col-sm-pull-6{right:50%} -.col-sm-pull-5{right:41.66666667%} -.col-sm-pull-4{right:33.33333333%} -.col-sm-pull-3{right:25%} -.col-sm-pull-2{right:16.66666667%} -.col-sm-pull-1{right:8.33333333%} -.col-sm-pull-0{right:auto} -.col-sm-push-12{left:100%} -.col-sm-push-11{left:91.66666667%} -.col-sm-push-10{left:83.33333333%} -.col-sm-push-9{left:75%} -.col-sm-push-8{left:66.66666667%} -.col-sm-push-7{left:58.33333333%} -.col-sm-push-6{left:50%} -.col-sm-push-5{left:41.66666667%} -.col-sm-push-4{left:33.33333333%} -.col-sm-push-3{left:25%} -.col-sm-push-2{left:16.66666667%} -.col-sm-push-1{left:8.33333333%} -.col-sm-push-0{left:auto} -.col-sm-offset-12{margin-left:100%} -.col-sm-offset-11{margin-left:91.66666667%} -.col-sm-offset-10{margin-left:83.33333333%} -.col-sm-offset-9{margin-left:75%} -.col-sm-offset-8{margin-left:66.66666667%} -.col-sm-offset-7{margin-left:58.33333333%} -.col-sm-offset-6{margin-left:50%} -.col-sm-offset-5{margin-left:41.66666667%} -.col-sm-offset-4{margin-left:33.33333333%} -.col-sm-offset-3{margin-left:25%} -.col-sm-offset-2{margin-left:16.66666667%} -.col-sm-offset-1{margin-left:8.33333333%} -.col-sm-offset-0{margin-left:0} -} -@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left} -.col-md-12{width:100%} -.col-md-11{width:91.66666667%} -.col-md-10{width:83.33333333%} -.col-md-9{width:75%} -.col-md-8{width:66.66666667%} -.col-md-7{width:58.33333333%} -.col-md-6{width:50%} -.col-md-5{width:41.66666667%} -.col-md-4{width:33.33333333%} -.col-md-3{width:25%} -.col-md-2{width:16.66666667%} -.col-md-1{width:8.33333333%} -.col-md-pull-12{right:100%} -.col-md-pull-11{right:91.66666667%} -.col-md-pull-10{right:83.33333333%} -.col-md-pull-9{right:75%} -.col-md-pull-8{right:66.66666667%} -.col-md-pull-7{right:58.33333333%} -.col-md-pull-6{right:50%} -.col-md-pull-5{right:41.66666667%} -.col-md-pull-4{right:33.33333333%} -.col-md-pull-3{right:25%} -.col-md-pull-2{right:16.66666667%} -.col-md-pull-1{right:8.33333333%} -.col-md-pull-0{right:auto} -.col-md-push-12{left:100%} -.col-md-push-11{left:91.66666667%} -.col-md-push-10{left:83.33333333%} -.col-md-push-9{left:75%} -.col-md-push-8{left:66.66666667%} -.col-md-push-7{left:58.33333333%} -.col-md-push-6{left:50%} -.col-md-push-5{left:41.66666667%} -.col-md-push-4{left:33.33333333%} -.col-md-push-3{left:25%} -.col-md-push-2{left:16.66666667%} -.col-md-push-1{left:8.33333333%} -.col-md-push-0{left:auto} -.col-md-offset-12{margin-left:100%} -.col-md-offset-11{margin-left:91.66666667%} -.col-md-offset-10{margin-left:83.33333333%} -.col-md-offset-9{margin-left:75%} -.col-md-offset-8{margin-left:66.66666667%} -.col-md-offset-7{margin-left:58.33333333%} -.col-md-offset-6{margin-left:50%} -.col-md-offset-5{margin-left:41.66666667%} -.col-md-offset-4{margin-left:33.33333333%} -.col-md-offset-3{margin-left:25%} -.col-md-offset-2{margin-left:16.66666667%} -.col-md-offset-1{margin-left:8.33333333%} -.col-md-offset-0{margin-left:0} -} -@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left} -.col-lg-12{width:100%} -.col-lg-11{width:91.66666667%} -.col-lg-10{width:83.33333333%} -.col-lg-9{width:75%} -.col-lg-8{width:66.66666667%} -.col-lg-7{width:58.33333333%} -.col-lg-6{width:50%} -.col-lg-5{width:41.66666667%} -.col-lg-4{width:33.33333333%} -.col-lg-3{width:25%} -.col-lg-2{width:16.66666667%} -.col-lg-1{width:8.33333333%} -.col-lg-pull-12{right:100%} -.col-lg-pull-11{right:91.66666667%} -.col-lg-pull-10{right:83.33333333%} -.col-lg-pull-9{right:75%} -.col-lg-pull-8{right:66.66666667%} -.col-lg-pull-7{right:58.33333333%} -.col-lg-pull-6{right:50%} -.col-lg-pull-5{right:41.66666667%} -.col-lg-pull-4{right:33.33333333%} -.col-lg-pull-3{right:25%} -.col-lg-pull-2{right:16.66666667%} -.col-lg-pull-1{right:8.33333333%} -.col-lg-pull-0{right:auto} -.col-lg-push-12{left:100%} -.col-lg-push-11{left:91.66666667%} -.col-lg-push-10{left:83.33333333%} -.col-lg-push-9{left:75%} -.col-lg-push-8{left:66.66666667%} -.col-lg-push-7{left:58.33333333%} -.col-lg-push-6{left:50%} -.col-lg-push-5{left:41.66666667%} -.col-lg-push-4{left:33.33333333%} -.col-lg-push-3{left:25%} -.col-lg-push-2{left:16.66666667%} -.col-lg-push-1{left:8.33333333%} -.col-lg-push-0{left:auto} -.col-lg-offset-12{margin-left:100%} -.col-lg-offset-11{margin-left:91.66666667%} -.col-lg-offset-10{margin-left:83.33333333%} -.col-lg-offset-9{margin-left:75%} -.col-lg-offset-8{margin-left:66.66666667%} -.col-lg-offset-7{margin-left:58.33333333%} -.col-lg-offset-6{margin-left:50%} -.col-lg-offset-5{margin-left:41.66666667%} -.col-lg-offset-4{margin-left:33.33333333%} -.col-lg-offset-3{margin-left:25%} -.col-lg-offset-2{margin-left:16.66666667%} -.col-lg-offset-1{margin-left:8.33333333%} -.col-lg-offset-0{margin-left:0} -} -caption{padding-top:8px;padding-bottom:8px;color:#777} -.table{width:100%;max-width:100%;margin-bottom:20px} -.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd} -.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd} -.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0} -.table>tbody+tbody{border-top:2px solid #ddd} -.table .table{background-color:#fff} -.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px} -.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd} -.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px} -.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9} -.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5} -table col[class*=col-]{position:static;display:table-column;float:none} -table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none} -.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8} -.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8} -.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6} -.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7} -.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3} -.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3} -.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc} -.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede} -.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc} -.table-responsive{min-height:.01%;overflow-x:auto} -@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd} -.table-responsive>.table{margin-bottom:0} -.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap} -.table-responsive>.table-bordered{border:0} -.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0} -.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0} -.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0} -} -fieldset,legend{padding:0;border:0} -fieldset{min-width:0;margin:0} -legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5} -label{display:inline-block;max-width:100%;margin-bottom:5px} -input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none} -input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal} -.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block} -input[type=file]{display:block} -input[type=range]{display:block;width:100%} -select[multiple],select[size]{height:auto} -input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px} -output{padding-top:7px} -.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s} -.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)} -.form-control::-moz-placeholder{color:#999;opacity:1} -.form-control:-ms-input-placeholder{color:#999} -.form-control::-webkit-input-placeholder{color:#999} -.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d} -.form-control::-ms-expand{background-color:transparent;border:0} -.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1} -.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed} -textarea.form-control{height:auto} -@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px} -.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px} -.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px} -} -.form-group{margin-bottom:15px} -.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px} -.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer} -.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px} -.checkbox+.checkbox,.radio+.radio{margin-top:-5px} -.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer} -.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px} -.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed} -.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0} -.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0} -.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px} -.input-sm{height:30px;line-height:1.5} -select.input-sm{height:30px;line-height:30px} -select[multiple].input-sm,textarea.input-sm{height:auto} -.form-group-sm .form-control{height:30px;line-height:1.5} -.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px} -.form-group-sm select.form-control{height:30px;line-height:30px} -.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto} -.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5} -.input-lg{height:46px;line-height:1.3333333} -select.input-lg{height:46px;line-height:46px} -select[multiple].input-lg,textarea.input-lg{height:auto} -.form-group-lg .form-control{height:46px;line-height:1.3333333} -.form-group-lg select.form-control{height:46px;line-height:46px} -.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto} -.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333} -.has-feedback{position:relative} -.has-feedback .form-control{padding-right:42.5px} -.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none} -.collapsing,.dropdown,.dropup{position:relative} -.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px} -.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px} -.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} -.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168} -.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d} -.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b} -.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} -.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b} -.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b} -.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442} -.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} -.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483} -.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442} -.has-feedback label~.form-control-feedback{top:25px} -.has-feedback label.sr-only~.form-control-feedback{top:0} -.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373} -@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block} -.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle} -.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle} -.form-inline .input-group{display:inline-table;vertical-align:middle} -.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto} -.form-inline .input-group>.form-control{width:100%} -.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle} -.form-inline .checkbox label,.form-inline .radio label{padding-left:0} -.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0} -.form-inline .has-feedback .form-control-feedback{top:0} -.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right} -} -.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0} -.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px} -.form-horizontal .form-group{margin-right:-15px;margin-left:-15px} -.form-horizontal .has-feedback .form-control-feedback{right:15px} -@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px} -.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px} -} -.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px} -.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px} -.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none} -.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} -.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65} -a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none} -.btn-default{color:#333;background-color:#fff;border-color:#ccc} -.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c} -.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad} -.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c} -.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc} -.btn-default .badge{color:#fff;background-color:#333} -.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4} -.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40} -.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74} -.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40} -.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4} -.btn-primary .badge{color:#337ab7;background-color:#fff} -.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c} -.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625} -.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439} -.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625} -.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none} -.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c} -.btn-success .badge{color:#5cb85c;background-color:#fff} -.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da} -.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85} -.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc} -.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85} -.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da} -.btn-info .badge{color:#5bc0de;background-color:#fff} -.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236} -.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d} -.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512} -.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d} -.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236} -.btn-warning .badge{color:#f0ad4e;background-color:#fff} -.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a} -.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19} -.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925} -.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19} -.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a} -.btn-danger .badge{color:#d9534f;background-color:#fff} -.btn-link{font-weight:400;color:#337ab7;border-radius:0} -.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none} -.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent} -.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent} -.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none} -.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} -.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} -.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px} -.btn-block{display:block;width:100%} -.btn-block+.btn-block{margin-top:5px} -input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%} -.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear} -.fade.in{opacity:1} -.collapse{display:none} -.collapse.in{display:block} -tr.collapse.in{display:table-row} -tbody.collapse.in{display:table-row-group} -.collapsing{height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility} -.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent} -.dropdown-toggle:focus{outline:0} -.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)} -.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto} -.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap} -.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0} -.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0} -.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0} -.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} -.dropdown-menu>li>a{clear:both;font-weight:400;color:#333} -.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5} -.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0} -.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777} -.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)} -.open>.dropdown-menu{display:block} -.open>a{outline:0} -.dropdown-menu-left{right:auto;left:0} -.dropdown-header{font-size:12px;color:#777} -.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990} -.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto} -.pull-right>.dropdown-menu{right:0;left:auto} -.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9} -.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px} -@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto} -.navbar-right .dropdown-menu-left{right:auto;left:0} -} -.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle} -.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left} -.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2} -.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px} -.btn-toolbar{margin-left:-5px} -.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px} -.btn .caret,.btn-group>.btn:first-child{margin-left:0} -.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0} -.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px} -.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px} -.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} -.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none} -.btn-lg .caret{border-width:5px 5px 0} -.dropup .btn-lg .caret{border-width:0 5px 5px} -.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%} -.btn-group-vertical>.btn-group>.btn{float:none} -.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0} -.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:4px 4px 0 0} -.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px} -.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0} -.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0} -.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0} -.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate} -.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%} -.btn-group-justified>.btn-group .btn{width:100%} -.btn-group-justified>.btn-group .dropdown-menu{left:auto} -[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none} -.input-group{position:relative;display:table;border-collapse:separate} -.input-group[class*=col-]{float:none;padding-right:0;padding-left:0} -.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0} -.input-group .form-control:focus{z-index:3} -.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} -select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px} -select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto} -.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} -select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px} -select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto} -.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell} -.nav>li,.nav>li>a{display:block;position:relative} -.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0} -.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle} -.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px} -.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px} -.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px} -.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0} -.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0} -.input-group-addon:first-child{border-right:0} -.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0} -.input-group-addon:last-child{border-left:0} -.input-group-btn{position:relative;font-size:0;white-space:nowrap} -.input-group-btn>.btn{position:relative} -.input-group-btn>.btn+.btn{margin-left:-1px} -.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2} -.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px} -.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px} -.nav{padding-left:0;margin-bottom:0;list-style:none} -.nav>li>a{padding:10px 15px} -.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee} -.nav>li.disabled>a{color:#777} -.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent} -.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7} -.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} -.nav>li>a>img{max-width:none} -.nav-tabs{border-bottom:1px solid #ddd} -.nav-tabs>li{float:left;margin-bottom:-1px} -.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0} -.nav-tabs>li>a:hover{border-color:#eee #eee #ddd} -.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent} -.nav-tabs.nav-justified{width:100%;border-bottom:0} -.nav-tabs.nav-justified>li{float:none} -.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px} -.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd} -@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%} -.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0} -.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff} -} -.nav-pills>li{float:left} -.nav-justified>li,.nav-stacked>li{float:none} -.nav-pills>li>a{border-radius:4px} -.nav-pills>li+li{margin-left:2px} -.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7} -.nav-stacked>li+li{margin-top:2px;margin-left:0} -.nav-justified{width:100%} -.nav-justified>li>a{margin-bottom:5px;text-align:center} -.nav-tabs-justified{border-bottom:0} -.nav-tabs-justified>li>a{margin-right:0;border-radius:4px} -.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd} -@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%} -.nav-justified>li>a{margin-bottom:0} -.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0} -.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff} -} -.tab-content>.tab-pane{display:none} -.tab-content>.active{display:block} -.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0} -.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent} -.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)} -.navbar-collapse.in{overflow-y:auto} -@media (min-width:768px){.navbar{border-radius:4px} -.navbar-header{float:left} -.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none} -.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important} -.navbar-collapse.in{overflow-y:visible} -.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0} -} -.embed-responsive,.modal,.modal-open,.progress{overflow:hidden} -@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px} -} -.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px} -.navbar-static-top{z-index:1000;border-width:0 0 1px} -.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030} -.navbar-fixed-top{top:0;border-width:0 0 1px} -.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0} -.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px} -.navbar-brand:focus,.navbar-brand:hover{text-decoration:none} -.navbar-brand>img{display:block} -@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0} -.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0} -.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px} -} -.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px} -.navbar-toggle:focus{outline:0} -.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px} -.navbar-toggle .icon-bar+.icon-bar{margin-top:4px} -.navbar-nav{margin:7.5px -15px} -.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px} -@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none} -.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px} -.navbar-nav .open .dropdown-menu>li>a{line-height:20px} -.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none} -} -.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} -@media (min-width:768px){.navbar-toggle{display:none} -.navbar-nav{float:left;margin:0} -.navbar-nav>li{float:left} -.navbar-nav>li>a{padding-top:15px;padding-bottom:15px} -} -.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px} -@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block} -.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle} -.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle} -.navbar-form .input-group{display:inline-table;vertical-align:middle} -.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto} -.navbar-form .input-group>.form-control{width:100%} -.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle} -.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0} -.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0} -.navbar-form .has-feedback .form-control-feedback{top:0} -.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none} -} -.breadcrumb>li,.pagination{display:inline-block} -.btn .badge,.btn .label{top:-1px;position:relative} -@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px} -.navbar-form .form-group:last-child{margin-bottom:0} -} -.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0} -.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0} -.navbar-btn{margin-top:8px;margin-bottom:8px} -.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px} -.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px} -.navbar-text{margin-top:15px;margin-bottom:15px} -@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px} -.navbar-left{float:left!important} -.navbar-right{float:right!important;margin-right:-15px} -.navbar-right~.navbar-right{margin-right:0} -} -.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7} -.navbar-default .navbar-brand{color:#777} -.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent} -.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777} -.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent} -.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7} -.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent} -.navbar-default .navbar-toggle{border-color:#ddd} -.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd} -.navbar-default .navbar-toggle .icon-bar{background-color:#888} -.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7} -.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7} -@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777} -.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent} -.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7} -.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent} -} -.navbar-default .navbar-link{color:#777} -.navbar-default .navbar-link:hover{color:#333} -.navbar-default .btn-link{color:#777} -.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333} -.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc} -.navbar-inverse{background-color:#222;border-color:#080808} -.navbar-inverse .navbar-brand{color:#9d9d9d} -.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent} -.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d} -.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent} -.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808} -.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent} -.navbar-inverse .navbar-toggle{border-color:#333} -.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333} -.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff} -.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010} -.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808} -@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808} -.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808} -.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d} -.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent} -.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808} -.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent} -} -.navbar-inverse .navbar-link{color:#9d9d9d} -.navbar-inverse .navbar-link:hover{color:#fff} -.navbar-inverse .btn-link{color:#9d9d9d} -.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff} -.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444} -.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px} -.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"} -.breadcrumb>.active{color:#777} -.pagination{padding-left:0;margin:20px 0;border-radius:4px} -.pager li,.pagination>li{display:inline} -.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd} -.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px} -.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px} -.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd} -.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7} -.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd} -.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333} -.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px} -.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px} -.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5} -.badge,.label{font-weight:700;line-height:1;white-space:nowrap;text-align:center} -.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px} -.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px} -.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none} -.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px} -.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee} -.pager .next>a,.pager .next>span{float:right} -.pager .previous>a,.pager .previous>span{float:left} -.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff} -a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none} -.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em} -.label:empty{display:none} -.label-default{background-color:#777} -.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e} -.label-primary{background-color:#337ab7} -.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090} -.label-success{background-color:#5cb85c} -.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44} -.label-info{background-color:#5bc0de} -.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5} -.label-warning{background-color:#f0ad4e} -.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f} -.label-danger{background-color:#d9534f} -.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c} -.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px} -.badge:empty{display:none} -.media-object,.thumbnail{display:block} -.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px} -.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff} -.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit} -.list-group-item>.badge{float:right} -.list-group-item>.badge+.badge{margin-right:5px} -.nav-pills>li>a>.badge{margin-left:3px} -.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee} -.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200} -.alert,.thumbnail{margin-bottom:20px} -.alert .alert-link,.close{font-weight:700} -.jumbotron>hr{border-top-color:#d5d5d5} -.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px} -.jumbotron .container{max-width:100%} -@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px} -.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px} -.jumbotron .h1,.jumbotron h1{font-size:63px} -} -.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out} -.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto} -a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7} -.thumbnail .caption{padding:9px;color:#333} -.alert{padding:15px;border:1px solid transparent;border-radius:4px} -.alert h4{margin-top:0;color:inherit} -.alert>p,.alert>ul{margin-bottom:0} -.alert>p+p{margin-top:5px} -.alert-dismissable,.alert-dismissible{padding-right:35px} -.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit} -.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0} -.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6} -.alert-success hr{border-top-color:#c9e2b3} -.alert-success .alert-link{color:#2b542c} -.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1} -.alert-info hr{border-top-color:#a6e1ec} -.alert-info .alert-link{color:#245269} -.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc} -.alert-warning hr{border-top-color:#f7e1b5} -.alert-warning .alert-link{color:#66512c} -.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1} -.alert-danger hr{border-top-color:#e4b9c0} -.alert-danger .alert-link{color:#843534} -@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0} -to{background-position:0 0} -} -@-o-keyframes progress-bar-stripes{from{background-position:40px 0} -to{background-position:0 0} -} -@keyframes progress-bar-stripes{from{background-position:40px 0} -to{background-position:0 0} -} -.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)} -.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease} -.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px} -.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite} -.progress-bar-success{background-color:#5cb85c} -.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} -.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} -.progress-bar-info{background-color:#5bc0de} -.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} -.progress-bar-warning{background-color:#f0ad4e} -.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} -.progress-bar-danger{background-color:#d9534f} -.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} -.media{margin-top:15px} -.media:first-child{margin-top:0} -.media,.media-body{overflow:hidden;zoom:1} -.media-body{width:10000px} -.media-object.img-thumbnail{max-width:none} -.media-right,.media>.pull-right{padding-left:10px} -.media-left,.media>.pull-left{padding-right:10px} -.media-body,.media-left,.media-right{display:table-cell;vertical-align:top} -.media-middle{vertical-align:middle} -.media-bottom{vertical-align:bottom} -.media-heading{margin-top:0;margin-bottom:5px} -.media-list{padding-left:0;list-style:none} -.list-group{padding-left:0;margin-bottom:20px} -.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd} -.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px} -.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} -a.list-group-item,button.list-group-item{color:#555} -a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333} -a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5} -button.list-group-item{width:100%;text-align:left} -.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee} -.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit} -.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777} -.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7} -.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit} -.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef} -.list-group-item-success{color:#3c763d;background-color:#dff0d8} -a.list-group-item-success,button.list-group-item-success{color:#3c763d} -a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit} -a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6} -a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d} -.list-group-item-info{color:#31708f;background-color:#d9edf7} -a.list-group-item-info,button.list-group-item-info{color:#31708f} -a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit} -a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3} -a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f} -.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3} -a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b} -a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit} -a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc} -a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b} -.list-group-item-danger{color:#a94442;background-color:#f2dede} -a.list-group-item-danger,button.list-group-item-danger{color:#a94442} -a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit} -a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc} -a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442} -.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit} -.list-group-item-heading{margin-top:0;margin-bottom:5px} -.list-group-item-text{margin-bottom:0;line-height:1.3} -.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)} -.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0} -.panel-body{padding:15px} -.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px} -.panel-title{margin-top:0;font-size:16px} -.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px} -.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0} -.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0} -.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px} -.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px} -.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0} -.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0} -.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px} -.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px} -.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px} -.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px} -.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px} -.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px} -.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px} -.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd} -.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0} -.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0} -.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0} -.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0} -.panel>.table-responsive{margin-bottom:0;border:0} -.panel-group{margin-bottom:20px} -.panel-group .panel{margin-bottom:0;border-radius:4px} -.panel-group .panel+.panel{margin-top:5px} -.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd} -.panel-group .panel-footer{border-top:0} -.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd} -.panel-default{border-color:#ddd} -.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd} -.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd} -.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333} -.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd} -.panel-primary{border-color:#337ab7} -.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7} -.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7} -.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff} -.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7} -.panel-success{border-color:#d6e9c6} -.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6} -.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6} -.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d} -.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6} -.panel-info{border-color:#bce8f1} -.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1} -.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1} -.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f} -.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1} -.panel-warning{border-color:#faebcc} -.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc} -.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc} -.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b} -.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc} -.panel-danger{border-color:#ebccd1} -.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1} -.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1} -.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442} -.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1} -.embed-responsive{position:relative;display:block;height:0;padding:0} -.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0} -.embed-responsive-16by9{padding-bottom:56.25%} -.embed-responsive-4by3{padding-bottom:75%} -.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)} -.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)} -.well-lg{padding:24px;border-radius:6px} -.well-sm{padding:9px;border-radius:3px} -.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2} -.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto;text-decoration:none} -.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5} -button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0} -.modal{position:fixed;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0} -.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)} -.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)} -.modal-open .modal{overflow-x:hidden;overflow-y:auto} -.modal-dialog{position:relative;width:auto;margin:10px} -.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)} -.modal-backdrop{position:fixed;z-index:1040;background-color:#000} -.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0} -.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5} -.modal-header{padding:15px;border-bottom:1px solid #e5e5e5} -.modal-header .close{margin-top:-2px} -.modal-title{margin:0;line-height:1.42857143} -.modal-body{position:relative;padding:15px} -.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5} -.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px} -.modal-footer .btn-group .btn+.btn{margin-left:-1px} -.modal-footer .btn-block+.btn-block{margin-left:0} -.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll} -@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto} -.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)} -.modal-sm{width:300px} -} -@media (min-width:992px){.modal-lg{width:900px} -} -.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;text-align:left;text-align:start;filter:alpha(opacity=0);opacity:0} -.tooltip.in{filter:alpha(opacity=90);opacity:.9} -.tooltip.top{padding:5px 0;margin-top:-3px} -.tooltip.right{padding:0 5px;margin-left:3px} -.tooltip.bottom{padding:5px 0;margin-top:3px} -.tooltip.left{padding:0 5px;margin-left:-3px} -.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px} -.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid} -.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000} -.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px} -.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px} -.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px} -.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000} -.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000} -.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0} -.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px} -.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px} -.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px} -.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;text-align:left;text-align:start;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)} -.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)} -.popover.top{margin-top:-10px} -.popover.right{margin-left:10px} -.popover.bottom{margin-top:10px} -.popover.left{margin-left:-10px} -.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0} -.popover-content{padding:9px 14px} -.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid} -.carousel,.carousel-inner{position:relative} -.popover>.arrow{border-width:11px} -.popover>.arrow:after{content:"";border-width:10px} -.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0} -.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0} -.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "} -.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0} -.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0} -.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)} -.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff} -.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)} -.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff} -.carousel-inner{width:100%;overflow:hidden} -.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left} -.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1} -@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px} -.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)} -.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)} -.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)} -} -.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block} -.carousel-inner>.active{left:0} -.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%} -.carousel-inner>.next{left:100%} -.carousel-inner>.prev{left:-100%} -.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0} -.carousel-inner>.active.left{left:-100%} -.carousel-inner>.active.right{left:100%} -.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5} -.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x} -.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x} -.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9} -.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px} -.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px} -.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px} -.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1} -.carousel-control .icon-prev:before{content:'\2039'} -.carousel-control .icon-next:before{content:'\203a'} -.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none} -.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px} -.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff} -.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px} -.carousel-caption .btn,.text-hide{text-shadow:none} -@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px} -.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px} -.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px} -.carousel-caption{right:20%;left:20%;padding-bottom:30px} -.carousel-indicators{bottom:20px} -} -.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "} -.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both} -.center-block{display:block;margin-right:auto;margin-left:auto} -.pull-right{float:right!important} -.pull-left{float:left!important} -.hide{display:none!important} -.show{display:block!important} -.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important} -.invisible{visibility:hidden} -.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0} -.affix{position:fixed} -@-ms-viewport{width:device-width} -@media (max-width:767px){.visible-xs{display:block!important} -table.visible-xs{display:table!important} -tr.visible-xs{display:table-row!important} -td.visible-xs,th.visible-xs{display:table-cell!important} -.visible-xs-block{display:block!important} -.visible-xs-inline{display:inline!important} -.visible-xs-inline-block{display:inline-block!important} -} -@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important} -table.visible-sm{display:table!important} -tr.visible-sm{display:table-row!important} -td.visible-sm,th.visible-sm{display:table-cell!important} -.visible-sm-block{display:block!important} -.visible-sm-inline{display:inline!important} -.visible-sm-inline-block{display:inline-block!important} -} -@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important} -table.visible-md{display:table!important} -tr.visible-md{display:table-row!important} -td.visible-md,th.visible-md{display:table-cell!important} -.visible-md-block{display:block!important} -.visible-md-inline{display:inline!important} -.visible-md-inline-block{display:inline-block!important} -} -@media (min-width:1200px){.visible-lg{display:block!important} -table.visible-lg{display:table!important} -tr.visible-lg{display:table-row!important} -td.visible-lg,th.visible-lg{display:table-cell!important} -.visible-lg-block{display:block!important} -.visible-lg-inline{display:inline!important} -.visible-lg-inline-block{display:inline-block!important} -.hidden-lg{display:none!important} -} -@media (max-width:767px){.hidden-xs{display:none!important} -} -@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important} -} -@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important} -} -.visible-print{display:none!important} -@media print{.visible-print{display:block!important} -table.visible-print{display:table!important} -tr.visible-print{display:table-row!important} -td.visible-print,th.visible-print{display:table-cell!important} -} -.visible-print-block{display:none!important} -@media print{.visible-print-block{display:block!important} -} -.visible-print-inline{display:none!important} -@media print{.visible-print-inline{display:inline!important} -} -.visible-print-inline-block{display:none!important} -@media print{.visible-print-inline-block{display:inline-block!important} -.hidden-print{display:none!important} -} -.hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto;-webkit-text-size-adjust:none} -.bash .hljs-shebang,.hljs-comment,.java .hljs-javadoc,.javascript .hljs-javadoc,.rust .hljs-preprocessor{color:#969896} -.apache .hljs-sqbracket,.c .hljs-preprocessor,.coffeescript .hljs-regexp,.coffeescript .hljs-subst,.cpp .hljs-preprocessor,.hljs-string,.javascript .hljs-regexp,.json .hljs-attribute,.less .hljs-built_in,.makefile .hljs-variable,.markdown .hljs-blockquote,.markdown .hljs-emphasis,.markdown .hljs-link_label,.markdown .hljs-strong,.markdown .hljs-value,.nginx .hljs-number,.nginx .hljs-regexp,.objectivec .hljs-preprocessor .hljs-title,.perl .hljs-regexp,.php .hljs-regexp,.scss .hljs-built_in,.xml .hljs-value{color:#df5000} -.css .hljs-at_rule,.css .hljs-important,.go .hljs-typename,.haskell .hljs-type,.hljs-keyword,.http .hljs-request,.ini .hljs-setting,.java .hljs-javadoctag,.javascript .hljs-javadoctag,.javascript .hljs-tag,.less .hljs-at_rule,.less .hljs-tag,.nginx .hljs-title,.objectivec .hljs-preprocessor,.php .hljs-phpdoc,.scss .hljs-at_rule,.scss .hljs-important,.scss .hljs-tag,.sql .hljs-built_in,.stylus .hljs-at_rule,.swift .hljs-preprocessor{color:#a71d5d} -.apache .hljs-cbracket,.apache .hljs-common,.apache .hljs-keyword,.bash .hljs-built_in,.bash .hljs-literal,.c .hljs-built_in,.c .hljs-number,.coffeescript .hljs-built_in,.coffeescript .hljs-literal,.coffeescript .hljs-number,.cpp .hljs-built_in,.cpp .hljs-number,.cs .hljs-built_in,.cs .hljs-number,.css .hljs-attribute,.css .hljs-function,.css .hljs-hexcolor,.css .hljs-number,.go .hljs-built_in,.go .hljs-constant,.haskell .hljs-number,.http .hljs-attribute,.http .hljs-literal,.java .hljs-number,.javascript .hljs-built_in,.javascript .hljs-literal,.javascript .hljs-number,.json .hljs-number,.less .hljs-attribute,.less .hljs-function,.less .hljs-hexcolor,.less .hljs-number,.makefile .hljs-keyword,.markdown .hljs-link_reference,.nginx .hljs-built_in,.objectivec .hljs-built_in,.objectivec .hljs-literal,.objectivec .hljs-number,.php .hljs-literal,.php .hljs-number,.puppet .hljs-function,.python .hljs-number,.ruby .hljs-constant,.ruby .hljs-number,.ruby .hljs-prompt,.ruby .hljs-subst .hljs-keyword,.ruby .hljs-symbol,.rust .hljs-number,.scss .hljs-attribute,.scss .hljs-function,.scss .hljs-hexcolor,.scss .hljs-number,.scss .hljs-preprocessor,.sql .hljs-number,.stylus .hljs-attribute,.stylus .hljs-hexcolor,.stylus .hljs-number,.stylus .hljs-params,.swift .hljs-built_in,.swift .hljs-number{color:#0086b3} -.apache .hljs-tag,.cs .hljs-xmlDocTag,.css .hljs-tag,.stylus .hljs-tag,.xml .hljs-title{color:#63a35c} -.bash .hljs-variable,.cs .hljs-preprocessor,.cs .hljs-preprocessor .hljs-keyword,.css .hljs-attr_selector,.css .hljs-value,.ini .hljs-keyword,.ini .hljs-value,.javascript .hljs-tag .hljs-title,.makefile .hljs-constant,.nginx .hljs-variable,.scss .hljs-variable,.xml .hljs-tag{color:#333} -.bash .hljs-title,.c .hljs-title,.coffeescript .hljs-title,.cpp .hljs-title,.cs .hljs-title,.css .hljs-class,.css .hljs-id,.css .hljs-pseudo,.diff .hljs-chunk,.haskell .hljs-pragma,.haskell .hljs-title,.ini .hljs-title,.java .hljs-title,.javascript .hljs-title,.less .hljs-class,.less .hljs-id,.less .hljs-pseudo,.makefile .hljs-title,.objectivec .hljs-title,.perl .hljs-sub,.php .hljs-title,.puppet .hljs-title,.python .hljs-decorator,.python .hljs-title,.ruby .hljs-parent,.ruby .hljs-title,.rust .hljs-title,.scss .hljs-class,.scss .hljs-id,.scss .hljs-pseudo,.stylus .hljs-class,.stylus .hljs-id,.stylus .hljs-pseudo,.stylus .hljs-title,.swift .hljs-title,.xml .hljs-attribute{color:#795da3} -.coffeescript .hljs-attribute,.coffeescript .hljs-reserved{color:#1d3e81} -.diff .hljs-chunk{font-weight:700} -.diff .hljs-addition{color:#55a532;background-color:#eaffea} -.diff .hljs-deletion{color:#bd2c00;background-color:#ffecec} -.markdown .hljs-link_url{text-decoration:underline} \ No newline at end of file diff --git a/docs/styles/docfx.vendor.js b/docs/styles/docfx.vendor.js deleted file mode 100644 index 95c2d628..00000000 --- a/docs/styles/docfx.vendor.js +++ /dev/null @@ -1,45 +0,0 @@ -/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ -return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("