diff --git a/content/posts/23-web-api-benchmarks-2025/index.md b/content/posts/23-web-api-benchmarks-2025/index.md index 7d997cf..8e981d8 100644 --- a/content/posts/23-web-api-benchmarks-2025/index.md +++ b/content/posts/23-web-api-benchmarks-2025/index.md @@ -14,7 +14,7 @@ This is a 2025 update from previous [2024 benchmark]({{< ref "/posts/22-web-api- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -------------- | | [Laravel 11](https://github.com/adr1enbe4udou1n/laravel-realworld-example-app) ([api](https://laravelrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/laravel/latest)) | FrankenPHP 8.4 | Eloquent | | [Symfony 7.2](https://github.com/adr1enbe4udou1n/symfony-realworld-example-app) ([api](https://symfonyrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/symfony/latest)) | FrankenPHP 8.4 | Doctrine | -| [FastAPI](https://github.com/adr1enbe4udou1n/fastapi-realworld-example-app) ([api](https://fastapirealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/fastapi/latest)) | Python 3.13 | SQLAlchemy 2.0 | +| [FastAPI](https://github.com/adr1enbe4udou1n/fastapi-realworld-example-app) ([api](https://fastapirealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/fastapi/latest)) | Python 3.13 (asyncio) | SQLAlchemy 2.0 (asyncio) | | [NestJS 10](https://github.com/adr1enbe4udou1n/nestjs-realworld-example-app) ([api](https://nestjsrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/nestjs/latest)) | Node 22 | Prisma 6 | | [Spring Boot 3.4](https://github.com/adr1enbe4udou1n/spring-boot-realworld-example-app) ([api](https://springbootrealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/spring-boot/latest)) | Java 21 | Hibernate 6 | | [ASP.NET Core 9](https://github.com/adr1enbe4udou1n/aspnetcore-realworld-example-app) ([api](https://aspnetcorerealworld.okami101.io/api/) / [image](https://gitea.okami101.io/conduit/-/packages/container/aspnet-core/latest)) | .NET 9.0 | EF Core 9 | @@ -147,6 +147,7 @@ services: - DB_PASSWORD=okami - DB_DATABASE=conduit_fastapi - JWT_PASSPHRASE=c2b344e1-1a20-47fc-9aef-55b0c0d568a7 + - UVICORN_WORKERS=2 networks: - postgres_db - traefik_public @@ -155,7 +156,7 @@ services: - traefik.enable=true - traefik.http.routers.fastapi.entrypoints=websecure - traefik.http.services.fastapi.loadbalancer.server.port=8000 - replicas: 4 + replicas: 2 placement: max_replicas_per_node: 2 constraints: @@ -1036,23 +1037,23 @@ As a side note here, uvicorn is limited to 1 CPU core, so I use 2 replicas on ea Iteration creation rate = **15/s** ```txt -checks.........................: 100.00% 39678 out of 39678 -data_received..................: 321 MB 5.2 MB/s -data_sent......................: 3.4 MB 55 kB/s -dropped_iterations.............: 123 1.983368/s -http_req_blocked...............: avg=23.83µs min=213ns med=799ns max=113.17ms p(90)=1.41µs p(95)=1.59µs -http_req_connecting............: avg=1.42µs min=0s med=0s max=6.53ms p(90)=0s p(95)=0s -http_req_duration..............: avg=69.21ms min=6.41ms med=54.17ms max=382.34ms p(90)=142.86ms p(95)=166.33ms - { expected_response:true }...: avg=69.21ms min=6.41ms med=54.17ms max=382.34ms p(90)=142.86ms p(95)=166.33ms -http_req_failed................: 0.00% 0 out of 39678 -http_req_receiving.............: avg=491.01µs min=23.44µs med=282.51µs max=20.46ms p(90)=1.01ms p(95)=1.6ms -http_req_sending...............: avg=106.95µs min=17.61µs med=85.46µs max=20.9ms p(90)=155.94µs p(95)=189.16µs -http_req_tls_handshaking.......: avg=18.91µs min=0s med=0s max=34.33ms p(90)=0s p(95)=0s -http_req_waiting...............: avg=68.62ms min=6.23ms med=53.56ms max=381.34ms p(90)=142.08ms p(95)=165.56ms -http_reqs......................: 39678 639.805458/s -iteration_duration.............: avg=3.56s min=1s med=3.68s max=5.11s p(90)=4.22s p(95)=4.38s -iterations.....................: 778 12.545205/s -vus............................: 3 min=3 max=50 +checks.........................: 100.00% 39525 out of 39525 +data_received..................: 324 MB 5.2 MB/s +data_sent......................: 3.5 MB 56 kB/s +dropped_iterations.............: 126 2.032659/s +http_req_blocked...............: avg=22.84µs min=258ns med=1.01µs max=41.9ms p(90)=1.45µs p(95)=1.6µs +http_req_connecting............: avg=1.32µs min=0s med=0s max=3.49ms p(90)=0s p(95)=0s +http_req_duration..............: avg=69.4ms min=6.28ms med=62.49ms max=323.87ms p(90)=131.32ms p(95)=147.63ms + { expected_response:true }...: avg=69.4ms min=6.28ms med=62.49ms max=323.87ms p(90)=131.32ms p(95)=147.63ms +http_req_failed................: 0.00% 0 out of 39525 +http_req_receiving.............: avg=410.93µs min=24.46µs med=281.1µs max=17.76ms p(90)=784.35µs p(95)=1.12ms +http_req_sending...............: avg=121.75µs min=14.48µs med=105.29µs max=11.05ms p(90)=179.47µs p(95)=221.68µs +http_req_tls_handshaking.......: avg=19.44µs min=0s med=0s max=28.07ms p(90)=0s p(95)=0s +http_req_waiting...............: avg=68.87ms min=5.63ms med=61.98ms max=323.69ms p(90)=130.68ms p(95)=147ms +http_reqs......................: 39525 637.625912/s +iteration_duration.............: avg=3.57s min=822.25ms med=3.74s max=5.09s p(90)=4.25s p(95)=4.37s +iterations.....................: 775 12.502469/s +vus............................: 1 min=1 max=50 vus_max........................: 50 min=50 max=50 ``` @@ -1064,13 +1065,13 @@ vus_max........................: 50 min=50 max=50 { label: 'Req/s', data: [ - 205, 686, 625, 657, 643, 684, 625, 652, 606, - 656, 610, 662, 672, 687, 647, 650, 636, 663, - 665, 617, 600, 621, 637, 655, 628, 681, 649, - 637, 662, 568, 669, 667, 630, 625, 630, 685, - 654, 647, 667, 631, 618, 656, 614, 695, 650, - 659, 629, 638, 646, 609, 642, 661, 647, 677, - 601, 662, 665, 608, 671, 628, 632, 629, 150 + 30, 575, 674, 684, 617, 668, 634, 638, 647, + 621, 662, 661, 670, 659, 617, 672, 644, 653, + 623, 606, 663, 650, 634, 666, 625, 652, 650, + 671, 651, 617, 598, 620, 624, 626, 602, 657, + 646, 649, 650, 638, 669, 640, 639, 636, 628, + 636, 654, 651, 668, 643, 663, 645, 644, 618, + 575, 627, 622, 660, 643, 644, 637, 626, 413 ] } ] @@ -1085,12 +1086,12 @@ vus_max........................: 50 min=50 max=50 { label: 'VUs', data: [ - 15, 18, 22, 30, 31, 36, 37, 41, 49, 50, 49, 50, - 47, 48, 47, 48, 49, 47, 49, 44, 47, 48, 48, 50, - 46, 46, 45, 50, 48, 47, 45, 50, 45, 49, 45, 45, - 50, 47, 48, 50, 47, 50, 46, 47, 49, 47, 50, 47, - 50, 46, 49, 46, 47, 49, 48, 49, 47, 47, 48, 49, - 38, 3 + 13, 18, 20, 24, 29, 33, 38, 41, 49, 47, 49, 49, + 46, 49, 49, 50, 42, 47, 49, 50, 50, 48, 50, 49, + 48, 46, 45, 50, 50, 49, 49, 50, 50, 47, 47, 48, + 50, 48, 50, 46, 49, 50, 50, 49, 50, 48, 47, 49, + 49, 48, 50, 49, 50, 49, 49, 48, 46, 48, 49, 49, + 34, 1 ] } ] @@ -1101,12 +1102,12 @@ vus_max........................: 50 min=50 max=50 { label: 'Duration (ms)', data: [ - 19, 22, 29, 35, 44, 46, 57, 60, 71, 73, 80, 73, - 73, 67, 76, 74, 73, 73, 70, 80, 76, 77, 76, 74, - 77, 65, 70, 75, 73, 84, 68, 71, 80, 74, 79, 64, - 74, 77, 69, 77, 79, 71, 78, 67, 75, 72, 77, 76, - 74, 78, 71, 73, 74, 70, 78, 76, 71, 75, 71, 79, - 71, 49, 17 + 19, 17, 24, 27, 36, 41, 48, 57, 64, 73, 71, 75, + 73, 71, 76, 72, 77, 67, 70, 80, 73, 75, 74, 75, + 78, 76, 73, 69, 74, 80, 79, 78, 78, 77, 81, 71, + 74, 74, 75, 75, 71, 72, 76, 76, 78, 74, 72, 76, + 71, 75, 70, 75, 75, 79, 84, 78, 77, 72, 74, 76, + 74, 64, 27 ] } ] @@ -1120,11 +1121,11 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 0.01, 0.48, 0.69, 0.7, - 0.69, 0.7, 0.7, 0.69, - 0.71, 0.69, 0.68, 0.69, - 0.69, 0.41, 0.01, 0.02, - 0.01, 0.01 + 0.02, 0.09, 0.72, 0.72, + 0.76, 0.76, 0.75, 0.75, + 0.75, 0.75, 0.76, 0.77, + 0.78, 0.78, 0.17, 0.02, + 0.02, 0.02, 0.02 ], borderColor: '#4bc0c0', backgroundColor: '#4bc0c0', @@ -1133,11 +1134,11 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 0.01, 0.16, 0.26, 0.26, - 0.24, 0.24, 0.25, 0.25, - 0.26, 0.25, 0.24, 0.24, - 0.24, 0.16, 0.01, 0.02, - 0.01, 0.01 + 0.01, 0.04, 0.22, 0.21, + 0.22, 0.23, 0.22, 0.22, + 0.22, 0.22, 0.21, 0.23, + 0.22, 0.22, 0.06, 0.01, + 0.02, 0.01, 0.01 ], borderColor: '#ff6384', backgroundColor: '#ff6384', @@ -1151,11 +1152,11 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 0.02, 0.11, 0.46, 0.49, - 0.48, 0.5, 0.5, 0.49, - 0.48, 0.48, 0.47, 0.49, - 0.48, 0.49, 0.05, 0.02, - 0.02, 0.02 + 0.02, 0.04, 0.32, 0.33, + 0.34, 0.34, 0.34, 0.35, + 0.34, 0.33, 0.34, 0.33, + 0.34, 0.35, 0.11, 0.02, + 0.02, 0.02, 0.02 ], borderColor: '#4bc0c0', backgroundColor: '#4bc0c0', @@ -1164,11 +1165,11 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 0.02, 0.06, 0.24, 0.35, - 0.28, 0.35, 0.33, 0.3, - 0.28, 0.32, 0.27, 0.34, - 0.29, 0.3, 0.04, 0.02, - 0.02, 0.02 + 0.03, 0.03, 0.16, 0.2, + 0.19, 0.2, 0.21, 0.23, + 0.23, 0.19, 0.22, 0.18, + 0.23, 0.2, 0.07, 0.02, + 0.02, 0.03, 0.03 ], borderColor: '#ff6384', backgroundColor: '#ff6384', @@ -1185,24 +1186,24 @@ vus_max........................: 50 min=50 max=50 Iteration creation rate = **2/s** ```txt -checks.........................: 100.00% 82414 out of 82414 -data_received..................: 164 MB 1.8 MB/s -data_sent......................: 6.1 MB 68 kB/s -dropped_iterations.............: 64 0.711058/s -http_req_blocked...............: avg=13.71µs min=208ns med=783ns max=143.23ms p(90)=1.39µs p(95)=1.56µs -http_req_connecting............: avg=1.28µs min=0s med=0s max=25.89ms p(90)=0s p(95)=0s -http_req_duration..............: avg=43.46ms min=3.99ms med=24.29ms max=315.4ms p(90)=108.49ms p(95)=129.33ms - { expected_response:true }...: avg=43.46ms min=3.99ms med=24.29ms max=315.4ms p(90)=108.49ms p(95)=129.33ms -http_req_failed................: 0.00% 0 out of 82414 -http_req_receiving.............: avg=205.46µs min=16.8µs med=103.34µs max=23.42ms p(90)=394.08µs p(95)=591.95µs -http_req_sending...............: avg=94.88µs min=17.56µs med=78.81µs max=14.63ms p(90)=143.76µs p(95)=171.26µs -http_req_tls_handshaking.......: avg=9.75µs min=0s med=0s max=29.89ms p(90)=0s p(95)=0s -http_req_waiting...............: avg=43.16ms min=23.62µs med=23.97ms max=315.14ms p(90)=108.17ms p(95)=129.04ms -http_reqs......................: 82414 915.642582/s -iteration_duration.............: avg=1m5s min=44.88s med=1m10s max=1m14s p(90)=1m13s p(95)=1m13s -iterations.....................: 36 0.39997/s -vus............................: 21 min=2 max=50 -vus_max........................: 50 min=50 max=50 +checks.........................: 67.75% 35254 out of 52029 +data_received..................: 92 MB 1.0 MB/s +data_sent......................: 3.8 MB 42 kB/s +dropped_iterations.............: 70 0.777606/s +http_req_blocked...............: avg=23.08µs min=232ns med=1µs max=103.63ms p(90)=1.42µs p(95)=1.56µs +http_req_connecting............: avg=977ns min=0s med=0s max=5.29ms p(90)=0s p(95)=0s +http_req_duration..............: avg=74.22ms min=3.71ms med=57.69ms max=366.12ms p(90)=157.54ms p(95)=180.86ms + { expected_response:true }...: avg=68.87ms min=3.71ms med=52.82ms max=366.12ms p(90)=147.21ms p(95)=170.41ms +http_req_failed................: 32.24% 16775 out of 52029 +http_req_receiving.............: avg=237.94µs min=18.29µs med=130.97µs max=11.5ms p(90)=498.83µs p(95)=758.8µs +http_req_sending...............: avg=116.57µs min=16.04µs med=104.78µs max=5.81ms p(90)=174.59µs p(95)=212.82µs +http_req_tls_handshaking.......: avg=19.29µs min=0s med=0s max=27.95ms p(90)=0s p(95)=0s +http_req_waiting...............: avg=73.86ms min=3.02ms med=57.38ms max=365.81ms p(90)=157.13ms p(95)=180.31ms +http_reqs......................: 52029 577.972273/s +iteration_duration.............: avg=1m26s min=1m26s med=1m26s max=1m26s p(90)=1m26s p(95)=1m26s +iterations.....................: 3 0.033326/s +vus............................: 47 min=2 max=50 +vus_max........................: 50 min=50 max=50 ``` {{< tabs >}} @@ -1213,15 +1214,15 @@ vus_max........................: 50 min=50 max=50 { label: 'Req/s', data: [ - 12, 155, 362, 681, 799, 914, 973, 975, 984, 928, 959, - 964, 934, 975, 874, 924, 883, 908, 931, 888, 983, 935, - 967, 959, 898, 942, 939, 935, 933, 904, 926, 909, 911, - 904, 945, 929, 990, 962, 973, 896, 998, 962, 930, 983, - 891, 1007, 944, 925, 983, 952, 938, 984, 939, 936, 872, - 959, 996, 983, 968, 945, 909, 964, 973, 897, 921, 996, - 953, 986, 941, 929, 942, 966, 880, 943, 901, 956, 925, - 944, 967, 899, 935, 937, 924, 960, 899, 999, 917, 891, - 880, 884, 538 + 34, 277, 442, 502, 566, 530, 612, 611, 593, 630, 577, + 606, 619, 529, 568, 567, 599, 606, 559, 567, 557, 613, + 604, 558, 617, 580, 607, 586, 581, 615, 564, 610, 612, + 576, 596, 561, 610, 602, 561, 616, 571, 612, 604, 577, + 586, 593, 595, 598, 566, 599, 592, 589, 585, 590, 603, + 596, 608, 580, 571, 580, 583, 598, 606, 541, 581, 575, + 595, 580, 591, 625, 577, 584, 601, 591, 585, 592, 620, + 598, 574, 598, 571, 599, 596, 592, 603, 590, 593, 578, + 599, 585, 113 ] } ] @@ -1240,10 +1241,10 @@ vus_max........................: 50 min=50 max=50 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 49, 49, 50, 50, 50, 50, 50, 50, - 49, 49, 49, 49, 48, 47, 46, 46, 46, 45, 45, 44, - 43, 43, 43, 42, 41, 40, 40, 40, 38, 36, 35, 34, - 32, 30, 29, 26, 25, 21 + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 48, 47, 47, 47 ] } ] @@ -1254,14 +1255,14 @@ vus_max........................: 50 min=50 max=50 { label: 'Duration (ms)', data: [ - 20, 14, 12, 9, 10, 11, 12, 14, 16, 19, 21, 23, - 26, 27, 32, 32, 36, 38, 38, 44, 41, 45, 46, 47, - 54, 52, 51, 55, 54, 55, 54, 55, 54, 55, 53, 54, - 49, 53, 51, 56, 50, 52, 53, 51, 55, 50, 53, 53, - 49, 53, 53, 50, 53, 53, 57, 50, 52, 49, 52, 54, - 54, 52, 50, 53, 54, 49, 49, 47, 49, 49, 47, 45, - 50, 47, 47, 45, 44, 44, 41, 45, 42, 41, 39, 36, - 38, 31, 33, 32, 31, 28, 24 + 28, 11, 11, 14, 16, 21, 21, 25, 28, 30, 36, 37, + 40, 50, 50, 56, 55, 58, 64, 67, 73, 71, 75, 83, + 79, 84, 83, 83, 88, 81, 89, 82, 81, 86, 83, 89, + 81, 85, 87, 80, 88, 82, 81, 88, 84, 83, 84, 86, + 86, 84, 83, 85, 86, 84, 81, 85, 81, 86, 88, 83, + 86, 85, 83, 91, 86, 87, 86, 85, 85, 80, 84, 85, + 83, 84, 85, 85, 82, 83, 85, 84, 84, 86, 84, 84, + 84, 82, 86, 81, 81, 79, 80 ] } ] @@ -1275,11 +1276,11 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 0.01, 0.24, 0.65, 0.68, - 0.66, 0.69, 0.68, 0.68, - 0.68, 0.69, 0.69, 0.71, - 0.69, 0.68, 0.7, 0.7, - 0.69, 0.68, 0.65 + 0.02, 0.03, 0.53, 0.76, + 0.8, 0.81, 0.83, 0.83, + 0.83, 0.83, 0.83, 0.83, + 0.8, 0.75, 0.83, 0.8, + 0.83, 0.8, 0.75 ], borderColor: '#4bc0c0', backgroundColor: '#4bc0c0', @@ -1288,11 +1289,11 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 0.01, 0.08, 0.23, 0.26, - 0.25, 0.28, 0.27, 0.25, - 0.25, 0.25, 0.25, 0.27, - 0.28, 0.26, 0.27, 0.28, - 0.27, 0.24, 0.24 + 0.02, 0.02, 0.12, 0.17, + 0.17, 0.17, 0.17, 0.17, + 0.17, 0.17, 0.17, 0.17, + 0.17, 0.16, 0.17, 0.17, + 0.17, 0.17, 0.16 ], borderColor: '#ff6384', backgroundColor: '#ff6384', @@ -1306,11 +1307,11 @@ vus_max........................: 50 min=50 max=50 { label: 'User', data: [ - 0.02, 0.03, 0.24, 0.24, - 0.25, 0.26, 0.28, 0.28, - 0.29, 0.28, 0.29, 0.28, - 0.27, 0.28, 0.29, 0.28, - 0.28, 0.27, 0.28 + 0.02, 0.02, 0.17, 0.26, + 0.24, 0.21, 0.22, 0.21, + 0.22, 0.23, 0.22, 0.22, + 0.22, 0.23, 0.22, 0.22, + 0.23, 0.22, 0.22 ], borderColor: '#4bc0c0', backgroundColor: '#4bc0c0', @@ -1319,11 +1320,11 @@ vus_max........................: 50 min=50 max=50 { label: 'System', data: [ - 0.02, 0.02, 0.13, 0.16, - 0.2, 0.23, 0.23, 0.24, - 0.26, 0.26, 0.26, 0.23, - 0.23, 0.25, 0.24, 0.25, - 0.25, 0.23, 0.23 + 0.02, 0.02, 0.13, 0.21, + 0.24, 0.26, 0.26, 0.22, + 0.23, 0.26, 0.24, 0.26, + 0.26, 0.25, 0.26, 0.26, + 0.26, 0.26, 0.26 ], borderColor: '#ff6384', backgroundColor: '#ff6384', @@ -2291,13 +2292,13 @@ Here are the final req/s results for each framework against PgSQL database. borderColor: "#0f766e", backgroundColor: "#0f766e", data: [ - 205, 686, 625, 657, 643, 684, 625, 652, 606, - 656, 610, 662, 672, 687, 647, 650, 636, 663, - 665, 617, 600, 621, 637, 655, 628, 681, 649, - 637, 662, 568, 669, 667, 630, 625, 630, 685, - 654, 647, 667, 631, 618, 656, 614, 695, 650, - 659, 629, 638, 646, 609, 642, 661, 647, 677, - 601, 662, 665, 608, 671, 628, 632, 629, 150 + 30, 575, 674, 684, 617, 668, 634, 638, 647, + 621, 662, 661, 670, 659, 617, 672, 644, 653, + 623, 606, 663, 650, 634, 666, 625, 652, 650, + 671, 651, 617, 598, 620, 624, 626, 602, 657, + 646, 649, 650, 638, 669, 640, 639, 636, 628, + 636, 654, 651, 668, 643, 663, 645, 644, 618, + 575, 627, 622, 660, 643, 644, 637, 626, 413 ], }, { @@ -2388,15 +2389,15 @@ Here are the final req/s results for each framework against PgSQL database. borderColor: "#0f766e", backgroundColor: "#0f766e", data: [ - 12, 155, 362, 681, 799, 914, 973, 975, 984, 928, 959, - 964, 934, 975, 874, 924, 883, 908, 931, 888, 983, 935, - 967, 959, 898, 942, 939, 935, 933, 904, 926, 909, 911, - 904, 945, 929, 990, 962, 973, 896, 998, 962, 930, 983, - 891, 1007, 944, 925, 983, 952, 938, 984, 939, 936, 872, - 959, 996, 983, 968, 945, 909, 964, 973, 897, 921, 996, - 953, 986, 941, 929, 942, 966, 880, 943, 901, 956, 925, - 944, 967, 899, 935, 937, 924, 960, 899, 999, 917, 891, - 880, 884, 538 + 34, 277, 442, 502, 566, 530, 612, 611, 593, 630, 577, + 606, 619, 529, 568, 567, 599, 606, 559, 567, 557, 613, + 604, 558, 617, 580, 607, 586, 581, 615, 564, 610, 612, + 576, 596, 561, 610, 602, 561, 616, 571, 612, 604, 577, + 586, 593, 595, 598, 566, 599, 592, 589, 585, 590, 603, + 596, 608, 580, 571, 580, 583, 598, 606, 541, 581, 575, + 595, 580, 591, 625, 577, 584, 601, 591, 585, 592, 620, + 598, 574, 598, 571, 599, 596, 592, 603, 590, 593, 578, + 599, 585, 113 ], }, {