diff --git a/benchmarks/Neoverse-N2/FloatsReaderBench.md b/benchmarks/Neoverse-N2/FloatsReaderBench.md new file mode 100644 index 00000000..49dae498 --- /dev/null +++ b/benchmarks/Neoverse-N2/FloatsReaderBench.md @@ -0,0 +1,32 @@ +``` + +BenchmarkDotNet v0.16.0-preview.1, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Neoverse-N2, 4 physical cores +Memory: 15.57 GB Total, 11.44 GB Available +.NET SDK 11.0.100-rc.1.26425.128 + [Host] : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + .NET 11.0 : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + +Job=.NET 11.0 EnvironmentVariables=DOTNET_GCDynamicAdaptationMode=0 Runtime=.NET 11.0 +Toolchain=net11.0 InvocationCount=Default IterationTime=350ms +MaxIterationCount=15 MinIterationCount=5 WarmupCount=6 +Reader=String + +``` +| Method | Scope | Rows | Mean | Ratio | MB | MB/s | ns/row | Allocated | Alloc Ratio | +|---------- |------- |------ |-----------:|------:|---:|-------:|-------:|------------:|------------:| +| Sep______ | Row | 25000 | 3.565 ms | 1.00 | 20 | 5685.7 | 142.6 | 1.17 KB | 1.00 | +| Sylvan___ | Row | 25000 | 23.033 ms | 6.48 | 20 | 880.1 | 921.3 | 12.12 KB | 10.34 | +| ReadLine_ | Row | 25000 | 19.192 ms | 5.40 | 20 | 1056.3 | 767.7 | 73489.62 KB | 62,711.14 | +| CsvHelper | Row | 25000 | 34.141 ms | 9.60 | 20 | 593.8 | 1365.6 | 19.95 KB | 17.02 | +| | | | | | | | | | | +| Sep______ | Cols | 25000 | 4.920 ms | 1.00 | 20 | 4120.3 | 196.8 | 1.17 KB | 1.00 | +| Sylvan___ | Cols | 25000 | 26.062 ms | 5.30 | 20 | 777.8 | 1042.5 | 12.13 KB | 10.35 | +| ReadLine_ | Cols | 25000 | 19.374 ms | 3.94 | 20 | 1046.4 | 775.0 | 73489.62 KB | 62,711.14 | +| CsvHelper | Cols | 25000 | 35.932 ms | 7.30 | 20 | 564.2 | 1437.3 | 21340.16 KB | 18,210.27 | +| | | | | | | | | | | +| Sep______ | Floats | 25000 | 31.534 ms | 1.00 | 20 | 642.9 | 1261.4 | 7.82 KB | 1.00 | +| Sep_MT___ | Floats | 25000 | 9.283 ms | 0.29 | 20 | 2183.9 | 371.3 | 77.89 KB | 9.96 | +| Sylvan___ | Floats | 25000 | 83.616 ms | 2.65 | 20 | 242.4 | 3344.6 | 18.24 KB | 2.33 | +| ReadLine_ | Floats | 25000 | 96.363 ms | 3.06 | 20 | 210.4 | 3854.5 | 73492.93 KB | 9,397.70 | +| CsvHelper | Floats | 25000 | 136.319 ms | 4.32 | 20 | 148.7 | 5452.8 | 22061.3 KB | 2,821.03 | diff --git a/benchmarks/Neoverse-N2/PackageAssetsBench-GcServer.md b/benchmarks/Neoverse-N2/PackageAssetsBench-GcServer.md new file mode 100644 index 00000000..2b519e39 --- /dev/null +++ b/benchmarks/Neoverse-N2/PackageAssetsBench-GcServer.md @@ -0,0 +1,28 @@ +``` + +BenchmarkDotNet v0.16.0-preview.1, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Neoverse-N2, 4 physical cores +Memory: 15.57 GB Total, 11.44 GB Available +.NET SDK 11.0.100-rc.1.26425.128 + [Host] : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + .NET 11.0 : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + +Job=.NET 11.0 EnvironmentVariables=DOTNET_GCDynamicAdaptationMode=0 Runtime=.NET 11.0 +Server=True Toolchain=net11.0 InvocationCount=Default +IterationTime=350ms MaxIterationCount=15 MinIterationCount=5 +WarmupCount=6 Quotes=False Reader=String + +``` +| Method | Scope | Rows | Mean | Ratio | MB | MB/s | ns/row | Allocated | Alloc Ratio | +|---------- |------ |-------- |------------:|------:|----:|-------:|-------:|-----------:|------------:| +| Sep______ | Asset | 50000 | 32.79 ms | 1.00 | 29 | 887.0 | 655.8 | 13.48 MB | 1.00 | +| Sep_MT___ | Asset | 50000 | 12.16 ms | 0.37 | 29 | 2391.7 | 243.2 | 13.56 MB | 1.01 | +| Sylvan___ | Asset | 50000 | 53.91 ms | 1.64 | 29 | 539.5 | 1078.2 | 13.63 MB | 1.01 | +| ReadLine_ | Asset | 50000 | 51.92 ms | 1.58 | 29 | 560.2 | 1038.4 | 99.74 MB | 7.40 | +| CsvHelper | Asset | 50000 | 100.22 ms | 3.06 | 29 | 290.2 | 2004.5 | 13.64 MB | 1.01 | +| | | | | | | | | | | +| Sep______ | Asset | 1000000 | 644.08 ms | 1.00 | 581 | 903.4 | 644.1 | 260.41 MB | 1.00 | +| Sep_MT___ | Asset | 1000000 | 217.49 ms | 0.34 | 581 | 2675.4 | 217.5 | 267.86 MB | 1.03 | +| Sylvan___ | Asset | 1000000 | 1,060.21 ms | 1.65 | 581 | 548.8 | 1060.2 | 260.57 MB | 1.00 | +| ReadLine_ | Asset | 1000000 | 1,072.36 ms | 1.66 | 581 | 542.6 | 1072.4 | 1991.04 MB | 7.65 | +| CsvHelper | Asset | 1000000 | 1,995.68 ms | 3.10 | 581 | 291.6 | 1995.7 | 260.58 MB | 1.00 | diff --git a/benchmarks/Neoverse-N2/PackageAssetsBench-Parsers.md b/benchmarks/Neoverse-N2/PackageAssetsBench-Parsers.md new file mode 100644 index 00000000..4491ae3f --- /dev/null +++ b/benchmarks/Neoverse-N2/PackageAssetsBench-Parsers.md @@ -0,0 +1,24 @@ +``` + +BenchmarkDotNet v0.16.0-preview.1, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Neoverse-N2, 4 physical cores +Memory: 15.57 GB Total, 11.44 GB Available +.NET SDK 11.0.100-rc.1.26425.128 + [Host] : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + .NET 11.0 : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + +Job=.NET 11.0 EnvironmentVariables=DOTNET_GCDynamicAdaptationMode=0 Runtime=.NET 11.0 +Toolchain=net11.0 InvocationCount=Default IterationTime=350ms +MaxIterationCount=15 MinIterationCount=5 WarmupCount=6 +Quotes=False Reader=String + +``` +| Method | Parser | Scope | Rows | Mean | MB | MB/s | ns/row | Allocated | +|------- |------------------------------------------------ |------ |------ |----------:|---:|-------:|-------:|----------:| +| Sep_ | SepParserAdvSimdNrwCmpOrBulkMoveMaskTzcnt | Row | 50000 | 5.677 ms | 29 | 5123.2 | 113.5 | 960 B | +| Sep_ | SepParserAdvSimdLoad4xNrwCmpOrBulkMoveMaskTzcnt | Row | 50000 | 6.474 ms | 29 | 4492.7 | 129.5 | 960 B | +| Sep_ | SepParserVector128NrwCmpExtMsbTzcnt | Row | 50000 | 8.493 ms | 29 | 3424.6 | 169.9 | 976 B | +| Sep_ | SepParserVector64NrwCmpExtMsbTzcnt | Row | 50000 | 9.960 ms | 29 | 2920.1 | 199.2 | 936 B | +| Sep_ | SepParserIndexOfAny | Row | 50000 | 18.581 ms | 29 | 1565.4 | 371.6 | 936 B | +| Sep_ | SepParserVector512NrwCmpExtMsbTzcnt | Row | 50000 | 18.678 ms | 29 | 1557.2 | 373.6 | 1216 B | +| Sep_ | SepParserVector256NrwCmpExtMsbTzcnt | Row | 50000 | 18.689 ms | 29 | 1556.3 | 373.8 | 1056 B | diff --git a/benchmarks/Neoverse-N2/PackageAssetsBench.md b/benchmarks/Neoverse-N2/PackageAssetsBench.md new file mode 100644 index 00000000..efa7c523 --- /dev/null +++ b/benchmarks/Neoverse-N2/PackageAssetsBench.md @@ -0,0 +1,41 @@ +``` + +BenchmarkDotNet v0.16.0-preview.1, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Neoverse-N2, 4 physical cores +Memory: 15.57 GB Total, 11.44 GB Available +.NET SDK 11.0.100-rc.1.26425.128 + [Host] : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + .NET 11.0 : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + +Job=.NET 11.0 EnvironmentVariables=DOTNET_GCDynamicAdaptationMode=0 Runtime=.NET 11.0 +Toolchain=net11.0 InvocationCount=Default IterationTime=350ms +MaxIterationCount=15 MinIterationCount=5 WarmupCount=6 +Quotes=False Reader=String + +``` +| Method | Scope | Rows | Mean | Ratio | MB | MB/s | ns/row | Allocated | Alloc Ratio | +|------------- |------ |-------- |-------------:|------:|----:|-------:|-------:|-------------:|------------:| +| Sep______ | Row | 50000 | 4.683 ms | 1.00 | 29 | 6210.5 | 93.7 | 960 B | 1.00 | +| Sep_Async | Row | 50000 | 4.885 ms | 1.04 | 29 | 5953.6 | 97.7 | 960 B | 1.00 | +| Sep_Unescape | Row | 50000 | 4.651 ms | 0.99 | 29 | 6254.3 | 93.0 | 960 B | 1.00 | +| Sylvan___ | Row | 50000 | 19.601 ms | 4.19 | 29 | 1483.9 | 392.0 | 7470 B | 7.78 | +| ReadLine_ | Row | 50000 | 21.947 ms | 4.69 | 29 | 1325.3 | 438.9 | 90734824 B | 94,515.44 | +| CsvHelper | Row | 50000 | 56.225 ms | 12.01 | 29 | 517.3 | 1124.5 | 20424 B | 21.27 | +| | | | | | | | | | | +| Sep______ | Cols | 50000 | 6.119 ms | 1.00 | 29 | 4753.2 | 122.4 | 960 B | 1.00 | +| Sep_Unescape | Cols | 50000 | 6.859 ms | 1.12 | 29 | 4240.8 | 137.2 | 960 B | 1.00 | +| Sylvan___ | Cols | 50000 | 22.465 ms | 3.67 | 29 | 1294.7 | 449.3 | 7477 B | 7.79 | +| ReadLine_ | Cols | 50000 | 22.459 ms | 3.67 | 29 | 1295.0 | 449.2 | 90734824 B | 94,515.44 | +| CsvHelper | Cols | 50000 | 86.763 ms | 14.18 | 29 | 335.2 | 1735.3 | 456296 B | 475.31 | +| | | | | | | | | | | +| Sep______ | Asset | 50000 | 35.128 ms | 1.00 | 29 | 828.0 | 702.6 | 14132928 B | 1.00 | +| Sep_MT___ | Asset | 50000 | 18.971 ms | 0.54 | 29 | 1533.2 | 379.4 | 14205842 B | 1.01 | +| Sylvan___ | Asset | 50000 | 57.145 ms | 1.63 | 29 | 509.0 | 1142.9 | 14295531 B | 1.01 | +| ReadLine_ | Asset | 50000 | 128.714 ms | 3.66 | 29 | 226.0 | 2574.3 | 104584256 B | 7.40 | +| CsvHelper | Asset | 50000 | 102.671 ms | 2.92 | 29 | 283.3 | 2053.4 | 14305232 B | 1.01 | +| | | | | | | | | | | +| Sep______ | Asset | 1000000 | 784.447 ms | 1.00 | 581 | 741.8 | 784.4 | 273063928 B | 1.00 | +| Sep_MT___ | Asset | 1000000 | 394.643 ms | 0.50 | 581 | 1474.4 | 394.6 | 283205560 B | 1.04 | +| Sylvan___ | Asset | 1000000 | 1,202.935 ms | 1.53 | 581 | 483.7 | 1202.9 | 273225400 B | 1.00 | +| ReadLine_ | Asset | 1000000 | 2,886.913 ms | 3.68 | 581 | 201.6 | 2886.9 | 2087766056 B | 7.65 | +| CsvHelper | Asset | 1000000 | 2,158.069 ms | 2.75 | 581 | 269.6 | 2158.1 | 273235184 B | 1.00 | diff --git a/benchmarks/Neoverse-N2/PackageAssetsBenchQuotes-GcServer.md b/benchmarks/Neoverse-N2/PackageAssetsBenchQuotes-GcServer.md new file mode 100644 index 00000000..fbf2fecb --- /dev/null +++ b/benchmarks/Neoverse-N2/PackageAssetsBenchQuotes-GcServer.md @@ -0,0 +1,28 @@ +``` + +BenchmarkDotNet v0.16.0-preview.1, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Neoverse-N2, 4 physical cores +Memory: 15.57 GB Total, 11.44 GB Available +.NET SDK 11.0.100-rc.1.26425.128 + [Host] : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + .NET 11.0 : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + +Job=.NET 11.0 EnvironmentVariables=DOTNET_GCDynamicAdaptationMode=0 Runtime=.NET 11.0 +Server=True Toolchain=net11.0 InvocationCount=Default +IterationTime=350ms MaxIterationCount=15 MinIterationCount=5 +WarmupCount=6 Quotes=True Reader=String + +``` +| Method | Scope | Rows | Mean | Ratio | MB | MB/s | ns/row | Allocated | Alloc Ratio | +|---------- |------ |-------- |------------:|------:|----:|-------:|-------:|-----------:|------------:| +| Sep______ | Asset | 50000 | 37.84 ms | 1.00 | 33 | 879.6 | 756.7 | 13.48 MB | 1.00 | +| Sep_MT___ | Asset | 50000 | 15.45 ms | 0.41 | 33 | 2154.1 | 309.0 | 13.54 MB | 1.00 | +| Sylvan___ | Asset | 50000 | 56.72 ms | 1.50 | 33 | 586.8 | 1134.3 | 13.63 MB | 1.01 | +| ReadLine_ | Asset | 50000 | 60.39 ms | 1.60 | 33 | 551.1 | 1207.7 | 119.44 MB | 8.86 | +| CsvHelper | Asset | 50000 | 106.88 ms | 2.82 | 33 | 311.4 | 2137.5 | 13.64 MB | 1.01 | +| | | | | | | | | | | +| Sep______ | Asset | 1000000 | 748.89 ms | 1.00 | 665 | 889.1 | 748.9 | 260.41 MB | 1.00 | +| Sep_MT___ | Asset | 1000000 | 246.78 ms | 0.33 | 665 | 2697.9 | 246.8 | 262.68 MB | 1.01 | +| Sylvan___ | Asset | 1000000 | 1,111.32 ms | 1.48 | 665 | 599.1 | 1111.3 | 260.57 MB | 1.00 | +| ReadLine_ | Asset | 1000000 | 1,265.39 ms | 1.69 | 665 | 526.2 | 1265.4 | 2385.07 MB | 9.16 | +| CsvHelper | Asset | 1000000 | 2,119.59 ms | 2.83 | 665 | 314.1 | 2119.6 | 260.58 MB | 1.00 | diff --git a/benchmarks/Neoverse-N2/PackageAssetsBenchQuotes.md b/benchmarks/Neoverse-N2/PackageAssetsBenchQuotes.md new file mode 100644 index 00000000..848167c0 --- /dev/null +++ b/benchmarks/Neoverse-N2/PackageAssetsBenchQuotes.md @@ -0,0 +1,41 @@ +``` + +BenchmarkDotNet v0.16.0-preview.1, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Neoverse-N2, 4 physical cores +Memory: 15.57 GB Total, 11.44 GB Available +.NET SDK 11.0.100-rc.1.26425.128 + [Host] : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + .NET 11.0 : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + +Job=.NET 11.0 EnvironmentVariables=DOTNET_GCDynamicAdaptationMode=0 Runtime=.NET 11.0 +Toolchain=net11.0 InvocationCount=Default IterationTime=350ms +MaxIterationCount=15 MinIterationCount=5 WarmupCount=6 +Quotes=True Reader=String + +``` +| Method | Scope | Rows | Mean | Ratio | MB | MB/s | ns/row | Allocated | Alloc Ratio | +|------------- |------ |-------- |------------:|------:|----:|-------:|-------:|-------------:|------------:| +| Sep______ | Row | 50000 | 10.14 ms | 1.00 | 33 | 3280.8 | 202.9 | 960 B | 1.00 | +| Sep_Async | Row | 50000 | 10.19 ms | 1.00 | 33 | 3265.4 | 203.8 | 960 B | 1.00 | +| Sep_Unescape | Row | 50000 | 10.52 ms | 1.04 | 33 | 3165.0 | 210.3 | 960 B | 1.00 | +| Sylvan___ | Row | 50000 | 21.64 ms | 2.13 | 33 | 1538.1 | 432.8 | 7477 B | 7.79 | +| ReadLine_ | Row | 50000 | 27.23 ms | 2.68 | 33 | 1222.1 | 544.7 | 111389416 B | 116,030.64 | +| CsvHelper | Row | 50000 | 64.74 ms | 6.38 | 33 | 514.1 | 1294.7 | 20424 B | 21.27 | +| | | | | | | | | | | +| Sep______ | Cols | 50000 | 11.57 ms | 1.00 | 33 | 2875.5 | 231.5 | 960 B | 1.00 | +| Sep_Unescape | Cols | 50000 | 12.85 ms | 1.11 | 33 | 2589.3 | 257.1 | 960 B | 1.00 | +| Sylvan___ | Cols | 50000 | 25.68 ms | 2.22 | 33 | 1296.1 | 513.6 | 7479 B | 7.79 | +| ReadLine_ | Cols | 50000 | 27.44 ms | 2.37 | 33 | 1213.0 | 548.8 | 111389416 B | 116,030.64 | +| CsvHelper | Cols | 50000 | 94.24 ms | 8.14 | 33 | 353.2 | 1884.7 | 456296 B | 475.31 | +| | | | | | | | | | | +| Sep______ | Asset | 50000 | 39.94 ms | 1.00 | 33 | 833.3 | 798.8 | 14132928 B | 1.00 | +| Sep_MT___ | Asset | 50000 | 21.67 ms | 0.54 | 33 | 1536.0 | 433.4 | 14217741 B | 1.01 | +| Sylvan___ | Asset | 50000 | 58.59 ms | 1.47 | 33 | 568.0 | 1171.8 | 14295507 B | 1.01 | +| ReadLine_ | Asset | 50000 | 128.46 ms | 3.22 | 33 | 259.1 | 2569.2 | 125238840 B | 8.86 | +| CsvHelper | Asset | 50000 | 106.38 ms | 2.66 | 33 | 312.9 | 2127.6 | 14305232 B | 1.01 | +| | | | | | | | | | | +| Sep______ | Asset | 1000000 | 879.89 ms | 1.00 | 665 | 756.7 | 879.9 | 273063736 B | 1.00 | +| Sep_MT___ | Asset | 1000000 | 382.07 ms | 0.43 | 665 | 1742.6 | 382.1 | 276224424 B | 1.01 | +| Sylvan___ | Asset | 1000000 | 1,237.80 ms | 1.41 | 665 | 537.9 | 1237.8 | 273225488 B | 1.00 | +| ReadLine_ | Asset | 1000000 | 3,343.44 ms | 3.80 | 665 | 199.1 | 3343.4 | 2500933624 B | 9.16 | +| CsvHelper | Asset | 1000000 | 2,272.54 ms | 2.58 | 665 | 293.0 | 2272.5 | 273235096 B | 1.00 | diff --git a/benchmarks/Neoverse-N2/PackageAssetsBenchSpacesQuotes.md b/benchmarks/Neoverse-N2/PackageAssetsBenchSpacesQuotes.md new file mode 100644 index 00000000..e7ccfb1a --- /dev/null +++ b/benchmarks/Neoverse-N2/PackageAssetsBenchSpacesQuotes.md @@ -0,0 +1,23 @@ +``` + +BenchmarkDotNet v0.16.0-preview.1, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Neoverse-N2, 4 physical cores +Memory: 15.57 GB Total, 11.44 GB Available +.NET SDK 11.0.100-rc.1.26425.128 + [Host] : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + .NET 11.0 : .NET 11.0.0 (11.0.0-rc.1.26425.128, 11.0.26.42628), Arm64 RyuJIT armv8.0-a + +Job=.NET 11.0 EnvironmentVariables=DOTNET_GCDynamicAdaptationMode=0 Runtime=.NET 11.0 +Toolchain=net11.0 InvocationCount=Default IterationTime=350ms +MaxIterationCount=15 MinIterationCount=5 WarmupCount=6 +Quotes=True Reader=String + +``` +| Method | Scope | Rows | Mean | Ratio | MB | MB/s | ns/row | Allocated | Alloc Ratio | +|--------------------------- |------ |------ |----------:|------:|---:|-------:|-------:|----------:|------------:| +| Sep_ | Cols | 50000 | 13.33 ms | 1.00 | 41 | 3125.5 | 266.7 | 960 B | 1.00 | +| Sep_Trim | Cols | 50000 | 17.63 ms | 1.32 | 41 | 2363.4 | 352.7 | 960 B | 1.00 | +| Sep_TrimUnescape | Cols | 50000 | 18.40 ms | 1.38 | 41 | 2264.8 | 368.0 | 960 B | 1.00 | +| Sep_TrimUnescapeTrim | Cols | 50000 | 20.15 ms | 1.51 | 41 | 2068.3 | 403.0 | 960 B | 1.00 | +| CsvHelper_TrimUnescape | Cols | 50000 | 118.83 ms | 8.91 | 41 | 350.7 | 2376.6 | 462096 B | 481.35 | +| CsvHelper_TrimUnescapeTrim | Cols | 50000 | 115.18 ms | 8.64 | 41 | 361.8 | 2303.6 | 456296 B | 475.31 | diff --git a/benchmarks/Neoverse-N2/Versions.txt b/benchmarks/Neoverse-N2/Versions.txt new file mode 100644 index 00000000..b759a74c --- /dev/null +++ b/benchmarks/Neoverse-N2/Versions.txt @@ -0,0 +1 @@ +Sep 0.18.0.0, Sylvan 1.4.4.0, CsvHelper 33.1.0.26 \ No newline at end of file