From d4e8bef2ab47452492a1b83d7ff4fcff5fd393e3 Mon Sep 17 00:00:00 2001
From: gaborcsardi $output function (x, options) { hook.t(x, options[[paste0(“attr.”,
class)]], options[[paste0(“class.”, class)]]) } <bytecode:
-0x560f5b8db750> <environment: 0x560f568bafc8>Customization
Gábor
Csárdi
- 2024-02-14
+ 2024-03-16
Source: vignettes/ansi-benchmark.Rmd
ansi-benchmark.Rmd
2024-02-14
#> # A tibble: 3 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 ansi 46.2µs 49.4µs 19996. 97.8KB 23.3
-#> 2 plain 46.8µs 49.8µs 19740. 0B 21.9
-#> 3 base 12µs 13.1µs 75425. 48.4KB 22.6
+#> 1 ansi 44.5µs 49.9µs 19819. 97.8KB 21.1
+#> 2 plain 47µs 49.8µs 19636. 0B 21.8
+#> 3 base 11.8µs 12.7µs 77367. 48.4KB 23.2
bench::mark(
ansi = ansi_align(ansi, width = 20, align = "right"),
@@ -177,9 +177,9 @@
#> # A tibble: 3 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 ansi 48.5µs 51.7µs 19116. 0B 23.5
-#> 2 plain 48.4µs 51.9µs 18541. 0B 25.6
-#> 3 base 14.1µs 15.4µs 64274. 0B 25.7
+#> 1 ansi 47.7µs 51.6µs 19000. 0B 23.5
+#> 2 plain 45.2µs 51.4µs 19216. 0B 25.6
+#> 3 base 14µs 15.3µs 64199. 0B 25.7
#> # A tibble: 3 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 ansi 110.79µs 117µs 8427. 75.12KB 16.8
-#> 2 plain 87.43µs 92.5µs 10677. 8.73KB 19.0
-#> 3 base 1.88µs 2µs 485049. 0B 0
+#> 1 ansi 109.97µs 115.31µs 8566. 75.11KB 16.8
+#> 2 plain 82.67µs 91.68µs 10759. 8.73KB 16.8
+#> 3 base 1.84µs 1.97µs 491090. 0B 49.1
#> # A tibble: 2 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 ansi 346µs 362µs 2724. 33.2KB 21.3
-#> 2 plain 347µs 361µs 2747. 1.09KB 23.5
+#> 1 ansi 335µs 353µs 2800. 33.2KB 21.4
+#> 2 plain 335µs 348µs 2835. 1.09KB 21.3
#> # A tibble: 12 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 5.62µs 6.19µs 158296. 8.03KB 31.7
-#> 2 fansi_ansi 31.05µs 33.23µs 29089. 4.18KB 20.4
-#> 3 cli_plain 5.69µs 6.08µs 160362. 0B 16.0
-#> 4 fansi_plain 30.91µs 32.65µs 30214. 688B 15.1
-#> 5 cli_vec_ansi 6.99µs 7.42µs 132808. 448B 13.3
-#> 6 fansi_vec_ansi 40.07µs 42.19µs 23084. 5.02KB 13.9
-#> 7 cli_vec_plain 7.58µs 8.03µs 121442. 448B 12.1
-#> 8 fansi_vec_plain 39.5µs 41.56µs 22763. 5.02KB 11.4
-#> 9 cli_txt_ansi 5.66µs 6.09µs 159314. 0B 15.9
-#> 10 fansi_txt_ansi 30.99µs 32.7µs 30192. 688B 15.1
-#> 11 cli_txt_plain 6.52µs 6.92µs 142341. 0B 14.2
-#> 12 fansi_txt_plain 39.19µs 41.3µs 23886. 5.02KB 11.9
+#> 1 cli_ansi 5.5µs 5.93µs 164804. 8.03KB 33.0
+#> 2 fansi_ansi 30.58µs 32.81µs 30056. 4.18KB 27.1
+#> 3 cli_plain 5.03µs 5.7µs 173711. 0B 34.7
+#> 4 fansi_plain 30.87µs 32.22µs 30635. 688B 27.6
+#> 5 cli_vec_ansi 6.35µs 7.16µs 137716. 448B 27.5
+#> 6 fansi_vec_ansi 36.8µs 41.48µs 23872. 5.02KB 21.5
+#> 7 cli_vec_plain 6.84µs 7.72µs 127540. 448B 25.5
+#> 8 fansi_vec_plain 36.99µs 41.07µs 24056. 5.02KB 21.7
+#> 9 cli_txt_ansi 5.46µs 5.79µs 169357. 0B 16.9
+#> 10 fansi_txt_ansi 29.16µs 32.54µs 30145. 688B 24.1
+#> 11 cli_txt_plain 6.33µs 6.65µs 148005. 0B 29.6
+#> 12 fansi_txt_plain 39.19µs 40.97µs 24103. 5.02KB 21.7
#> # A tibble: 2 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli 58µs 59.5µs 16595. 28.8KB 6.11
-#> 2 fansi 123µs 125.5µs 7820. 55.4KB 6.11
+#> 1 cli 57.8µs 59µs 16800. 28.8KB 10.3
+#> 2 fansi 122.4µs 125µs 7940. 55.4KB 8.17
#> # A tibble: 18 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 6.93µs 7.54µs 130305. 0B 13.0
-#> 2 fansi_ansi 91.92µs 95.92µs 10323. 31.85KB 10.3
-#> 3 base_ansi 860.89ns 900.94ns 1042575. 0B 0
-#> 4 cli_plain 7.08µs 7.62µs 129446. 0B 12.9
-#> 5 fansi_plain 91.85µs 95.6µs 10338. 688B 10.3
-#> 6 base_plain 781.03ns 822.01ns 1120330. 0B 112.
-#> 7 cli_vec_ansi 27.95µs 28.75µs 34536. 448B 3.45
-#> 8 fansi_vec_ansi 111.72µs 115.5µs 8567. 5.02KB 8.23
-#> 9 base_vec_ansi 12.2µs 12.27µs 80815. 448B 0
-#> 10 cli_vec_plain 27.03µs 27.68µs 35876. 448B 3.59
-#> 11 fansi_vec_plain 102.05µs 106.23µs 9098. 5.02KB 10.4
-#> 12 base_vec_plain 7.31µs 7.37µs 134012. 448B 0
-#> 13 cli_txt_ansi 28.18µs 28.89µs 34221. 0B 3.42
-#> 14 fansi_txt_ansi 104.17µs 108.14µs 9148. 688B 8.18
-#> 15 base_txt_ansi 11.61µs 11.7µs 84719. 0B 8.47
-#> 16 cli_txt_plain 26.56µs 27.15µs 36555. 0B 3.66
-#> 17 fansi_txt_plain 94.15µs 98.05µs 10062. 688B 10.3
-#> 18 base_txt_plain 7.43µs 7.47µs 132636. 0B 0
+#> 1 cli_ansi 6.65µs 7.15µs 134952. 0B 27.0
+#> 2 fansi_ansi 90.44µs 93.64µs 10553. 31.85KB 18.8
+#> 3 base_ansi 830.97ns 862.17ns 1088811. 0B 109.
+#> 4 cli_plain 6.69µs 7.12µs 138224. 0B 27.7
+#> 5 fansi_plain 84.22µs 93.45µs 10562. 688B 18.9
+#> 6 base_plain 771.02ns 811.07ns 1182570. 0B 0
+#> 7 cli_vec_ansi 25.81µs 28.37µs 34941. 448B 6.99
+#> 8 fansi_vec_ansi 105.06µs 113.83µs 8647. 5.02KB 14.6
+#> 9 base_vec_ansi 12.2µs 12.28µs 80567. 448B 0
+#> 10 cli_vec_plain 24.71µs 27.37µs 36271. 448B 7.26
+#> 11 fansi_vec_plain 94.82µs 104.13µs 9482. 5.02KB 16.8
+#> 12 base_vec_plain 6.77µs 7.4µs 133850. 448B 13.4
+#> 13 cli_txt_ansi 27.91µs 28.44µs 34893. 0B 6.98
+#> 14 fansi_txt_ansi 102.15µs 105.95µs 9242. 688B 16.7
+#> 15 base_txt_ansi 11.61µs 11.65µs 85220. 0B 0
+#> 16 cli_txt_plain 26.22µs 26.75µs 37114. 0B 7.42
+#> 17 fansi_txt_plain 86.06µs 95.38µs 10352. 688B 18.8
+#> 18 base_txt_plain 7.42µs 7.46µs 133055. 0B 0
bench::mark(
cli_ansi = ansi_nchar(ansi, type = "width"),
@@ -340,24 +340,24 @@
#> # A tibble: 18 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 8.76µs 9.4µs 104631. 0B 10.5
-#> 2 fansi_ansi 92.41µs 96.54µs 10186. 688B 10.3
-#> 3 base_ansi 1.17µs 1.21µs 789442. 0B 79.0
-#> 4 cli_plain 8.77µs 9.41µs 104799. 0B 10.5
-#> 5 fansi_plain 92.08µs 96.23µs 10281. 688B 10.3
-#> 6 base_plain 991.04ns 1.03µs 911254. 0B 0
-#> 7 cli_vec_ansi 33.85µs 34.55µs 28717. 448B 5.74
-#> 8 fansi_vec_ansi 118.09µs 122.14µs 8086. 5.02KB 8.23
-#> 9 base_vec_ansi 37.04µs 37.33µs 26356. 448B 0
-#> 10 cli_vec_plain 33µs 33.89µs 28689. 448B 2.87
-#> 11 fansi_vec_plain 108.58µs 112.22µs 8807. 5.02KB 10.4
-#> 12 base_vec_plain 20.24µs 20.51µs 48495. 448B 0
-#> 13 cli_txt_ansi 34.19µs 34.92µs 28433. 0B 2.84
-#> 14 fansi_txt_ansi 109µs 114µs 8657. 688B 10.4
-#> 15 base_txt_ansi 39.62µs 39.87µs 24964. 0B 0
-#> 16 cli_txt_plain 32.8µs 33.5µs 29602. 0B 2.96
-#> 17 fansi_txt_plain 99.88µs 103.97µs 9514. 688B 10.3
-#> 18 base_txt_plain 22.13µs 22.36µs 44510. 0B 0
+#> 1 cli_ansi 7.88µs 8.96µs 110169. 0B 33.1
+#> 2 fansi_ansi 89.92µs 93.13µs 10621. 688B 18.8
+#> 3 base_ansi 1.17µs 1.21µs 797678. 0B 0
+#> 4 cli_plain 8.22µs 8.74µs 111692. 0B 33.5
+#> 5 fansi_plain 89.6µs 93.47µs 10584. 688B 18.9
+#> 6 base_plain 981.03ns 1.01µs 947050. 0B 0
+#> 7 cli_vec_ansi 33.6µs 34.24µs 28970. 448B 8.69
+#> 8 fansi_vec_ansi 115.22µs 120.18µs 8230. 5.02KB 14.6
+#> 9 base_vec_ansi 37.68µs 37.97µs 26212. 448B 0
+#> 10 cli_vec_plain 32.87µs 33.61µs 29527. 448B 5.91
+#> 11 fansi_vec_plain 106.87µs 110.43µs 8948. 5.02KB 16.8
+#> 12 base_vec_plain 19.19µs 19.49µs 51029. 448B 0
+#> 13 cli_txt_ansi 34.02µs 34.73µs 28332. 0B 8.50
+#> 14 fansi_txt_ansi 108.17µs 111.85µs 8838. 688B 14.5
+#> 15 base_txt_ansi 40.26µs 40.42µs 24608. 0B 2.46
+#> 16 cli_txt_plain 30.12µs 33.15µs 29958. 0B 5.99
+#> 17 fansi_txt_plain 98.15µs 102.04µs 9687. 688B 16.7
+#> 18 base_txt_plain 21.1µs 21.28µs 46705. 0B 4.67
#> # A tibble: 6 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 6.97µs 7.54µs 130560. 0B 13.1
-#> 2 cli_plain 6.42µs 6.94µs 141455. 0B 14.1
-#> 3 cli_vec_ansi 33.28µs 34.33µs 28947. 848B 2.89
-#> 4 cli_vec_plain 10.4µs 10.96µs 90210. 848B 9.02
-#> 5 cli_txt_ansi 32.69µs 33.37µs 29771. 0B 2.98
-#> 6 cli_txt_plain 7.3µs 7.88µs 124921. 0B 12.5
+#> 1 cli_ansi 6.72µs 7.2µs 136568. 0B 27.3
+#> 2 cli_plain 5.86µs 6.69µs 147367. 0B 29.5
+#> 3 cli_vec_ansi 30.31µs 33.6µs 29821. 848B 5.97
+#> 4 cli_vec_plain 10.12µs 10.68µs 92697. 848B 9.27
+#> 5 cli_txt_ansi 32.07µs 34.45µs 28985. 0B 5.80
+#> 6 cli_txt_plain 7.17µs 7.61µs 129428. 0B 25.9
#> # A tibble: 12 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 11.5µs 12.2µs 80572. 0B 16.1
-#> 2 fansi_ansi 29µs 31µs 31822. 688B 12.7
-#> 3 cli_plain 11.3µs 11.9µs 83015. 0B 16.6
-#> 4 fansi_plain 28.6µs 29.8µs 33132. 688B 16.6
-#> 5 cli_vec_ansi 20µs 20.7µs 47793. 848B 9.56
-#> 6 fansi_vec_ansi 55.3µs 57.1µs 17354. 5.41KB 8.27
-#> 7 cli_vec_plain 14.1µs 14.8µs 66980. 848B 13.4
-#> 8 fansi_vec_plain 37.7µs 39.2µs 25215. 4.59KB 12.6
-#> 9 cli_txt_ansi 19.8µs 20.6µs 48010. 0B 9.60
-#> 10 fansi_txt_ansi 45.2µs 46.7µs 20960. 5.12KB 10.5
-#> 11 cli_txt_plain 12.3µs 13µs 75749. 0B 15.2
-#> 12 fansi_txt_plain 30µs 31.6µs 31177. 688B 15.6
+#> 1 cli_ansi 11.3µs 11.9µs 83215. 0B 33.3
+#> 2 fansi_ansi 28.9µs 30.5µs 32270. 688B 25.8
+#> 3 cli_plain 11.2µs 11.7µs 84318. 0B 33.7
+#> 4 fansi_plain 27.1µs 29.9µs 32843. 688B 26.3
+#> 5 cli_vec_ansi 20.1µs 21µs 47034. 848B 18.8
+#> 6 fansi_vec_ansi 53.9µs 55.7µs 17774. 5.41KB 14.6
+#> 7 cli_vec_plain 14µs 14.7µs 66917. 848B 26.8
+#> 8 fansi_vec_plain 37.1µs 38.9µs 25324. 4.59KB 20.3
+#> 9 cli_txt_ansi 19.5µs 20.4µs 47945. 0B 14.4
+#> 10 fansi_txt_ansi 44.7µs 46.1µs 21420. 5.12KB 19.3
+#> 11 cli_txt_plain 11.4µs 12.7µs 77615. 0B 23.3
+#> 12 fansi_txt_plain 29.8µs 31.2µs 31585. 688B 28.5
#> # A tibble: 18 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 148.37µs 153.9µs 6412. 103.37KB 12.4
-#> 2 fansi_ansi 130.79µs 136.87µs 7167. 102.16KB 12.5
-#> 3 base_ansi 4.05µs 4.36µs 225827. 224B 0
-#> 4 cli_plain 146.83µs 152.57µs 6439. 8.09KB 12.4
-#> 5 fansi_plain 129.1µs 135.49µs 7268. 9.62KB 12.5
-#> 6 base_plain 3.65µs 3.9µs 250903. 0B 0
-#> 7 cli_vec_ansi 7.36ms 7.53ms 132. 823.77KB 16.5
-#> 8 fansi_vec_ansi 1.07ms 1.1ms 872. 846.81KB 15.0
-#> 9 base_vec_ansi 154.73µs 160.14µs 6122. 22.7KB 4.06
-#> 10 cli_vec_plain 7.3ms 7.45ms 133. 823.77KB 13.7
-#> 11 fansi_vec_plain 1.02ms 1.05ms 946. 845.98KB 17.6
-#> 12 base_vec_plain 107.43µs 110.9µs 8898. 848B 4.06
-#> 13 cli_txt_ansi 3.24ms 3.29ms 303. 63.6KB 0
-#> 14 fansi_txt_ansi 1.53ms 1.56ms 633. 35.05KB 2.02
-#> 15 base_txt_ansi 137.68µs 144µs 6915. 18.47KB 2.01
-#> 16 cli_txt_plain 2.38ms 2.41ms 414. 63.6KB 0
-#> 17 fansi_txt_plain 512.04µs 520.49µs 1900. 30.6KB 4.08
-#> 18 base_txt_plain 89.32µs 91.09µs 10728. 11.05KB 2.02
+#> 1 cli_ansi 144.66µs 150µs 6583. 103.37KB 21.0
+#> 2 fansi_ansi 121.42µs 131.98µs 7479. 102.16KB 23.3
+#> 3 base_ansi 4.14µs 4.43µs 222649. 224B 0
+#> 4 cli_plain 137.46µs 148.01µs 6657. 8.09KB 21.0
+#> 5 fansi_plain 124.74µs 129.64µs 7612. 9.62KB 23.3
+#> 6 base_plain 3.65µs 3.86µs 254155. 0B 0
+#> 7 cli_vec_ansi 7.26ms 7.43ms 134. 823.77KB 31.6
+#> 8 fansi_vec_ansi 1.03ms 1.06ms 915. 846.81KB 19.3
+#> 9 base_vec_ansi 154.64µs 160.76µs 6115. 22.7KB 2.02
+#> 10 cli_vec_plain 7.15ms 7.35ms 136. 823.77KB 32.0
+#> 11 fansi_vec_plain 903.42µs 997.75µs 991. 845.98KB 24.0
+#> 12 base_vec_plain 100.26µs 110.47µs 9013. 848B 4.05
+#> 13 cli_txt_ansi 3.23ms 3.31ms 302. 63.6KB 0
+#> 14 fansi_txt_ansi 1.52ms 1.55ms 646. 35.05KB 2.02
+#> 15 base_txt_ansi 138.64µs 147.22µs 6773. 18.47KB 2.02
+#> 16 cli_txt_plain 2.39ms 2.45ms 404. 63.6KB 0
+#> 17 fansi_txt_plain 474.72µs 540.77µs 1859. 30.6KB 6.14
+#> 18 base_txt_plain 91.36µs 93.64µs 10483. 11.05KB 2.02
#> # A tibble: 18 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 100.43µs 104.82µs 9382. 32.25KB 12.4
-#> 2 fansi_ansi 54.17µs 57.62µs 17038. 31.45KB 14.9
-#> 3 base_ansi 1.05µs 1.08µs 884594. 4.2KB 0
-#> 4 cli_plain 98.69µs 103.02µs 9479. 0B 12.4
-#> 5 fansi_plain 54.17µs 57.44µs 17130. 872B 14.6
-#> 6 base_plain 991.98ns 1.03µs 914408. 0B 0
-#> 7 cli_vec_ansi 224.67µs 229.93µs 4295. 16.73KB 6.16
-#> 8 fansi_vec_ansi 122.58µs 126.65µs 7806. 5.59KB 7.04
-#> 9 base_vec_ansi 33.83µs 34.18µs 28653. 848B 0
-#> 10 cli_vec_plain 181.28µs 185.36µs 5335. 16.73KB 8.29
-#> 11 fansi_vec_plain 117.05µs 120µs 8163. 5.59KB 8.25
-#> 12 base_vec_plain 29.05µs 29.52µs 33721. 848B 0
-#> 13 cli_txt_ansi 107.83µs 111.55µs 8818. 0B 12.4
-#> 14 fansi_txt_ansi 52.89µs 55.67µs 17693. 872B 14.7
-#> 15 base_txt_ansi 1.09µs 1.13µs 855887. 0B 0
-#> 16 cli_txt_plain 99.3µs 103.54µs 9549. 0B 12.4
-#> 17 fansi_txt_plain 52.96µs 56.52µs 17504. 872B 14.6
-#> 18 base_txt_plain 991.98ns 1.04µs 913302. 0B 0
+#> 1 cli_ansi 97.53µs 101.83µs 9686. 32.25KB 14.0
+#> 2 fansi_ansi 52.75µs 55.38µs 17841. 31.45KB 14.6
+#> 3 base_ansi 1.02µs 1.06µs 897134. 4.2KB 0
+#> 4 cli_plain 90µs 99.52µs 9892. 0B 14.5
+#> 5 fansi_plain 49.95µs 55.28µs 17859. 872B 14.8
+#> 6 base_plain 961.94ns 1µs 948091. 0B 0
+#> 7 cli_vec_ansi 222.23µs 226.74µs 4370. 16.73KB 6.15
+#> 8 fansi_vec_ansi 109.93µs 122.31µs 8125. 5.59KB 8.23
+#> 9 base_vec_ansi 30.83µs 33.58µs 29509. 848B 0
+#> 10 cli_vec_plain 179.02µs 183.52µs 5397. 16.73KB 8.26
+#> 11 fansi_vec_plain 115.58µs 118.99µs 8329. 5.59KB 6.13
+#> 12 base_vec_plain 28.42µs 28.64µs 34697. 848B 0
+#> 13 cli_txt_ansi 106.78µs 110.72µs 8919. 0B 14.5
+#> 14 fansi_txt_ansi 52.23µs 55.24µs 17871. 872B 14.5
+#> 15 base_txt_ansi 1.06µs 1.1µs 882586. 0B 0
+#> 16 cli_txt_plain 97.69µs 101.71µs 9682. 0B 12.4
+#> 17 fansi_txt_plain 52.98µs 55.74µs 17730. 872B 14.7
+#> 18 base_txt_plain 991.04ns 1.03µs 909417. 0B 0
#> # A tibble: 18 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 338.01µs 349.26µs 2701. 266.74KB 12.5
-#> 2 fansi_ansi 98.22µs 103.69µs 8996. 10.3KB 12.4
-#> 3 base_ansi 39.3µs 41.33µs 23609. 0B 11.8
-#> 4 cli_plain 208.77µs 214.46µs 4595. 0B 10.3
-#> 5 fansi_plain 95.99µs 103.19µs 9566. 872B 14.7
-#> 6 base_plain 32.56µs 34.3µs 28766. 0B 11.5
-#> 7 cli_vec_ansi 34.45ms 34.57ms 28.9 2.48KB 21.7
-#> 8 fansi_vec_ansi 242.18µs 246.96µs 4010. 7.25KB 6.13
-#> 9 base_vec_ansi 2.26ms 2.31ms 431. 48.18KB 15.1
-#> 10 cli_vec_plain 20.8ms 21.01ms 47.6 2.48KB 16.8
-#> 11 fansi_vec_plain 202.9µs 207.45µs 4755. 6.42KB 8.23
-#> 12 base_vec_plain 1.62ms 1.67ms 594. 47.4KB 15.0
-#> 13 cli_txt_ansi 20.96ms 21.13ms 47.2 507.59KB 7.08
-#> 14 fansi_txt_ansi 229.43µs 234.52µs 4222. 6.77KB 6.12
-#> 15 base_txt_ansi 2.08ms 2.11ms 472. 582.06KB 8.54
-#> 16 cli_txt_plain 1.66ms 1.7ms 585. 369.84KB 6.31
-#> 17 fansi_txt_plain 183.31µs 188.79µs 5241. 2.51KB 8.24
-#> 18 base_txt_plain 1.33ms 1.36ms 732. 367.31KB 6.33
+#> 1 cli_ansi 309.85µs 336.63µs 2942. 266.74KB 14.6
+#> 2 fansi_ansi 96.2µs 101.14µs 9784. 10.3KB 12.4
+#> 3 base_ansi 39.47µs 41.7µs 23673. 0B 11.8
+#> 4 cli_plain 203.1µs 208.95µs 4702. 0B 12.4
+#> 5 fansi_plain 94.76µs 99.28µs 9928. 872B 14.6
+#> 6 base_plain 31.04µs 33.74µs 29125. 0B 11.7
+#> 7 cli_vec_ansi 33.48ms 33.82ms 29.6 2.48KB 19.7
+#> 8 fansi_vec_ansi 222.1µs 243.56µs 4063. 7.25KB 8.22
+#> 9 base_vec_ansi 2.23ms 2.31ms 432. 48.18KB 15.0
+#> 10 cli_vec_plain 20.23ms 20.55ms 48.6 2.48KB 15.2
+#> 11 fansi_vec_plain 198.29µs 202.67µs 4884. 6.42KB 8.22
+#> 12 base_vec_plain 1.61ms 1.64ms 608. 47.4KB 14.9
+#> 13 cli_txt_ansi 21.43ms 21.52ms 46.2 507.59KB 9.74
+#> 14 fansi_txt_ansi 225.61µs 228.96µs 4305. 6.77KB 6.11
+#> 15 base_txt_ansi 2.07ms 2.11ms 473. 582.06KB 6.39
+#> 16 cli_txt_plain 1.65ms 1.68ms 590. 369.84KB 8.58
+#> 17 fansi_txt_plain 180.79µs 185.22µs 5344. 2.51KB 8.23
+#> 18 base_txt_plain 1.34ms 1.36ms 730. 367.31KB 6.29
#> # A tibble: 18 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 6.28µs 6.82µs 143590. 23.84KB 14.4
-#> 2 fansi_ansi 76.67µs 79.98µs 12339. 28.48KB 14.6
-#> 3 base_ansi 992.91ns 1.03µs 935480. 0B 0
-#> 4 cli_plain 6.35µs 6.74µs 146212. 0B 14.6
-#> 5 fansi_plain 76.54µs 79.7µs 12368. 1.98KB 14.6
-#> 6 base_plain 961.01ns 1µs 964517. 0B 0
-#> 7 cli_vec_ansi 26.61µs 27.49µs 36145. 1.7KB 3.61
-#> 8 fansi_vec_ansi 113µs 116.31µs 8502. 8.86KB 10.5
-#> 9 base_vec_ansi 5.83µs 6.75µs 146744. 848B 0
-#> 10 cli_vec_plain 22.48µs 23.53µs 42158. 1.7KB 4.22
-#> 11 fansi_vec_plain 107.63µs 111.87µs 8850. 8.86KB 10.5
-#> 12 base_vec_plain 5.61µs 6.28µs 157703. 848B 0
-#> 13 cli_txt_ansi 6.59µs 7.1µs 137179. 0B 13.7
-#> 14 fansi_txt_ansi 77.48µs 81.94µs 11996. 1.98KB 14.6
-#> 15 base_txt_ansi 3.84µs 3.89µs 253893. 0B 0
-#> 16 cli_txt_plain 7.32µs 7.83µs 125535. 0B 12.6
-#> 17 fansi_txt_plain 77.59µs 81.9µs 12094. 1.98KB 12.5
-#> 18 base_txt_plain 2.65µs 2.71µs 358568. 0B 35.9
+#> 1 cli_ansi 6.45µs 7.01µs 139846. 23.84KB 14.0
+#> 2 fansi_ansi 77.55µs 81.21µs 12191. 28.48KB 14.6
+#> 3 base_ansi 981.03ns 1.02µs 935001. 0B 0
+#> 4 cli_plain 6.45µs 7.01µs 140123. 0B 14.0
+#> 5 fansi_plain 77.19µs 80.88µs 12211. 1.98KB 14.6
+#> 6 base_plain 951ns 1µs 959045. 0B 0
+#> 7 cli_vec_ansi 25.02µs 27.73µs 35788. 1.7KB 3.58
+#> 8 fansi_vec_ansi 110µs 117.28µs 8429. 8.86KB 10.5
+#> 9 base_vec_ansi 5.85µs 6.61µs 149374. 848B 0
+#> 10 cli_vec_plain 22.73µs 23.68µs 41859. 1.7KB 4.19
+#> 11 fansi_vec_plain 108.06µs 111.59µs 8844. 8.86KB 10.4
+#> 12 base_vec_plain 6.13µs 6.25µs 157840. 848B 0
+#> 13 cli_txt_ansi 6.4µs 7.04µs 138458. 0B 27.7
+#> 14 fansi_txt_ansi 75.57µs 80.55µs 12259. 1.98KB 12.5
+#> 15 base_txt_ansi 3.82µs 3.89µs 251606. 0B 0
+#> 16 cli_txt_plain 7.26µs 7.82µs 122329. 0B 24.5
+#> 17 fansi_txt_plain 77.08µs 80.61µs 12271. 1.98KB 12.5
+#> 18 base_txt_plain 2.65µs 2.69µs 360261. 0B 0
#> # A tibble: 12 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 105.32µs 108.69µs 9096. 11.87KB 10.3
-#> 2 base_ansi 1.31µs 1.36µs 708586. 0B 0
-#> 3 cli_plain 84.27µs 87.94µs 11133. 8.73KB 10.3
-#> 4 base_plain 1.01µs 1.05µs 915829. 0B 0
-#> 5 cli_vec_ansi 4.03ms 4.14ms 242. 838.77KB 18.1
-#> 6 base_vec_ansi 72.14µs 73.58µs 13539. 848B 0
-#> 7 cli_vec_plain 2.23ms 2.31ms 430. 816.9KB 17.6
-#> 8 base_vec_plain 42.92µs 43.7µs 22589. 848B 0
-#> 9 cli_txt_ansi 11.31ms 11.39ms 87.7 114.42KB 4.18
-#> 10 base_txt_ansi 73.72µs 74.07µs 13373. 0B 0
-#> 11 cli_txt_plain 243.13µs 247.35µs 4002. 18.16KB 4.05
-#> 12 base_txt_plain 41.71µs 41.9µs 23421. 0B 0
+#> 1 cli_ansi 105.1µs 108.75µs 9078. 11.87KB 10.3
+#> 2 base_ansi 1.28µs 1.34µs 721271. 0B 0
+#> 3 cli_plain 83.87µs 87.38µs 11265. 8.73KB 10.3
+#> 4 base_plain 1µs 1.04µs 925603. 0B 0
+#> 5 cli_vec_ansi 3.97ms 4.06ms 246. 838.77KB 17.9
+#> 6 base_vec_ansi 72.81µs 74.17µs 13434. 848B 0
+#> 7 cli_vec_plain 2.21ms 2.26ms 440. 816.9KB 20.0
+#> 8 base_vec_plain 43.58µs 44.49µs 22410. 848B 0
+#> 9 cli_txt_ansi 11.5ms 11.57ms 86.3 114.42KB 4.21
+#> 10 base_txt_ansi 73.2µs 73.73µs 13514. 0B 0
+#> 11 cli_txt_plain 241.42µs 246.16µs 4020. 18.16KB 4.05
+#> 12 base_txt_plain 41.6µs 42.55µs 23426. 0B 0
#> # A tibble: 12 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli_ansi 76.6µs 80.2µs 12236. 0B 12.4
-#> 2 base_ansi 17.8µs 19µs 51813. 0B 10.4
-#> 3 cli_plain 77µs 79.9µs 12305. 0B 12.4
-#> 4 base_plain 17.4µs 18.4µs 53450. 0B 16.0
-#> 5 cli_vec_ansi 155.4µs 160.7µs 6081. 7.2KB 6.13
-#> 6 base_vec_ansi 52.3µs 55.6µs 17703. 1.66KB 4.06
-#> 7 cli_vec_plain 142.4µs 148µs 6664. 7.2KB 8.24
-#> 8 base_vec_plain 47.4µs 51.9µs 18978. 1.66KB 4.05
-#> 9 cli_txt_ansi 133.2µs 138.1µs 7085. 0B 6.16
-#> 10 base_txt_ansi 35.8µs 36.8µs 26847. 0B 8.06
-#> 11 cli_txt_plain 118.1µs 122.2µs 8081. 0B 8.18
-#> 12 base_txt_plain 32.7µs 33.8µs 29304. 0B 5.86
+#> 1 cli_ansi 75.9µs 78.9µs 12490. 0B 14.5
+#> 2 base_ansi 17µs 18.1µs 54345. 0B 10.9
+#> 3 cli_plain 75.4µs 78.4µs 12554. 0B 14.7
+#> 4 base_plain 16µs 17.7µs 55992. 0B 11.2
+#> 5 cli_vec_ansi 153.2µs 158.8µs 6204. 7.2KB 6.12
+#> 6 base_vec_ansi 49.9µs 55.8µs 17700. 1.66KB 4.05
+#> 7 cli_vec_plain 140µs 146.4µs 6725. 7.2KB 8.23
+#> 8 base_vec_plain 46.5µs 52.3µs 18916. 1.66KB 4.05
+#> 9 cli_txt_ansi 131.7µs 134.3µs 7331. 0B 8.17
+#> 10 base_txt_ansi 35.5µs 36.4µs 27265. 0B 5.45
+#> 11 cli_txt_plain 115.3µs 119.7µs 8217. 0B 8.25
+#> 12 base_txt_plain 32.3µs 33.3µs 29697. 0B 8.91
#> # A tibble: 6 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli 8.55µs 9.18µs 107229. 12.3KB 10.7
-#> 2 base 861.01ns 901.05ns 1042162. 0B 0
-#> 3 cli_vec 25.5µs 26.9µs 36174. 448B 7.24
-#> 4 base_vec 11.57µs 11.68µs 84948. 448B 0
-#> 5 cli_txt 26.04µs 26.8µs 36996. 0B 3.70
-#> 6 base_txt 12.55µs 12.62µs 78484. 0B 0
+#> 1 cli 8.29µs 8.85µs 111167. 12.3KB 11.1
+#> 2 base 840.98ns 881.03ns 1054579. 0B 105.
+#> 3 cli_vec 25.36µs 26.11µs 37935. 448B 3.79
+#> 4 base_vec 11.33µs 11.92µs 83675. 448B 0
+#> 5 cli_txt 23.89µs 26.42µs 37599. 0B 7.52
+#> 6 base_txt 12.55µs 12.61µs 78744. 0B 0
bench::mark(
cli = utf8_nchar(uni, type = "width"),
@@ -726,12 +726,12 @@
#> # A tibble: 6 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli 8.51µs 9.13µs 107779. 0B 10.8
-#> 2 base 1.25µs 1.31µs 726827. 0B 0
-#> 3 cli_vec 29.57µs 30.4µs 32464. 448B 6.49
-#> 4 base_vec 44.58µs 46.04µs 21651. 448B 0
-#> 5 cli_txt 29.88µs 31.1µs 31883. 0B 3.19
-#> 6 base_txt 81.14µs 82.41µs 12072. 0B 0
+#> 1 cli 8.24µs 8.83µs 111792. 0B 11.2
+#> 2 base 1.27µs 1.32µs 717032. 0B 71.7
+#> 3 cli_vec 28.88µs 29.66µs 33475. 448B 3.35
+#> 4 base_vec 47.24µs 47.53µs 20956. 448B 0
+#> 5 cli_txt 29.46µs 30.49µs 32583. 0B 6.52
+#> 6 base_txt 76.69µs 83.16µs 11980. 0B 0
bench::mark(
cli = utf8_nchar(uni, type = "codepoints"),
@@ -745,12 +745,12 @@
#> # A tibble: 6 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli 9.11µs 9.88µs 99581. 0B 19.9
-#> 2 base 859.84ns 899.89ns 1061793. 0B 0
-#> 3 cli_vec 20.18µs 20.77µs 47704. 448B 9.54
-#> 4 base_vec 11.57µs 11.67µs 85018. 448B 0
-#> 5 cli_txt 21.06µs 21.63µs 45902. 0B 4.59
-#> 6 base_txt 12.56µs 12.62µs 78715. 0B 7.87
+#> 1 cli 8.99µs 9.62µs 102372. 0B 10.2
+#> 2 base 842.03ns 882.08ns 1058560. 0B 106.
+#> 3 cli_vec 19.82µs 20.83µs 47650. 448B 4.77
+#> 4 base_vec 11.35µs 11.55µs 85912. 448B 0
+#> 5 cli_txt 19.14µs 21.35µs 46502. 0B 9.30
+#> 6 base_txt 12.56µs 12.62µs 78552. 0B 0
#> # A tibble: 6 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 cli 6.1µs 6.53µs 142611. 21.1KB 14.3
-#> 2 base 1.03µs 1.07µs 881571. 0B 0
-#> 3 cli_vec 30.23µs 30.99µs 32074. 1.7KB 6.42
-#> 4 base_vec 8.29µs 8.52µs 116443. 848B 0
-#> 5 cli_txt 6.15µs 6.54µs 150614. 0B 15.1
-#> 6 base_txt 5.49µs 5.53µs 178603. 0B 17.9
+#> 1 cli 6.07µs 6.5µs 150618. 21.1KB 30.1
+#> 2 base 1µs 1.06µs 890198. 0B 0
+#> 3 cli_vec 30.02µs 30.98µs 32047. 1.7KB 3.21
+#> 4 base_vec 7.66µs 8µs 123624. 848B 12.4
+#> 5 cli_txt 6.05µs 6.47µs 151631. 0B 15.2
+#> 6 base_txt 5.46µs 5.53µs 178053. 0B 0
#> ─ Session info ─────────────────────────────────────────────────────────
#> setting value
-#> version R version 4.3.2 (2023-10-31)
-#> os Ubuntu 22.04.3 LTS
+#> version R version 4.3.3 (2024-02-29)
+#> os Ubuntu 22.04.4 LTS
#> system x86_64, linux-gnu
#> ui X11
#> language en
#> collate C.UTF-8
#> ctype C.UTF-8
#> tz UTC
-#> date 2024-02-14
-#> pandoc 2.19.2 @ /usr/bin/ (via rmarkdown)
+#> date 2024-03-16
+#> pandoc 3.1.11 @ /opt/hostedtoolcache/pandoc/3.1.11/x64/ (via rmarkdown)
#>
#> ─ Packages ─────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> bench 1.1.3 2023-05-04 [1] RSPM
#> bslib 0.6.1 2023-11-28 [1] RSPM
#> cachem 1.0.8 2023-05-01 [1] RSPM
-#> cli * 3.6.2.9000 2024-02-14 [1] local
-#> codetools 0.2-19 2023-02-01 [3] CRAN (R 4.3.2)
+#> cli * 3.6.2.9000 2024-03-16 [1] local
+#> codetools 0.2-19 2023-02-01 [3] CRAN (R 4.3.3)
#> desc 1.4.3 2023-12-10 [1] RSPM
-#> digest 0.6.34 2024-01-11 [1] RSPM
+#> digest 0.6.35 2024-03-11 [1] RSPM
#> evaluate 0.23 2023-11-01 [1] RSPM
#> fansi * 1.0.6 2023-12-08 [1] RSPM
#> fastmap 1.1.1 2023-02-24 [1] RSPM
@@ -822,14 +822,12 @@ Session info#> profmem 0.6.0 2020-12-13 [1] RSPM
#> purrr 1.0.2 2023-08-10 [1] RSPM
#> R6 2.5.1 2021-08-19 [1] RSPM
-#> ragg 1.2.7 2023-12-11 [1] RSPM
+#> ragg 1.3.0 2024-03-13 [1] RSPM
#> rlang 1.1.3 2024-01-10 [1] RSPM
-#> rmarkdown 2.25 2023-09-18 [1] RSPM
+#> rmarkdown 2.26 2024-03-05 [1] RSPM
#> sass 0.4.8 2023-12-06 [1] RSPM
#> sessioninfo 1.2.2 2021-12-06 [1] RSPM
-#> stringi 1.8.3 2023-12-11 [1] RSPM
-#> stringr 1.5.1 2023-11-14 [1] RSPM
-#> systemfonts 1.0.5 2023-10-09 [1] RSPM
+#> systemfonts 1.0.6 2024-03-07 [1] RSPM
#> textshaping 0.3.7 2023-10-09 [1] RSPM
#> tibble 3.2.1 2023-03-20 [1] RSPM
#> utf8 1.2.4 2023-10-22 [1] RSPM
@@ -838,8 +836,8 @@ Session info#> yaml 2.3.8 2023-12-11 [1] RSPM
#>
#> [1] /home/runner/work/_temp/Library
-#> [2] /opt/R/4.3.2/lib/R/site-library
-#> [3] /opt/R/4.3.2/lib/R/library
+#> [2] /opt/R/4.3.3/lib/R/site-library
+#> [3] /opt/R/4.3.3/lib/R/library
#>
#> ────────────────────────────────────────────────────────────────────────
vignettes/palettes.Rmd
palettes.Rmd
vignettes/pluralization.Rmd
pluralization.Rmd
vignettes/progress-advanced.Rmd
progress-advanced.Rmd
= PROTECT(cli_progress_bar(num_iters, NULL));
- SEXP bar for (i = 0; i < num_iters; i++) {
- if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
- // ...
- }
- (bar); cli_progress_done
SEXP bar = PROTECT(cli_progress_bar(num_iters, NULL));
+ for (i = 0; i < num_iters; i++) {
+ if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
+ // ...
+ }
+ cli_progress_done(bar);
In the C files you want to use the API from include
cli/progress.h
:
#include <cli/progress.h>
Now you are ready to call cli functions. The C API is similar to the traditional R API:
A complete example:
-() {
- SEXP progress_test1int i;
- = PROTECT(cli_progress_bar(1000, NULL));
- SEXP bar for (i = 0; i < 1000; i++) {
- (0, 4 * 1000 * 1000);
- cli_progress_sleepif (CLI_SHOULD_TICK) cli_progress_set(bar, i);
- }
- (bar);
- cli_progress_done(1);
- UNPROTECTreturn Rf_ScalarInteger(i);
- }
SEXP progress_test1() {
+ int i;
+ SEXP bar = PROTECT(cli_progress_bar(1000, NULL));
+ for (i = 0; i < 1000; i++) {
+ cli_progress_sleep(0, 4 * 1000 * 1000);
+ if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
+ }
+ cli_progress_done(bar);
+ UNPROTECT(1);
+ return Rf_ScalarInteger(i);
+}
cli_progress_add()
void cli_progress_add(SEXP bar, double inc);
Add a number of progress units to the progress bar. It will also trigger an update if an update is due.
cli_progress_bar()
(double total, SEXP config); SEXP cli_progress_bar
Create a new progress bar object. The returned progress bar object
must be PROTECT()
-ed.
#include <cli/progress.h>
-() {
- SEXP progress_test1int i;
- = PROTECT(cli_progress_bar(1000, NULL));
- SEXP bar for (i = 0; i < 1000; i++) {
- (0, 4 * 1000 * 1000);
- cli_progress_sleepif (CLI_SHOULD_TICK) cli_progress_set(bar, i);
- }
- (bar);
- cli_progress_done(1);
- UNPROTECTreturn Rf_ScalarInteger(i);
- }
#include <cli/progress.h>
+SEXP progress_test1() {
+ int i;
+ SEXP bar = PROTECT(cli_progress_bar(1000, NULL));
+ for (i = 0; i < 1000; i++) {
+ cli_progress_sleep(0, 4 * 1000 * 1000);
+ if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
+ }
+ cli_progress_done(bar);
+ UNPROTECT(1);
+ return Rf_ScalarInteger(i);
+}
cli_progress_set()
void cli_progress_set(SEXP bar, double set);
Set the progress bar to the specified number of progress units.
cli_progress_set_clear()
void cli_progress_set_clear(SEXP bar, int clear);
Set whether to remove the progress bar from the screen. You can call
this any time before cli_progress_done()
is called.
cli_progress_set_format()
void cli_progress_set_format(SEXP bar, const char *format, ...);
Set a custom format string for the progress bar. This call does not
try to update the progress bar. If you want to request an update, call
cli_progress_add()
, cli_progress_set()
or
@@ -606,7 +606,7 @@
cli_progress_set_name()
void cli_progress_set_name(SEXP bar, const char *name);
Set the name of the progress bar.
cli_progress_set_status()
void cli_progress_set_status(SEXP bar, const char *status);
Set the status of the progress bar.
cli_progress_set_type()
void cli_progress_set_type(SEXP bar, const char *type);
Set the progress bar type. Call this function right after creating
the progress bar with cli_progress_bar()
. Otherwise the
behavior is undefined.
cli_progress_update()
void cli_progress_update(SEXP bar, double set, double inc, int force);
Update the progress bar. Unlike the simpler
cli_progress_add()
and cli_progress_set()
function, it can force an update if force
is set to 1.
vignettes/progress-benchmark.Rmd
progress-benchmark.Rmd
ben_st2 <- bench::mark(
if (`__cli_update_due`) foobar()
@@ -144,8 +144,8 @@ The timerben_st2
#> # A tibble: 1 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
-#> <bch:expr> <bch:> <bch:> <dbl> <bch:byt> <dbl>
-#> 1 if (`__cli_update_due`) foob… 49.9ns 70ns 15096872. 0B 0
for
loop
@@ -191,10 +191,10 @@
ben_taf2 <- bench::mark(f0(1e6), fp(1e6))
#> Warning: Some expressions had a GC in every iteration; so filtering is
@@ -203,10 +203,10 @@
#> # A tibble: 2 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 f0(1e+06) 140ms 161ms 5.95 0B 57.5
-#> 2 fp(1e+06) 169ms 171ms 5.85 1.87KB 56.5
+#> 1 f0(1e+06) 142ms 165ms 5.85 0B 54.6
+#> 2 fp(1e+06) 167ms 167ms 5.94 1.84KB 55.4
(ben_taf2$median[2] - ben_taf2$median[1]) / 1e6
-#> [1] 9.48ns
ben_taf3 <- bench::mark(f0(1e7), fp(1e7))
#> Warning: Some expressions had a GC in every iteration; so filtering is
@@ -215,10 +215,10 @@
#> # A tibble: 2 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 f0(1e+07) 1.52s 1.52s 0.657 0B 37.5
-#> 2 fp(1e+07) 1.63s 1.63s 0.613 1.87KB 34.3
+#> 1 f0(1e+07) 1.5s 1.5s 0.666 0B 63.3
+#> 2 fp(1e+07) 1.72s 1.72s 0.582 1.84KB 54.7
(ben_taf3$median[2] - ben_taf3$median[1]) / 1e7
-#> [1] 10.9ns
ben_taf4 <- bench::mark(f0(1e8), fp(1e8))
#> Warning: Some expressions had a GC in every iteration; so filtering is
@@ -227,10 +227,10 @@
#> # A tibble: 2 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 f0(1e+08) 14.7s 14.7s 0.0681 0B 43.6
-#> 2 fp(1e+08) 16.7s 16.7s 0.0597 1.87KB 37.0
+#> 1 f0(1e+08) 14s 14s 0.0716 0B 30.2
+#> 2 fp(1e+08) 15.9s 15.9s 0.0628 1.84KB 26.5
(ben_taf4$median[2] - ben_taf4$median[1]) / 1e8
-#> [1] 20.6ns
lapply()
@@ -271,11 +271,11 @@ lapply()
#> # A tibble: 3 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 f0() 72.9ms 80.9ms 12.5 781KB 17.9
-#> 2 f01() 91ms 97.7ms 9.05 781KB 12.7
-#> 3 fp() 109.7ms 121ms 7.75 783KB 15.5
+#> 1 f0() 76.7ms 81.9ms 9.53 781KB 17.1
+#> 2 f01() 93.9ms 101.2ms 9.39 781KB 20.7
+#> 3 fp() 114.7ms 142.4ms 7.28 783KB 20.0
(ben_tam$median[3] - ben_tam$median[1]) / 1e5
-#> [1] 402ns
ben_tam2 <- bench::mark(f0(1e6), f01(1e6), fp(1e6))
#> Warning: Some expressions had a GC in every iteration; so filtering is
@@ -284,13 +284,13 @@ Mapping with lapply()
#> # A tibble: 3 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 f0(1e+06) 742.36ms 742.36ms 1.35 7.63MB 4.04
-#> 2 f01(1e+06) 957.92ms 957.92ms 1.04 7.63MB 6.26
-#> 3 fp(1e+06) 1.23s 1.23s 0.814 7.63MB 4.07
+#> 1 f0(1e+06) 767.93ms 767.93ms 1.30 7.63MB 3.91
+#> 2 f01(1e+06) 969.88ms 969.88ms 1.03 7.63MB 6.19
+#> 3 fp(1e+06) 1.25s 1.25s 0.798 7.63MB 3.99
(ben_tam2$median[3] - ben_tam2$median[1]) / 1e6
-#> [1] 487ns
+#> [1] 485ns
(ben_tam2$median[3] - ben_tam2$median[2]) / 1e6
-#> [1] 271ns
ben_pur2 <- bench::mark(f0(1e6), f01(1e6), fp(1e6))
#> Warning: Some expressions had a GC in every iteration; so filtering is
@@ -344,13 +344,13 @@ Mapping with purrr#> # A tibble: 3 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 f0(1e+06) 756.93ms 756.93ms 1.32 7.63MB 2.64
-#> 2 f01(1e+06) 960.55ms 960.55ms 1.04 7.63MB 4.16
-#> 3 fp(1e+06) 1.34s 1.34s 0.749 7.63MB 2.99
+#> 1 f0(1e+06) 801.64ms 801.64ms 1.25 7.63MB 3.74
+#> 2 f01(1e+06) 959.61ms 959.61ms 1.04 7.63MB 3.13
+#> 3 fp(1e+06) 1.39s 1.39s 0.718 7.63MB 3.59
(ben_pur2$median[3] - ben_pur2$median[1]) / 1e6
-#> [1] 579ns
+#> [1] 592ns
(ben_pur2$median[3] - ben_pur2$median[2]) / 1e6
-#> [1] 375ns
ben_api2 <- bench::mark(f0(1e6), ff(1e6), fp(1e6))
#> Warning: Some expressions had a GC in every iteration; so filtering is
@@ -444,67 +444,67 @@ Traditional API#> # A tibble: 3 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 f0(1e+06) 129.5ms 130.2ms 7.65 0B 7.65
-#> 2 ff(1e+06) 193.3ms 195ms 5.14 1.87KB 5.14
-#> 3 fp(1e+06) 23.4s 23.4s 0.0428 1.87KB 2.31
+#> 1 f0(1e+06) 130.5ms 130.8ms 7.60 0B 7.60
+#> 2 ff(1e+06) 185.9ms 188.7ms 5.30 1.84KB 5.30
+#> 3 fp(1e+06) 22.8s 22.8s 0.0439 1.84KB 2.37
(ben_api2$median[3] - ben_api2$median[1]) / 1e6
-#> [1] 23.2µs
+#> [1] 22.7µs
(ben_api2$median[2] - ben_api2$median[1]) / 1e6
-#> [1] 64.8ns
Baseline function:
-() {
- SEXP test_baselineint i;
- int res = 0;
- for (i = 0; i < 2000000000; i++) {
- += i % 2;
- res }
- return ScalarInteger(res);
- }
SEXP test_baseline() {
+ int i;
+ int res = 0;
+ for (i = 0; i < 2000000000; i++) {
+ res += i % 2;
+ }
+ return ScalarInteger(res);
+}
Switch + modulo check:
-(SEXP progress) {
- SEXP test_moduloint i;
- int res = 0;
- int progress_ = LOGICAL(progress)[0];
- for (i = 0; i < 2000000000; i++) {
- if (i % 10000 == 0 && progress_) cli_progress_set(R_NilValue, i);
- += i % 2;
- res }
- return ScalarInteger(res);
- }
SEXP test_modulo(SEXP progress) {
+ int i;
+ int res = 0;
+ int progress_ = LOGICAL(progress)[0];
+ for (i = 0; i < 2000000000; i++) {
+ if (i % 10000 == 0 && progress_) cli_progress_set(R_NilValue, i);
+ res += i % 2;
+ }
+ return ScalarInteger(res);
+}
cli progress bar API:
-() {
- SEXP test_cliint i;
- int res = 0;
- = PROTECT(cli_progress_bar(2000000000, NULL));
- SEXP bar for (i = 0; i < 2000000000; i++) {
- if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
- += i % 2;
- res }
- (bar);
- cli_progress_done(1);
- UNPROTECTreturn ScalarInteger(res);
- }
() {
- SEXP test_cli_unrollint i = 0;
- int res = 0;
- = PROTECT(cli_progress_bar(2000000000, NULL));
- SEXP bar int s, final, step = 2000000000 / 100000;
- for (s = 0; s < 100000; s++) {
- if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
- = (s + 1) * step;
- final for (i = s * step; i < final; i++) {
- += i % 2;
- res }
- }
- (bar);
- cli_progress_done(1);
- UNPROTECTreturn ScalarInteger(res);
- }
SEXP test_cli() {
+ int i;
+ int res = 0;
+ SEXP bar = PROTECT(cli_progress_bar(2000000000, NULL));
+ for (i = 0; i < 2000000000; i++) {
+ if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
+ res += i % 2;
+ }
+ cli_progress_done(bar);
+ UNPROTECT(1);
+ return ScalarInteger(res);
+}
SEXP test_cli_unroll() {
+ int i = 0;
+ int res = 0;
+ SEXP bar = PROTECT(cli_progress_bar(2000000000, NULL));
+ int s, final, step = 2000000000 / 100000;
+ for (s = 0; s < 100000; s++) {
+ if (CLI_SHOULD_TICK) cli_progress_set(bar, i);
+ final = (s + 1) * step;
+ for (i = s * step; i < final; i++) {
+ res += i % 2;
+ }
+ }
+ cli_progress_done(bar);
+ UNPROTECT(1);
+ return ScalarInteger(res);
+}
library(progresstest)
ben_c <- bench::mark(
@@ -517,10 +517,10 @@ C benchmarks#> # A tibble: 4 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
-#> 1 test_baseline() 619.69ms 619.69ms 1.61 2.08KB 0
-#> 2 test_modulo() 1.25s 1.25s 0.802 2.24KB 0
-#> 3 test_cli() 1.25s 1.25s 0.800 23.69KB 0
-#> 4 test_cli_unroll() 619.57ms 619.57ms 1.61 3.34KB 0
+#> 1 test_baseline() 616.93ms 616.93ms 1.62 2.08KB 0
+#> 2 test_modulo() 1.23s 1.23s 0.811 2.24KB 0
+#> 3 test_cli() 1.24s 1.24s 0.808 23.66KB 0
+#> 4 test_cli_unroll() 619.51ms 619.51ms 1.61 3.31KB 0
(ben_c$median[3] - ben_c$median[1]) / 2000000000
#> [1] 1ns
cli_progress_bar(total = NA)
bench::mark(cli_progress_update(force = TRUE), max_iterations = 10000)
-#> ⠙ 1 done (437/s) | 3ms
-#> ⠹ 2 done (73/s) | 28ms
-#> ⠸ 3 done (87/s) | 35ms
-#> ⠼ 4 done (97/s) | 42ms
-#> ⠴ 5 done (104/s) | 49ms
-#> ⠦ 6 done (109/s) | 56ms
-#> ⠧ 7 done (113/s) | 63ms
-#> ⠇ 8 done (116/s) | 70ms
-#> ⠏ 9 done (119/s) | 76ms
-#> ⠋ 10 done (121/s) | 83ms
-#> ⠙ 11 done (123/s) | 90ms
+#> ⠙ 1 done (425/s) | 3ms
+#> ⠹ 2 done (71/s) | 29ms
+#> ⠸ 3 done (85/s) | 36ms
+#> ⠼ 4 done (95/s) | 43ms
+#> ⠴ 5 done (102/s) | 50ms
+#> ⠦ 6 done (107/s) | 56ms
+#> ⠧ 7 done (112/s) | 63ms
+#> ⠇ 8 done (115/s) | 70ms
+#> ⠏ 9 done (118/s) | 77ms
+#> ⠋ 10 done (120/s) | 84ms
+#> ⠙ 11 done (122/s) | 91ms
#> ⠹ 12 done (124/s) | 97ms
-#> ⠸ 13 done (126/s) | 104ms
+#> ⠸ 13 done (125/s) | 104ms
#> ⠼ 14 done (127/s) | 111ms
#> ⠴ 15 done (128/s) | 118ms
#> ⠦ 16 done (129/s) | 125ms
-#> ⠧ 17 done (129/s) | 132ms
-#> ⠇ 18 done (130/s) | 139ms
-#> ⠏ 19 done (131/s) | 146ms
-#> ⠋ 20 done (132/s) | 153ms
-#> ⠙ 21 done (132/s) | 160ms
-#> ⠹ 22 done (133/s) | 166ms
-#> ⠸ 23 done (133/s) | 173ms
-#> ⠼ 24 done (134/s) | 180ms
-#> ⠴ 25 done (133/s) | 189ms
-#> ⠦ 26 done (131/s) | 200ms
-#> ⠧ 27 done (131/s) | 207ms
-#> ⠇ 28 done (132/s) | 213ms
-#> ⠏ 29 done (132/s) | 220ms
-#> ⠋ 30 done (132/s) | 227ms
-#> ⠙ 31 done (133/s) | 234ms
-#> ⠹ 32 done (133/s) | 241ms
-#> ⠸ 33 done (134/s) | 248ms
-#> ⠼ 34 done (134/s) | 254ms
-#> ⠴ 35 done (134/s) | 261ms
-#> ⠦ 36 done (135/s) | 268ms
-#> ⠧ 37 done (135/s) | 275ms
-#> ⠇ 38 done (135/s) | 282ms
-#> ⠏ 39 done (135/s) | 289ms
-#> ⠋ 40 done (136/s) | 296ms
-#> ⠙ 41 done (136/s) | 302ms
-#> ⠹ 42 done (136/s) | 309ms
-#> ⠸ 43 done (136/s) | 316ms
-#> ⠼ 44 done (136/s) | 324ms
-#> ⠴ 45 done (136/s) | 330ms
-#> ⠦ 46 done (137/s) | 337ms
-#> ⠧ 47 done (137/s) | 344ms
-#> ⠇ 48 done (137/s) | 351ms
-#> ⠏ 49 done (137/s) | 358ms
-#> ⠋ 50 done (137/s) | 364ms
-#> ⠙ 51 done (138/s) | 371ms
-#> ⠹ 52 done (138/s) | 378ms
-#> ⠸ 53 done (138/s) | 385ms
-#> ⠼ 54 done (136/s) | 396ms
-#> ⠴ 55 done (137/s) | 403ms
-#> ⠦ 56 done (137/s) | 410ms
-#> ⠧ 57 done (137/s) | 417ms
-#> ⠇ 58 done (137/s) | 424ms
-#> ⠏ 59 done (137/s) | 430ms
-#> ⠋ 60 done (137/s) | 437ms
-#> ⠙ 61 done (138/s) | 444ms
-#> ⠹ 62 done (138/s) | 451ms
-#> ⠸ 63 done (138/s) | 458ms
-#> ⠼ 64 done (138/s) | 465ms
-#> ⠴ 65 done (138/s) | 472ms
-#> ⠦ 66 done (138/s) | 479ms
-#> ⠧ 67 done (138/s) | 485ms
-#> ⠇ 68 done (138/s) | 492ms
-#> ⠏ 69 done (138/s) | 499ms
-#> ⠋ 70 done (139/s) | 506ms
-#> ⠙ 71 done (139/s) | 513ms
-#> ⠹ 72 done (139/s) | 520ms
-#> ⠸ 73 done (139/s) | 527ms
+#> ⠧ 17 done (130/s) | 132ms
+#> ⠇ 18 done (131/s) | 138ms
+#> ⠏ 19 done (128/s) | 149ms
+#> ⠋ 20 done (129/s) | 156ms
+#> ⠙ 21 done (130/s) | 162ms
+#> ⠹ 22 done (130/s) | 169ms
+#> ⠸ 23 done (131/s) | 176ms
+#> ⠼ 24 done (132/s) | 183ms
+#> ⠴ 25 done (132/s) | 190ms
+#> ⠦ 26 done (132/s) | 197ms
+#> ⠧ 27 done (133/s) | 204ms
+#> ⠇ 28 done (133/s) | 211ms
+#> ⠏ 29 done (134/s) | 217ms
+#> ⠋ 30 done (134/s) | 224ms
+#> ⠙ 31 done (134/s) | 231ms
+#> ⠹ 32 done (135/s) | 238ms
+#> ⠸ 33 done (135/s) | 245ms
+#> ⠼ 34 done (135/s) | 252ms
+#> ⠴ 35 done (135/s) | 259ms
+#> ⠦ 36 done (136/s) | 266ms
+#> ⠧ 37 done (136/s) | 273ms
+#> ⠇ 38 done (136/s) | 280ms
+#> ⠏ 39 done (136/s) | 287ms
+#> ⠋ 40 done (137/s) | 293ms
+#> ⠙ 41 done (137/s) | 301ms
+#> ⠹ 42 done (137/s) | 308ms
+#> ⠸ 43 done (137/s) | 314ms
+#> ⠼ 44 done (137/s) | 321ms
+#> ⠴ 45 done (137/s) | 328ms
+#> ⠦ 46 done (138/s) | 335ms
+#> ⠧ 47 done (138/s) | 342ms
+#> ⠇ 48 done (138/s) | 349ms
+#> ⠏ 49 done (138/s) | 356ms
+#> ⠋ 50 done (138/s) | 363ms
+#> ⠙ 51 done (138/s) | 369ms
+#> ⠹ 52 done (138/s) | 376ms
+#> ⠸ 53 done (138/s) | 383ms
+#> ⠼ 54 done (139/s) | 390ms
+#> ⠴ 55 done (139/s) | 397ms
+#> ⠦ 56 done (139/s) | 404ms
+#> ⠧ 57 done (139/s) | 411ms
+#> ⠇ 58 done (139/s) | 418ms
+#> ⠏ 59 done (139/s) | 424ms
+#> ⠋ 60 done (139/s) | 431ms
+#> ⠙ 61 done (139/s) | 438ms
+#> ⠹ 62 done (140/s) | 445ms
+#> ⠸ 63 done (140/s) | 452ms
+#> ⠼ 64 done (140/s) | 459ms
+#> ⠴ 65 done (140/s) | 466ms
+#> ⠦ 66 done (140/s) | 472ms
+#> ⠧ 67 done (140/s) | 479ms
+#> ⠇ 68 done (140/s) | 486ms
+#> ⠏ 69 done (140/s) | 493ms
+#> ⠋ 70 done (140/s) | 500ms
+#> ⠙ 71 done (140/s) | 507ms
+#> ⠹ 72 done (140/s) | 514ms
+#> ⠸ 73 done (140/s) | 520ms
+#> ⠼ 74 done (141/s) | 527ms
#> # A tibble: 1 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:> <bch:> <dbl> <bch:byt> <dbl>
-#> 1 cli_progress_update(force = … 6.74ms 6.87ms 144. 198KB 2.03
+#> 1 cli_progress_update(force = … 6.73ms 6.85ms 146. 198KB 2.02
cli_progress_done()
vignettes/progress.Rmd
progress.Rmd
vignettes/semantic-cli.Rmd
semantic-cli.Rmd
-#> This is sub-process 12275 from callr -#> [1] 12275 +#> This is sub-process 12391 from callr +#> [1] 12391
vignettes/usethis-ui.Rmd
usethis-ui.Rmd
S{T>A1-M#vkaYQMoV|z<4dWqUzr%9X#ITOFvbCIL=UDoMQfWnfu4Nv~ zeMjy|pF5{~T00lYP%h4WE}gS)U*0Bfvu*{Bf+1rA;PynnnPE)!oYozcjVj-nEYuY{ zC_crX%9!jq@`zKSh{r157<^@9;S2xn35U!OPjVN?no?_%8o&Gcr7@7bH*Nbv$)C}e z;p>R0DJFfbi{(N1HwIvyl{9Ynn0jJTzLM?lRZFW|y6mcw-i=W?b!%_TtLwTz3E_Je zGhcw+^ss9KDKhpFOP@9Cb4KAjbu0mpE_q+UMr@Ma zQ6_@ylGRFm+Vm-W$=!w~tXW6ZUgYG1cFnfe75mgrX*7Z9PbSZ)3Epa?Lw$z2theejAAHtKg=$`GnlEaJS7SKNYC01%r xkl;hq`Ah !GH)S1E+9u^3Qu!Rx_2-Fp zD~bz0oW!D~v+u^Fc^S?3D>4#9aO3UM9O<&tOSmx+JX8>Pi*}SN23;z4G{RgT2?}{4 z^N)p@jVh{9bq+rC)B63LBb u)A{UsL#ROmg+Yu4{H1InKQ%2}E9mlA=>b12rt{|Nc``B~Bx{Q}bz)+(J_ zzcywBX{~A?9--@*Lz%1b%ID*w-%fe7oifVyU*2}gbt=YtK3kq|Ii6>H4XYt@PSwY7 zCrvT+d5s}tqdh-0^p3RJM+X_9*-;Co>n1a8sor|x=2j++ZT_`FvGT4Qw0`dmqutA6 zW1`)QXEPdYDTy@M{HD6{p?ruj=wULNGWsm4**SXpbCGqGk2h~!(0*t?mM&;8RVs;e z0EN~!)~!54^>wA2bc*Jt!AOBF 2DpX6Peu&phC)Rgb@2?cGOg=$HMK)f+1D gL4ezCN99|IVZ#`zS+i*1Ze0OsS2ZMOy3*<2oy%zTvAS^QF3q_{u_gz9G-Jr|qZh zcY)mZ49xV!ABwE``Z2&244x5}FXa`BLi#gro0RQ=0_eXEk3m0viZFk^N`TUUjD>*x zeC7^^()fI$mi@mRQV)U+lIRmffc^>%0}TZQLjnN>hJxUM{^a~GiHM0RLi~du`S^fd zeg}OXhyrrZ00J`mze>nWsKn2V1Ogi3zjq#AAfP@qjQ{N^AfVjMEnFZeAs{SW3~eBP zeAZ(?!2FL11u6Dl>rVvYQ~&H70_t;Y5KtWu5FQ!9tMI8w;&t3tWmQBDQ83CP#YX`6 zDFcle&cG6y5(6wmk}#5<3>NDC3|L5KC~ Hq_oVA1}@N!lK@gQLiG!b npv5{L7mD)4m=q6MePUv~KQMOWrf-yJv24`hhJ-OrP} zyM!|o_v9@g_8>SII ->{aK*x5z0a0o=WM3~l2K2`-pDm%2BW z$(-Y =Eya4wzd5b&taBY@u$4FCALPkkvi-;;&l_ zkKRoF!Q$&!m{mao!CN~Qy*}H#x4x)Tg&01ajP#GzTFAs$*)PgH-Dcv3j1>&8ki-d_ zQI4420YfE_Hz+DoFPsIoEWR>Yf!FMhP%!{d7sdVS%eStcJ?MyRcp%N7z4V)_pX6!n z3(@ bV% zxIGEjc^O*?J=F$JNKSd}*c>9OF(@Y;ZYtcc+Mkg3GTfxNL5_1!Ruy&<0Ue8r!Gt&< zfx|aeJ3Zmd1xBgKUJczVUO5VLXP^BChQlu=7Oc#6)w`T8f{qHGCD4DR-vSFVxd`*| zOZ>L#$9m(zOONy|SkA*D8zK92k!x7U^m>6HTyBTX!)S)XN$dT_0q<7w@Ybu2?zU9s zquRCF?KA6QsGDEzRIR9cOtAXU?eXhDj?Do>Krqw;!iBIC{a`d~%nK0(c|@z*5a#V! zqq!Jsag{x5jGn&z&~oecnF(<`D-M_uk>(H^##Oi-OG(I8DE@`@QlAGFnWPolxVcwa zTwonH{>V=cS^x!wE@$(kXa7Zph}ykspOdT_9X*_cx6NmuDy2j~!6INu1q(9tv38su+np-Cq&rsMA z%q_<9Mph)>V!ylV4I(o$cR;z;%INE=GLQ52zdnb0@F0}w8an0;mKJB2IuMK<8u4V9 zEcQle$+<$)k$UoVKs|Wr8Gt=61%CZ36vCdD196|Sa{InjW1S6dK=&am4DdmKMqFSH zyas9N3dL=NU!S5VLHswZZhGcfWTitqt^QqNM=DoZPgtJasnuRbjee*joV~yu@2GD1 zP1zHE*z9`u5wNRIwSSjPN-XH?*%#6$iHUM+&s7r=kjzx<-TjfXUA_0?=1pIS?(wXY z{92%b+2cb0$FAdh!}k3F!p*y4H^U>ryVUO4NpZkZeYUiKL^p=F{D;h@^O-&D7QY|$ zHQ%*l&r$2|j?lTm-uti~v;8-93wa>?AlH6p$`EY~=Bf5_lmJ&Q!q;82Z$yC(Fi+mF z^I6jo*I!C-dzLVaP?ewqx}z6x6v@Pyf>fnu6yf%buDpLR!HmoDWZ$C2!tbDUHTk;| z)?`6*rTX9F*L=X-(LlZ_{nJ7^=7l=-5RUq~Jl3ZR+fTDDPc-I0>?sh?Jqdq>^QP$$ zE5HSL#wVaQKKBR(4D-h$RAT?kS<(<&35sHKg^*Q8l(u?Z*zVd5;c!niJfg|0jD$Op zABj*oSs$13i6rNHSVGCH^o1wky>;(+fB3@ei;EE=j?oxh1Rr434)(%hC|mc2Vkk@Y zN@6J2_kIgcJ*$Z)+r{`5=ee$)kjoUz_Zb%NO^!GEs7)en_nerXSLA5P%&=(kex)jl z5gWykIc=5EkYz0fkv%Y5%Uokco+%OZ+%`ol2ioX{hjmv Bk*^mvQ8q z%J7Yj=|XlZ3R~8OEPR&{+#5TWq +@#J7^p8qc=ziYcAkn=4B>$}H*{l!_0wC5J1WeL#(9YF7aX@M@^3R~R=H~TN5yz` zjii|JyXEoJd&&%(B0mKRcUz#-Zr`t=V<-tt9D!*UQPSn~_{Wb{o%@c=m|*WH534_1 z1ujRt$DA)=s%E@1k -* z5=JpBr_GpbPYt`rBHG~<%JV}`-D>#}2aZTP@~nE%^dUKTVo&Vl$okODl0Cv|70hhC zxaq)?*3%atzR9>Ez!&$d#MP|;53f5wdWm%;+^n}pbWjbn(@yny(NwE~v3U1+d6Ro> z4yCi`&m5xos?D?5JvTk76bd>90V1B8g3^$#RD$B3$cjZB$b!22X-Bsh-<;FzJtue8 zaf+2a(w>r!2qt44sbKfTGsHa^ud Pyj(Ms*(u+`}q7^AxKLO+@R`=kILe>i32wVY>G_`<@yb zfdU_8F;sm5>U#ppQNI6J>=%57Z|k20+4_rs47f(BfCvF0RdlpFtWw%1O} y5yL zgzutEdjiRkD*TPJ`l(dFtD;xzCrgi_1lH32KS(a1E%t#_D6r5+T8Uf*`{q{TR3<== z?n2VHOXelPKu8`wHv4nlyy0J&&wO1^0>*C17G>?5C(TE^zO&v_-G5%uS7f$((gDH5 z=Xe93qP^iMu2SO9t_c;x+tQvBJ|W10_f 9i9gcRB_yvZqb~y zkHREL_mG@<{Bs5(xd?Lcn6z^FoWspazY8p_6NRp{Z*yuDnfPQux%9Mbv9*+P!d&IP zd$=XclP5zIMYp6}bKJ8vv3S6(1fKk9wGZM`rg2*)#y#DJh%ZX~C4~@i5&SU7ZBF9` z3^U7f )&osnKPGkyTqr5+T?vrz1*cHOKDK#fyb`g pu<^fieuEdvwg7A2@={}5=la-!-piYe^J}vb7Z}Tt+*$OLui+G+P&!11bJ^*S_VnXKTCHQa5 z2nffDg`0CzmGqL+n$|#m@l^!!tfuJqYZaNb%x0+R#BfcF8RPJjJ+75f6YG?RCjCvl zPSaQ18^BuPIZb2(;9 =me{>~HYo~PB5AiYOGNrsCMhP(IhSEKy z;d^Sd{jNYIe-4h%CY>2eW=WwOx9 xV5AuS~7KddnGY@UC#tEs~@J2;`4)}WZ@;^Nv0+m&PfLt zZ=6-6eN$xv84JLQ>ozNGWih1EfsXmzaWqzx#!Q;L?&=FURO@Cp{cw%$#y8qs^9AIB zu%(~;sbrJ2jX!9}P^^^Qt&~H_CfhEwRQd^;&O}g!sy9f&OGYlPyw{#Qy-TECCWfc6 z8;AJpK;3 i>Y`>jw=*QWH}zae|Ub!n<*BsZlX&*B!Zzw_iG&+P#7qo-&16sXU1 z-lWd%Ro_(nW(R9Lml<8Yc8YE}81c|%piZKs1R3s}ve2y)T_U4|g!VpOX`~Vqg&g(X z?hLR{GkmcRP1-@%-qO-CYix>oTX;9)U(0IBCbWk>7ieD&S&4G1k7{syXpwK?ZJOR} zqHLN^UJGsN{WTP|`*8ip!;*z9Ipnq1cm0QlQz52)cm2^#hv;nY$kFySw@ua+eEOpd zrTS8Nqr6S=-e PY#OlxrEg+70c zo76?=g;vwqjGa=u;+p+pSKVpuPgOqzq^PKOZQQhT5<*9=Q*!8iG~9GayTs^);_t1^ z4GK%g*w6Xz1YBd}?jFa4&!kSpLF|3OJ9R7qI@p6j?Y%yR1Y}?uGHyyal=@zTu=Up( z9tMPRIUDk|@l`E;u_^%BQqRK(xw{=vYdLDG_63*MGS%uF*Amu8^RToHmU|d=f3BlR z2YGZ9`d)&gRtBzqc*L$(EmPH>t$q+{EA;o)zVEI1ACWo<4Zf=srj}z3#;f%AQk}E0 zE?RiWcH;Yki{n+EoM`FSc4wKA@n zVa{)i_Kzlx-iEE8g{`xRRpF8?T~7@oRRIda*73xuI;_siM!IRqv8VSq^W3 zQhlCC#s?p_=165rc;_ DN%SC7%F_dR=70X*!sb-8w)`BuJQ##~l= Azi^R{z?oXnl@b@KHZ2BP#d(cx+DsUujnK z;~G!`M=+s(x#|4z1)8QORjPY;L+QSRKVuRKKJVs(1Uo!Olx2Z7Pt}aw8t!uFYQKb9 z_dz%>?LF47K2mCDUo~F3#uVzfZ6M2*jJ$^UxgN})9vA$&++N1J9=C|RKFqgPr=INZ z4*>8V{U50dubKW_Px)NumhVT|EkD=cG@Gr@3BWNMMll{H0(?aHF9Qj?wAU4W-P~6o zFjRPT&&QDLUJZ}HX1G8mmU(}$qocP_9(k0|FM!s)$wFe8 HFn zj$_Il*xUv_4v253Mu%Vr9tX3Dv%x~yt_uyXAaerZqmQgtKcB_NvadhGL>68@Zr@%V zuPrV=xQL&K8!v1m=gZyCWy=SV=f{9+UzKgF*T$Oae3w(2qU4Q#>I^kCkDY6r+57B1 zyO{`#Jm;+vVsl68=RbGagN*EfC=2!u1XkFqYG)YfE1PbP0@O|6XDgU)rUJZ8O{7iw z9n&Fe?8`@8P4+gG7bNYYc6I!pUQky|KnB?7IiViPw?au6Gi}kK?H==CQy_{DHSG{U z3lyLR4Y%K9bue2Wpmb`>=l`-qw=Fxf!mpgEbj9EJ)jS7%PXf?DS%3xBWtEzrtnjH# z{V7^H`Qgdwp{C!jz#{oD?OKrVF3xubH>=9dt0L>v(3F(lz%X>2JS*88kKWLUIDcUp z`z{Z6hCHkPL1%7B&8rPg%xz1_$oCoxUKMAWyL1XBB2zyxbP6P*T{=Z|Y9uOrU&H1; zopDMa${!l7T$PkKbz~EL8NC1oM9x4uH6zEp++(z=E6%bPC}WT21FPhw#|~Hlie|Zb zfNJj12w=kaV)}t;r~KgwjVC7O1tuY*{fSSVFes_nHG^SB(xg<7YRn~oVQJ_9I+KR@ zgyKmiJH`H<@=4*n^!C8qNB+IA`V^pLD|-NymZvV&sgTsE%w9dyci;%n7o4Xy34Yi8 zb((NfD@a-HQb$mvJ>0sgNp%YARCGxSKK@geQbiqlddQ|)ow9U?tXTp+Yk$t|Dwe(T z(JdQuY4y#~KWl!@^sN>OVw~ppDcw5OdYjR!QSac(iQ(ne^H(^`^KcUo%Cd+!r%boE zU)}ZiS_caE_}M|FhixC$+>d(Q!~@rUsC(=wG4!$*=&0k3mpN5GJh^l1Llj;;kkU8p zpm6NJ(P6wy?()qm)Mq;F0+-J?MM&@t1-fR57#|oy-lx2C?10GEytxy^!h?ty*c*FQ zA)RW5SET)geZ1Eht52@{TYZJJ$L8OVl_mv`o_9382G>5>CcRYSv(VNi5swuv#9N#E zE16XLi3(4T1+Ac^3R8~_E@XR+@~a|SG_2*K9mX{VhK5DMxW-ybuD+~#?3s;;di4uV zUeScR+3>qXE#6;iBe<)|lXE`%MjMJuvsF%ih)7bbxLY;7Mi^JM?dE*hWMWcgR`oBZ ze>)W;$G5xG2;>xx1_JT;vgb@gkW;Yluso&hlX&?=4^O2$bwP>TcT8#3#wKxsBoX%_ zPdeEN%q~UVrS<#PnT%U!I#1&IDf;(F4NLZ??|i==W{^zvH>BDu*iXtPOoePoU#w+$ zg}IaMR%P1GsGM@_=-^MxoNAhqN!#)>O87^l+v+na+J|Y|$}`H^M=aagGpY#p`7TJ8 ztQ9>)nG>afaj&|}$<+5~o-)iyBfvC)%081aJ=&?`pEnE-r jeCA=4=epOD+kI*u*o{Zeod5^e=WE&NHC-YmaeF}l9o(vK z*ufEf!Hck&Yh8;A3Jv)-)Gki#xhZP{ZjBqZIY@PH<#zSe=M?-C(M`tZCj1KuwPUtT z8~&HxRX*WacCf&9KaI?VH7vKdHyb~VA2#S?j$ GjE+us{{rzeq0M_YMQ~77+T}@xbM%}ipJK5zptP9!+-8!u2BF=bz)(|I zc$vg->4$(gppOnJYnw5YIz$^&0GrkSnD$wlcYN5B=A3`447la{a %s>>eej$4I*5#zOHMP2WUv9oA`)+4e K{>|X1h^dq$4(Moqp&);YI%1_Dn z78=`6t<|S4$P{qsN8U&D^p?bEg^u93`*)Q=h3+Z?a*5D9fwJ~!cDtm}S$&r5FMlj3 zumW9aVcgmW#*fAdoOmlps VDkr|sUYE0yN%F00vapgOK9ShpUo{{(#-|Fxx^q> zsA&3-L>RhpvD *)~|lw1%w5m#rBCsl6aJ#E~i1E z+x5*o=1Es8$cy#6YyaR!sso5_kRI2k==R61T4`)r5u4V7wCtMoa}ShdIT%7Jv#T}) z_}tFUw*$Cx#$nm4dwT{tc-P#|z=+zxbH(l;K6b)I@ddN8>$ $hU{k;6azlVZb8tYKz{Ak#BqPZ;mxILVMN zc7;wSv){eL*gNm29tj=MZW!`5QHSOw28v3g5! I{15D%tFR^DdiAE3 zIe0Wk;n}t4989=GMrCTM+=ic0n^?X;r~ScCu_<%@?E>(`{^CphiY>L1U=T#m0r7x2 zOsjEwaRngsu8y*cJAc5V`9bB2HphwhK^Ne+u+uHG4HKV(C0Qr7PPVPpf*g@WkB(xm zZM=`WXqUd*)CgH+s|$?EBw6*)(O9u=cY~xnk2N%HijCipi}!EQOr|qQ+E*=k#bd}u z8B5_94J8kK#=t`4mDSO{6^$n0D=HzbX<-C`wg@3zHMW0%P%geCWQQ=K^v1dO#(@rS zv<8Wsi}HI?IM5+L$35Qf+cft8jzg!Y;462-i}5U76a{%ei}h66>hQMfeOh1Z`cB%j zYhbL{B-i5v#0dt|o>xR_TJ2gFZyk5S3b(h#(Yl djFj;JTi BQ%)%wMp(Fo2oV+RDV3wvBw!*SDqe2l^vET}$igHeHIkMvejjk2miNDJJ&< zF2A>Jdh0Q$eD%pA%%_Xkzl?V}61FP3r9b0a`s)r_cOTTOysq0i_vYsIyxcJ+tEm+< zie!U%QJ(N?=u)O6M?P-ivjg@tgN$ zr!huboc0%(fNav?Pm{VpBe3JW6FmBIEeDk-ixV|7!SA^ zR=KMC^f2W0q*9^yO%o_ IUSl8#TV3rv9ChrSixEqDKnQBL<=42M~QIFc&9%>SZf1j156tvSH9*TKq zUlVj_Rc}AmM$#Mw-|{-C;Ok3Ae|)}u`-LgyOn<$GocVi`;~L-EZNIcr#2_|H8kF8d zy1iA$y#01x%0r-=j|$31oPEz<;~F#e0-UJ!ApBp`6hnPFe+ERBXu^EnMmVk8lF0O$ zby`}k_Lr7yE*JlJ08TIE4d6@!DZ!^MdQZi})v+;vBE++M!vo_Q6MhC>7}?8U0I@Bt zCR~_07ME;=O4dA+rVx1aY&$`}{%7W7*_)=*wJQbEwA$Rici}q0Z#h>9kO?;5&&i45 zKSZ-&)I-1gq;xrHB;_E_?WbtjMrxVusr{wIPJ2l`y^hLL2Xkmz3(ML6d*2u3_u~a~ zR~dLu5&9>Y!EisOgsJDKY6chsR_6$-v;A<@u|R)|nZp#&xT2@pOR;!IAx5QX@iXMr zu;-Y0d4k&==Oqd+;>%(;)?zi~WM8Xsp~nW9aGmaVJx9U(B%=MwIkT!9r9CJ4+pOL^ zp?cG0T^EbFw<6SZQz;A9{;=DrDt3PMmmxD`^Rf3Q7nfD@+HOOozOJ-@drJc^S3h^3 zA5KQKKwZx}pZpWgPT6dCibJUPl^}aLduKbWA{2!M NaN D^KGMZB`aFxbQaV@zQR>7fb{uGGfsg( zKdplq&Z%-Shu^ B}{owiZijeC&J@98}Ig vphmY}w zmPG;jqu>!F?kI+h>+I&@VmY8?OL3O|#eb*)HG;QdE_fn2EV)Db?5Ad;Kvq9x{mZm~ z4#G >4Q$c# mCVElhi5OLXp{uc&-$?Mz(aeI4 z<|iq%D7VA@I%a+=OA9wMcGOOjphkcaMRU@A%dD&67f^~Qk((_O&9A%v9pPEOcH#Co zC^;Mx*s7VH`AW@l^pKM+=hq7?I0r6oXrf)6Ph7%ao9omjZx)!* >lKl-7V8zd&fP^1wV5x#0 4 -cXydG2cM4QGQJ?QOCr z?X#KzHXB$Kl_)FwP dIz-u51(d+T#^jq^`|a zJ%D-tc3U0sm&1&JMJ?jrEzi*Buk!`ZocA?bLKVJ9iz%V^v<5y>TYva9wEhUsR8W5$ zOjQwq7Qt6-t{ddH*)L1tC9q*0ozI)4?s{8{j$ NQ;=!;RJU}o?~C0SBm^~T zNS8nUQtw_TR~?huVQRJwWQJEcbX9{>*d>98ogH>j4om$gFGdO2j~yaR%m?)W`U!qq z(He~8RMS2uQQIxp_h>3E6g96{J{Dgh6NKPUeq>r~B1B_!?q`ZqsMlr&w5Qedc?R#F zB4s2^r)yXQi^SATqrw3OMFSCm0l{>*cWzjGqdD&N)6j@Oq1R1`{G**Vx{#Z}AUDK+ zsOtV>3=BH#fbQ)`C#80@4o?WEw+*hF=!1upmyPR|wIr#Q0=Pi6swL;pftMek^R{sY z=yw9AHc`?Pc9Vs&pM04zm8KSi<`#fH5vQ3J6O!#@coj?IhJ23%8H9o~t)mmoFQrs1 zn~8(8Nh}2uqM{ed`8oxsO5msA^4}lWzS*Sb$95{g78vHXbgu60#p-Z^x(sCD$vVUD z{Yoy$3&s36cNhqr$s+n1s6KJQn*%vQCb`+B)5NMYdB1nC`FB%H6TRa+_YN>;)HRM( z5ue$yo@oN#GkzY?s2*)Z@$tgE(ubx7?ad6uIrCugP%~&ChnPB4OV-M3zzOpYzpcRw zJ<8vJbxO6}X2Eohc{i`q#35mSj;nAyht!ooDwI1 clt$h`L2wx9miG6zwhdeW=N(zB;(!-CU2WBkwoah;)0dz zZS?+%V~I(jV1xU3Aw}U+?uJ+4m5C&XQIwC eS!A92W-DsthucICnUKz?%8oX>5%t zt{H4xwLnwU;P=@3b93CgA-E7WGmLW!jN}>jEYCglM nhfI1%b 2Degr9837Yr^zA~7d3R)N!wRhW~3I0Q~(H=Tk62AA!4 zEq^Y<)yk0YO@X;3oz1d^3BISJSoV2V->eZK<-N3{$GB-YqGjFnXW)=a2e};9oe3E( zet-Iy%*odThXy_tV%M5QM5OapD!Oez7l(*YrIqJ1ZO609uR3%ktUo*iUsr3OlTSLG zaXNlLt-d4s!ctO~+OqcbIn@#pISW(Ea%)9z_KVUZ0uzIyS&mt;@Jy!B8PrB{n(L=A z0yoD*|2v0d|FaatWqSh?OMHfp--Y5UVP2|E3CFaf#aA^GX7PWL?p_xk+QpEV1Gy?q zC+y2M3FSHy-)nqFf=^AS>lyGQaT8}xYlfh}s@MyPGC_6$ p^)*5wsZ(q_}=)+f@I)=@z4Jv(6i8= KgxUmT_)+Qm^E?!6yWQ8cM2V^*$~X?N6#NVtJ2s4hen{Fz1D2xksf*eh{GUtw zXP0lmox?+o%AZ$tRRs~q{8mwZp!t_=+0W*VK%!P3PL;}NqV3>Vo}r;PM^f|nOCXVP zt_U2UM>Gi$$d9nmmxEF_tqj+h9vsb1Q}_bE6Mok3JMcbe6UknMSn*hEzUPEMJPcIT zo9M5?IcU)oIzr%B+=3VjhCV7|uiUQoG}xGgFD@ot_dKJviSPKGRV|#-Z5QpdJFc5j zOyf%W7e{8Q?s%&wr&!~-5%IY<{5XQ)jtTCK6yc2_@IAF}`d=iDwW9x Ta>xAx0y`R{`b^^S><$8YmKE z43c-IHv?E^Dk%`SYP)J5)x0w0be5ivk(9DUVZE1`dll(vB?zoAJXf*jAcutaSDOZ3 z#~hD*r-E?gFlHR$z8<^*CU^?a5mahiDMJTetUH!zJt>xOCWk%D=cYY#YR)^IEB4<@ zmppsO|6j29ylZ81$KU-$iIY@H%3%R(V%Od&N;erp?`t+=_(v?^J_)IUwBp$%|F7Gc zPqQ=J^&tY|B<_cgMsi|ge~A)b*d@mrO?#c7=`c=ZT}WvCgYkBQkRbvebj^G8`577# z;32Q>dwBWjo~aEmyqDNDjCVKJH!o*rR}3}(JY7o!I}9CGURvh%5iD4-ix{uZ5qdFv zM_{%i;SQ|N_lmDSV8$sNxi;|lwsu;JjR_8jY}|A1OMY?$sT}Xo=f%waH*VSddd6ek z@ie4tMwAn1jj6p^x~YW-;di>5%>bqN6v}Q{e#hFuN2+ iQA^Pl3TC-0DjqJYa*y4R}L3C+?_FRIKdVR%Fh^%i+Ae`ird`5VYLN{DAxXO zQPDu$^hc!h!HeXyuQM-42`bkE6lkqlXQloB1ur<<#9fo~!Xe5M%>yP$d!t-TIKb#< zoE&B19>_@)w3ei&v`hcHVD!J?g@496ngw$nHVD EeTcj&BPeHWn-kiQ kS z(AWE~|J~)1Zs+{O_La$Zv)#j%&-tQkg }9)fSC!l_g^l1xUFCX*6=5kKnL7JBC=?;#|I;3k}|c--Yo*vu-m z$)r}9nO45ewDPo+iXAc#Ht+`A(Pf%ztAp}Buh`CITf9bd!Fg{= %8Ws)>27z3q(ISZ9BzpV#XB)AIosqf;w=U}$&9Us zD`wCO7#+c5+eE+5JS*lZ81x4$4z)1ok7(4z;!r!{&{j&gdFG9mq${C6VWCqD`coEa zX3+m))%h}0=beo@;W&!n8?!iGVVLq_qj8k6^&z~$q1cd?d )xPKpHUd}lb%pPBvZ`z!v!NjkiYz0uiK{$n{)}6HYm}n28BbJ z@K~@j+F|ZDSR7uLJDeOmIMzRrQHl~$V`gY5li8Z?(RJsgvvu1{IXUZ>bSL^$u${Oq zNG1Sk-MbO*3^0mjG>zUSLNZLsiam3^*XT2BIL%w8E$k4q?3N)<0mW+=N9>j%^6hb8 zq2kb9T5WbFcMnfpl`ea01L3OMV*i;z4gQ*H!xo6OaD{{vz){gPR!E3W!99Qm^Qa!9 zkNGL|O}O%QFzAg<6!Q{=-oip(XVB9u^f?B-$B%j;2GKp-AdVh!FysGsqt>`#fq-1x zm)Zc=IRm$CGB4ojCN$=p(U{ab3yu*`=Z=A%miRTjAH}cfH8_w2{00c8&q0dPOD+^I z2Pra8vk~uK(@V20=s6nIx1f)`ji^WQJS95f&hegN?j&$I7tn!s-U=Ofr=QVU%SKbq z;I6o;Ixt!l-gHfMU)ro&{Le=49UM2`WTdtZ{57BCLwaxo9v%-PwI*RsTaMn?MDZw5 z=q)Vtbp}1nLZ4>P<1F+PgWkqMUuMudMI0O(Xuz?71B|6j!N}yl7bV!T1Nx*dIpAq? z_&fey++aAPhLTy`sq70tfgGrq1QK5Q;MCNil>!N^(STa35q3bK+@$?EhW2~t7P%1Z z40@K;&bJu!Bn!R3ptmxp1IuR$y}%lmCi;CAs$kF`uuuzw{-{YAGlq6FhOP8*$Cx*M ziBTNsh{hNaL_CdKxl~jh@4(1In}}D&Re~ zw8){JR<%6+R1aE_q)gXSKgVkhh2F+0 z_jLw6O`%H$@C+Jff|kt8vu6?4)6brypLJ1@pUAV1dYyUpEyO?cvv&rOBtYoB;3A3> z!14QHkbV_Jz#~Ocy+p;3Qf>TCRvUN0k;>u`v19a63x&E`(6cl;+k&36pjvShDy)@` zL5 TknO5*fneRUudI3E5V*L+0ZU&cfAYtDM`@i!#r+5@$3g8&|CDCXAdL!m zA7XX`$R>E6dHT`WhK9pN&o)tRoks1v+y9hi{cX18jdQbz_eSYhSOJQ1lOTVUKp?p+ zDE4mMJ%b~`By@x`P9S}=L3O(D7=MbKss00^PLf=a0` +2 ?Nt#vgHH9ONG~p_nAzZ4w!rE|Vi%1sAKf@W!>|bHG)| zyPV`F!MdPseqf^5)8{l;Jo$mKBa|KiwLaW0ZmM56E1@?wQ7o$|^cEI+fkAI&p-(gD zaTa=tL2qNBe`U}ISm^5vdYVH;EE{k%v6&NE*>m rK~J*! zR?MImFdAKkexLQMf!xmAp^u|P7l (a?sZ=XwP?cn__3L5HAk?)zlvJ^%{hFv0LFvSjf;71ITGA19(NcWf?EB z(I(#p@EUQ;vK|lMb&5i7{cWSaU^^M~EZzE7VNdaJM7-tQW8wu4pjZ|ck6IY;R~(MY zDL?qUza==n5S)!C=7PbwM0_?_cZ0Xw6eX`xvklzQXd&eEE_xr@&B<{%@n*d!T8$N| zv(nD9$^S^tb%go+r*$5s(xdAShrRt1KL132xFQjY$0NZ!+HwBRPkLP*Z=w`YyCix= z#$wI+yZR(Ui2$Uw9@suRv%N&MVsw0bw7J(@zi$0Hywfxm!sElJB{&`)%MBlESGEnU zP =_2d(!_^3{x*N}Z+WzuvEDd`Q5 GM a zJ1oFwBgBg+W~=3V052NBUW*oY9pnMDXVLSpUG${8Vl-(ZI*(W9kN9;OtH$e&flI?X*C3fH4^2{aD-bJa@dqmvZsYC+G^=xhsm zZn9Zlk*V+a(#xDXV2c{(Ab7|Y5J$SS;EKl~DjxvugO{I(cm=A}udQ$@0@jL8MPRNA zQnKppmCzfTDCR{9y@iEdV9;Ax=+g{(oQ0lZ(A!w(%M5xa3;ipD-nSz901JJcK~KL; zo%k>i8mQemF0*;Ioc?GDE_;SDaPn*m3FbUVEYL7&!mYC|=n&1i<1ME{WXhzDUVfXs zr(>vjp4F#S2K^=r9cIw~T=Cg&(WncZU}4a+f@a&_V$hRsBMA*rsJT51*9z-penha+ z@fYx?q!Q|J?fEXD-cSCv^)L+hrjaLcn$WT+@+h29BWb(*cnn1gF^5-+CtCTY1$|!= z#p~e{4Z0ch0)yWAXS(I6H4I9%JPc7A?vH+!K7mi#VBQU}R^R35jZGADbcm%jQs~nR zO6iCA> >g+x9Sr$2|QO^Ylqp z85bDzR*d4)G?=z1MVp*K@m!(M(=7Bk2EB)c{)$0wkvG-@38pQ|vL*~csm4an^>FA@ zd`jYFxPS1qp5s-tgz-`b%i?-2*5e#D1#su~7E;>_k+o`Isk>ssHt(n}S}{ATdrJ25 zwQC~D-Cxmz3B7P&=WuCjBI-|sT<#HnXv`H}m0Y-W 1E8Ne zAK5rC`SnQEg(Mxa58TU~ZDahB*pL7h-e>K@I*ocj+aHy^3L;Yf JZtWIzD!Q%8 znkwz1L2!{&6QgjcHW)N2(>p(HZ_9GqA|66_>6f8lC)d*W3x~V(7P52WGp;(c7Ah{= z(o0%tTK3nA`Qq*`S@m7=UYXS5q +?zZDzfkjETGnQ<>r;s{@C)(gI^>mVobJc- zq~$cK0B6O(mS0MiV-5n=!h*Miym4Xwm=Ag5;sIkOAvdZ@(;wb(q~8$Kx@#_BXjKNd z3r4>w i7;YZ &^^SLi>56HBgw2|Dm8J_=*V?L*;PiTuI!G? zhN7zz@r2f>8O+DGX%}xQ#eC+3nc50D4PlKwI5&`-^_i4?3R`I{mc&!UdN`}hbdTE` z$B$e6Fw8WvwfJHPvpcFLxY}udc3m{LWx!iDaNA~Nx=x8e)M+GtV<{Pog9ca0S^a`J z WS (Feky;gAiZYlh>17AI)w{dhjW5)Xch;m4JfoZBvX?FKZlJnGeC~ zZHFr}pLn6Gak5%PWdUg9bfDs98hqEv?yiw-Q7!-K9oi^$ze@ ne0Az_uqEqS@u$9 z#@`0M=HUuu-JN}Wd6z*dvFQZl`?|Y|0sDa7mUr3{YMp7cKf56oS}jbhPd+QQJ9;|X zJRKsj%lZjbCF8F4kFWJ8`VtCF=9>EO{y{|3YDkj;(&Sm5(W3RpQ5f#5*wzY=Ep8tu z1YN<{`b=h{!( b zV~jZsa4fR0b^!O%eBwvgl9HjvLa|IgqE1*+A+C;PM=NQL7^+@d897pl&4)ZLeZM}k zE|)0`#VndgGSwfR4sI3>Ts1R$FsV)YtjQi8-_URI7t95p+v&(V&32oAHnV0uqyXv; zL wh8dU9LuaH_b1Qt5(n@5Pv&~&BQgZRVntIieD~smQ8jk ze_09yMPQ@TV4Jd5h5?VOsrjJ%$)lOCLo?sU%=~LNT8c(m1pQd6N-AZQ ;L1b_*6adiNQ*&D(LzN*_poOtUM*HS z_9lZ|IWv5C$UV9tHaM$ysWZXQY&cMhn3B@lziZeiOdhJG*A*;oZA4-A)ibGCpHzGx z^}G(pg@u=lbS?uevhKGY;^)%) s^{aXmy}VvU?}4fR2*xu~v$QTV zOEPhVT-Ddsr&QR%zmtD4$Ib8`=p^&x-wF|RIOlff!s rdd(dp^Nq2Sm+-_f2SGvb!4sMT6tS+Uz-kQTv^LkU1%>ZTSz?yVhG=90U z0DPL~m`_q}%(A=o{O1ok8C!tY3uZ2jH}lE7h_gMctktlSp|G@=elDNK&NIVOT#h^A zTQ`s|18uqB@seL`>@Hv}{wwS*u23 Pvkc!)>-dNa7WcJYPT&pi*GU*dpG z$1aV7_kjd?so|ew{D%VG(@Sr1?u8{*X%C_T&49+P0 UzdKDQL{xWY1H z>d94e#687J?nqFMUPTe&4kAUMJQCLBdl6>!mY~!bTt|#rN+)aI7~5cUsYm1XjIEMY zX~pKRk^cqW|AKIGZz8>kIDaYeQcxdJ+HFN&wjyZv0;1?8e ho{(6CqIP+gv9FoksMebINELfh09TH-pc5Qy$#lfdf^;lULWZ`bx0^fumObL- zo>N$RLSpC=wfA-EWN@qRm`%)0*CGR+qFWhz5+6+txCnyDj5IU|cm5~)%QkxE?`7-? z_LVIP4R$4hzL+wS^b{zI!d!fQx}mo}X)E`G94?u$DSV06)=|%HK(PvN6sfpjygne) zGs;(qa)Chhl5LoLy4Nb=aoZ-~FScIz3*?L6$y18JYR9)pHIOKh_*dF{*U0Gf9{g7h zl>Wt=-&ZK?%Mb1?6!s1VM_jIvApU*~Y!MC|oSD5UnY?Ot=HS4fZ#I>l^ZV!0aFzS# zd>)_tg7uBT`jjZ 5`zW*v gfp2>W{d zPueS?YXSqf21UdR`pK?nu%j(25TZ;~NETx4YnkPP$yUWm_%uE=ZCReX3OPFB8nJ2k z$
P>bAD0W6HM&G9*pJlRBxq}nVidrHwn qNV?*ryhd8EEq#qcc#P=FJ~H9?xXr$3f47LvVI!axrJpCVqzWc)V6} z%?rxck?d@gIz(_Gi5K&ne@C1<1bd_h&y*x(|B5P_JCXQ%&BpbOLV8qX?N)Y(gx1A( zPt5gXZECiC&Jk?mX4=|6`yR7&CE#kLgS&XcGRxyKqXv?8=bTxcS`kp0t=*=Pv^Anp z$n6T7Q=~7w)Yp^g6zStuBA%-I#66j=9(~Mq>3p*8L%q?cgNIhU%XcU%R8@bRB%i!u zbw5k;^W@0isS}P%Y-tO&2=sCS%zP@tQDJ8!6EiM2HiO<-Vf)_(RDGr?%$6sy^Nrls z jYu=zeX|9#{gn5E|c>{P&xN$9rkUuPD93HShs;kZ* z=tR+Tkj@Y~7sL3yC`F#$FEq{Vc1IM6K>84+cWl>y&LiLTHTQs}9152#3D4JdDcrim zE@5t4A~cbb5yhx=(}-^(5SZ|dY_dj+ge)}?N^Hx~xz(^_Z_Z$`v{fTv+Y@q|lQZ_b zJyf=OeBHv%?jDUYP;tcf2m@QjK_B@)$zfA!TYhw$;N^Kd@9N6JU6aV$!=ZAo^>X^D z5ovg8FcxA)38gY{K&@DVGQG0*P67cd(N_Pfl5jQBXX@_jkaq>seHxUgOfSNT$_RIG z+}GAN$mON|IZ_3>jiVOxsEPbDEPa5UuPbGH<$Y(>Y@b=o6PYFTh3|YE6z(!4O{M|k zUF0(#$Jxyw|LlS9DjU+N;?@F4h5mOiA7cDo{atko+ dxKAhx=XD z0TW#fAgpq+IC_LSYvmw%VLkL&D>_YctHKG`qih_g=TuI47;YR!eRI=BtJd^3`66r+ z*(JC2mNrC6dtcIc6;Y{GVK4jhqrz@K;J{k{+}SDUpHB{LiJ;6+u-08Ty3~SB<|vjM zD_1gU8D?nvM_ D2SU`cZMWsw-Hu_^K#mX5vszuU`Aur9@H#_kgB9YV?76d~OT*d$TGcQI3w~ z%7XUD-(XuVYI(fqs#tj=(xFvwjwGS dPb_9 dg@J6v zp!0^j+G^UC*BIq)wa%jT_ItE}T|!Si^Jgq(-t@#(Qk%-)HfT*jb26n;1jT)Nt=y>A z*$3RdK?{}X!9lEsa#cao)GE+uhGc88mziq#0F0-H$GXbD_=VolW9aUc`bTBfZgGdQ z+bq{*LlS+LNFeESYSc;L;xOo@MBp3VP&-`uyPj|OL-zI$IkCbU_FZ}a9b3bh009YS zG0xN7h$msrCt=m;4~3dzVrXDe?Ukn|!@2F5{@FN)+p{HaX1L!NRe3eORfXhi#Y+AT zaqueG ZyUsq_b845^H5PSy<)McvVqj|8T}z z%G$|qHS!hmVVMS`QNYd%H)jNkQZ&SW_(XNv%<8d9a!Tu!XQm_Bt!Zb$e)=14C))zs z(wX6qA*%FhA;E!aMxA?`&J-`E$~NJ$SE3oKvOw{TYSmtFrncrH(;2x}JC&?d*VLZ) z1T0*gsRkhFkh7zP&~PTbEs(>fG3roP<>6gqJIdSAh7?h>vbN#nl{dA-`Qkg|)ED1* z9_g2aILXU?27WbS@N|$aq{VyQU5k&ie09J(vL}_=GcvL#o!&FzAMtob{M2`q&8C81 z!ii7ZeB_atnMaP?{E3ND>ezv8$8x!2+YTH{{n4t?Su8q@74^*0YMevA)vMY_p>JWO z)khq9j~wpsppZ98h3wq=Q>y4E+Ia;oKk8|u)@P;L-y0fnpr~vV?afGRWSg>JgJ?_0 z$VP8EWR<)MB3`dmDQX l>jV1Z5Y&w$@HslM&$Zj{WOj-hu_Zkl<%u zz%k!gv*LqSsf?j*j8VF2l4T5&m?6N&;@75(dY8=~lEQ-A3q^myRLq8UZE^i=drcvh zXe|*fIA0|BiN&xXr1!;LYp2i(3fB#sZIO?%4$}Il1%F0)_W RU~T;7sb}IO{H$r_*usDB;572AG;Th4PdiA+%U8NZp#Ph~`k7r+`k7s4>LbPL zYSTyZ`6JV{>xyp;4=*h>ZnJ>3cVcSj8z !#dxwOJ z4pS?*CfV4lKLh_ve(hV&gY_Yx0e$_Ix5>BASztPU1$ |;1(vDw~&tEfcoVYrlzk0&zj7_-R6EW(CwK|wTQm Fyky>mSmg!af!+{N}}XZYVGnQOFiJM|lkY#<$>YxN6@` zQ{&^_@$spf_GRjCTz&l)&MwT)FP#0t^;f@vI*r5R`hN&V!$-r>Wx?HO;fylgd8$1! z`*oVIDRXdq;;M`(q`mG1Q&?{wjm1Xo`iQZ_(@gIytT|q*9bZ$}Ij!N9GRDcB<)Nzv z2d^3`@0>JdU@zM641FBm$0J+mMjo3(qKLh)?uCUtB3&=9S0~zQ01EP 4ZI^#2ofG9O+(aUN`I^0G4$g X=l-hB^@k3X<)|LLib z^pVwz*9;6?v$*<58VomD4!66+BCb=ig6@xM*!t=5kzP#?uSe4}Hu`Du3j@|kbmfC< z#Niloe2rXuooP=amjs{lCr+bRgRpD|k|~I@miYl!Vl33C+c&!cp~Y-=b-&-e`K;R7 zr;R!6F y-5gwbJ&!c44Pc?ul@7Q vFd!GDJZV iO5&xdeF7p0-tn)XMJY zpf>MK6aWC$+7rab3ft4R@l>p)=Ly1-;lk>m$(1>r{jE9YO-}H0UBR4jAiip0;q1K6 z0Odds(uU4$qCD8BQXIQRU~YiDfE-mzfB=^Cn5$+j4v2ZNiSC-v6etJzyeH%qn 6N*MD_ucHjQ@jd?b^>D#Onu+0(H&Rx;6YqwL^$}GE8rm>4p?=Izbq+JVJ zyu+?g$?P3+2WCRkv(dv9>F92k*XbJV4^H|MJA{!f<-rX(QLt~*XrSzHjRXUg0hK;k z^mqzV<)B)kmuh?ggT6SIEbmA*yykMsli#!{tmHO_j3Tp}TV3b*q3v;fSnu)1)@Ndy zTqfJNH&ZT+^yvCzw!X2k@kw9JV~K7SS_(c(P~XlICC$F1)~JuG)pondNq`dJa5)1? zbKHq;pSgNzm=HqU6-7!p8ok1eMzY+v8D%j*QU!CZT!9$|e7~TPD-u!X$biw3nOyX% zhNs4K;JUWdRcoTovGCNm`YDakD(#hsJKJ@US}M44?Hqi7Ac{rHri0hS2a1-CUQbAl zZ-_#CNx+`a!rHT3dT&kn85~XPJ9rdu0q} ojt)Xc2;9fsvb$p9(!Jd+%Xex;V+i)8;CIws`Ehks~yj^7R>7}}Enb>0tS7NGf zt~$wUZwG%;1X9{geyP3FvwG;#U%>}adG)0-&TH?)aiP@a7un$0J%Iy6sUL{5>a|c* z6%46nVAqJdcmhFJyRz4A=MnlzpD8W{T<$sIqvTJEWs%Pd3WYmwOG?B5!2PZ-6$#0V zq0s`ipQ39hsHi)RiHd;57a_r#1pxF7)_gT>yx-o*GiN;f8DU~Ny5TeTXJw8}`wqmi z@4suX{_uzAVJU0ijOc|kBF&x=1Z$GU8}ot{LLg(UCRl)g9~RVdc_NzFFyI|=2Xii) z#^W=9M^9L@c30k{Fv%4*g|8OzPle(o13hP?qE4Z!nh#FKg*@qS#Fdlad83UwEHMM% z4fBAx5C}%K9i1wtNsd%oP9DVs{~vDl*gZJ7J5PQ0mu$9@AAkRQH+uk%2G)^j+N+}Y z0yimU6116aNQefP|F1nDgAyBjL(pCmwr?$ipROU`{FN)(gq^}JwNM*(NGc1fo!fr6 zyKT>ln{sU>*ZRdupGv{y=6C{nwL;^FvmG{8tHvq?nLf^L7FwJ#+q1h5W;Vv$(-tUB zz+H~KU6<*13_2|%Pk_(P?u*}csCGE3b9%={J-?-*id|Eg8$60e)I=KFjoG&fnc#>z zWLM}$b9QI0usZ|f?ooFjn% -(9rZ3c}?6>DhhJ3YQ0X>P_Xb-2)}>WW2u~ zc21=e)A)v*0+#<5soTS7+qY?1V%}@LVfj}p;NE8mLZ|E1i@HPsp)unJ)@)mG{K1Mv z&u`1~J2>=RWW6}*gUQ@POAKj?iMnxM!9KV?%p>?yZ3N$zwR(znv0_T5NbMB**H#=8 z4k$)d38Q_hyFab*tSX21 G8;!BE zVKZcUiRvcAR(P_<@dU<%cMq@e5p7dE$W)r7ZvYHU2*jdlucYI;&rAsiwioZBdP|#& zi33CSVsX=UduhZgag9%SkAC2vG2xJMGaMmw_fxECb#11dpz5TgqdeR~0xcz<@ea9^ zZq=~HCh=P&1_{CC&JsM(XOLLEy=Kjb+997UTT)`4C?SmQnTo8Nh3owIOt@N8MtxGJ zSFQFsrT&<_J|7w%b{Xtbs|T*X-r;sT@LBn#Dj|flIhL>g%LAoovG%2cTGJc!d#3Yt z*T|Z1wr+6i)2`5zKQJ9i=2ZGGs!d+GNGa{;FvVxmsl}Ypu8(Te-pS}d+1e%4dCaQu zMufBxTM!eCJM>lz)??WK>E9qOl}Ysk7;(*%J-)?CupUoGqvP)6#+)-_DG&Ef4+}RP z3gtYhJRCP;e^jW7FBU*AR7>sERIIM$wMA;t>|+10CGAL0bxU)-;j$m8q|SUIs*jc( zqQ<-uvGqqdN_u*fnEeAHBrf2i9&4V>1Fp sB2+#m_pSYI+~{&qoWl1 zdj>_PYiRWN@2RtvaIL}5PEpS?c?x?mO66d<`5gwuCD7R+Fp6gaes&eBgyl4x|NTnk zo_`0; ;uQBgd>IMGGLnJJLXQUSlDa>Xfd9r=9%bdvu| z5Kj 5lG4|sd3v)w!M4^!d!+t&o! z$;Zr~JbKqh%%B2B?|Py$xYoD+iH{r$WTGb@{l<>ahSTL! 7pa09IB+itz6y3gN_g;dJS>1JpnST=0>1jEHTT1I{Sl(` zoHx*4!{{cbKlWH+@-+{jJ4HYT5dil<&TH`J-9!XDk3XMBpF!7B9NfP2Ed2a6Z0mb_ z=}mAScmUZlXpe1+*1u?WOJ<;6A`$U>+q=3nLUq^*`eVDc2c;4&H`|8K-@OKPkQ<1% zV3{A|tn~R6A`1@S&;Nu!Um*NooJ+vZ|G-&^<`eMqNATZ&gFoK|KcB{*Ut|7$7Jq&n zf4&cX{v`hVYy9~mL wuqsyX^CS eIzZWP3m52a6kFXjg{Tm j#lh%{o~q zt#Vfein-`=t2_KmTiv0|wBVZLOC_R!?}RoYO#8GD2MiYyR10!3r23~)gZ}a@% z&b^gO2QIV7Luvs0JdZ8zCS)55OR&WcZLyHmkGpK|Wq^~WWfc|>5A3V%dth;2x|-e> z@psB(U2R=$-2!EY%4_S5|6wHFYjLYOw1RG)unqkc+yJEHZ^>iWaEQKUK4UR;62uh2 z6^A3=5DLE$35&V#BhhKHK o<3O{JvS_FK<*MtJz#R2b-XWiUr zY++(75tuaith+P0b+J%zU@X5^=noHg?E0iDm(C~Sk*HahuzHu&2+Y9+9? zMprJ1o(e@J1aE>MgccO3h+|JWs2g!vkvnmG!HxxAE7e0Jdo?}c_HKb#qv@5IB_LV< zM6XsX@x+9@ws9_3F*dR5>-&&DVezwzTXs8F@NKksaF+Wi*ncO2_;ZU-Vri*yzdQWQ zqcUl;eGX{<4F8U7`|`_fq{CNtbNT$oW%{1Jc1f?%(cSa&Ro91jfdjKYQdWg+ZDU-X zT4Mo!Az!)W7GS;f>+}%iwRn@r!d~x&y>6iV1(6tip=onkQ{GpkZ(DA>`|cb2&^Lv4 z^{Q2?(YIo?cJ$iAH{N*o+N1eR3v=t%%`I$tnE2GCg%!LLlW=a2V^2*_^Nw`^j@J=P z&H(WY-+rhArC%jRE**IK>7met#?8Sz_?8TLvuR%-c55&ZwO>%Bonw1aHOE-Yo|M&r zoyT`=n0)A=_@IW*12%jgvlH8$ncLkP|2wOv;Qw@;xL!!79nv|4pY3aXnx@r0dOQ5T z%e1G1{USv$fo2DhY066E!n|Boe(Ou1GhW=8No*}=!xNJ;(_Uh iF1`mynesut8>lgK~YW(KL!vPtsav15n2OTJO& z6-wMxzixPMCbf6u`u+8}xw*Z|ib5mlM>;Iz91U&PSQdxU)UvSUjwo(-`^}T##hu&M zd&abW!;VbthRW~_kASQ& ;KmF+EKlZWDKl qkp4n-n|Hf%hC?{C*bR{Ni3Uqit_yS$(b4oB&`nIsA>_~;$!O{w(u;&-3jx35~O zee1{hr+|#`)C;9)3zT%L-i+q+Ir5*ul$CsOsd?WRADtXnYTh2k=WN8Yx(&8559_sF zCe^7ZXY4qVv7(LsQEct%705eeUj2Ak5t7tD1-|=&Jg&)ZOa#Y-d|r{;rbtCbi*0S> zGbow<*LZx-n$d|>HfFU&IgN?;W9duX8&RMn4@b*HwOw{llXd+e*igS^WbD>@dY#s< zF1qsT!h1IbMh$+)W+;5K!tn _0u;Z;WZp>1*omztdrf_(FI@mzElL$ivo4ac?a5 zJGXehmgt*^u$LU&L`0pJ&cfbOa%|`<$TDdj7GNcTh_A@jmQI;a+}6Pp$|M~ cLa2XLMj{%_<%``yE^i!gWtEXVFYKzM4&P8&v&kkzlfXV*sI2mo zvK2T9xM)v-=eYp3Mc3rcmFJYB`tgsSu3C}{{lWQ^RhP>T4ytLMWR;v5$|vA>v~kca zd9)W7l}DM_WR?b7pjq{~8AV*ZabK-mf=uu>cpet>zdZh`?H4W-6OFN_SD6wX@#EBp z<6J1zD!iFlg>S%F6z~dz*XGl#wRsFm!*1NpuBOy(i^c_Gb)c@3mnK*uTl5_ES>m|F zr~kg(LaNO;1HZj9rz_Uo|$q#$64EtL`<2!QH~?)BE;5I6m>f-hHR1E5~n}y(XKzX7;w@ zmrA9E-y3Oxs@B_UTY|K?Z@sVz$2^EsqP#R2>6Leh+q&Cj>aP3XC_GHXKm2l}fHeo3 z?Gg!l5zRa~Hx0)Y_afY>i6zl6WZ65w4V~ok|6veSI&iEB9JjM?V9O``)`KHXIvWuw zIH}JEz)|vrkJtW&p9WqWtHk2~I7-_g-F&DYI8iKh8?{#1{?BTxMKa%U=@a)KEFHXm zYX5L)cz>p;%!)cx9&7Kw{|*lHTD{5+F~6JF#qX3$yYS-o^#4tzg>B42s*z61#oji^ zQ;z?WX4_utu)e!;i`eqfKq%?8>5}d&rQn)$ajVZ+jbH`0Ud*iuKpM6|YO1&oMbxd; zR1aQR9VLKxO$TYYl2S@_%9T}9F4h$mu-@B^BkP!|pr92fmRI+Db?*z)pU;zj1N`bY zax)62Thr0U@8Na9{e-HoSr3}}Z%UsENBg+kaRLa 9+CA>~>={vpQXfbgi%TH~h#bTh=Vae>6@Kle@rPgQzs)8%GHWFEz z^9>sU_AO{wzTls~X=>-0TE8KxHBz?`+AU#U=<*mFqVXB>y0noUYFTK)u2sPE+gBDg zORQ3!)Gk>+_sT19cD#Zj6Kqwdvub~qTznmt6oc)Ez>@fQy=%;qma-(xtE0hhWb4|= z&aXeYW=*$J#Osy|7Z;xV`kKw%IuWl&-Mxus{TYz?l-#S+dF7uXzd}Ctm@=%_hn0^t z`mKUBSnZW`SX#3LpH-%uqk9Hwj*+M>DXq6V4tF4R*1evs&Qb#cIIHO>CK+p$pqB}1 zomf4i9I%h=9;n%2aWNSjR1&Jj>n5LlHlBlJkx#C)2IGA&UInOoc|Xv!2w?QKCb~r5 z)(hVqXK6R+sk^AB@GYJ6?G^ATlG9v$l+5aLJCE5fp)6#?2Qhl0br(f^iPK!8l*}4+ zJ8R|I!=MlH8kS3xSD%mb%LBNQy-7%jm+739cI-w+_DHk= |%Z5x`n3dfl4KyiTJBAk;N`jq3c&<}27!4x-s+3}0SY|!t} z1$B|tsnbUb1M%$pj~8;K!d>8^D&}=Ygj|6(U ee7v|SqT~ey*4pHcNcGusk;u8TXVEy|Ow@QBjM&n`hji3v%WME!S|IO3x#zGz z-n9tg4m1LdbJ1vpYDgF}j(9n~e`^2nxt+PG+|HQ0*C1{av d #=n|RYkva+j^b?7r*UT8&IU= zKt`&+?N}F(r{(19OG{K~#1G&+_%WUbcXc88vk&ckVGBEGZH(^gIJLesw3>ajPyfg2 z`)~f2;R%J!t?BFOY3txiv 6A(6HtHX92D|+Rlx0!O*}kFs=*`0JBriOs6=#-QAt_NQT|;< z7UQ0vx d>y_|H?N!Pp2SM0NW?#2zj^O zV2U9)m}UaT1_Fiz1HlxNgc^DYC6IgpQXpRfgpZH#0f7WaAe{7{nO*60=QHH{egCs} zwL3fW=1qI^=FOY;;K)$t*G$%H>V)uGyk>|L5yCpEej+znuc{XkA`-m!t~qUn|KBa@ z-_T@oI%C%G)?0?GQJ2eT-r&!z i6%zZ zKI-XYbW9Uu$P@u>N1vyYRk;wf8fFOC@tynrw2p?d9wH8YpaJMlI{R z_uc`y`r@r4JJ8GZKrB~)ki024mRhhnu&^aD?3c@nzf@rR(5PK0T$ZSSv;Q gUpVs5zVt*WG?DIW%VjdTHrV(-wzkI; z9kw=aAmAx$M`N4i>dMGH4h}lc(AD3OnD6t=Pjs}TQ>k b=ZtR6EDDDgWwx%*XS4bBGXe2-TxzgZn02=I!ddesUWf^r*SKioP+-w|IRAyZ zjEr@%t^4%u&Yf2Pr_^PS>MhHb<;Oi{ZN$VTw=EpsntC6dY38LrFdqr5MViM}LaXOq z`*8vq-^fYCYCuHi2Lkh>adc1m5(!@*1^e6cy{}7~w~j5?+ML>oa_N{{wtVT*<;x}o zoTLqWK7HcV7N_kM@eflL|45RQ1l)47Js&fN#$unma|Jr|dh1=?*FGk9rrAWRp{Oq& zarnI6;s^R)Rpvdi7S_01P -B!S(%j;A<~<`LBGNG$YhB *==O72RHa24(idN>KKN@wO?3OZPjxt_!piRyLdk38)YwF{&;L< zy|!Lhr>+aZ%#rLxD6LUzrKduSKcstUy2o*KPlr&{N0JU_@rMxiTd;qNtEOcyG%tI( z1-Pk?udp|@)nFzVw(rru!uUNEKDi=!VUXknv&%OO{tHKbB_+ zf^^~%f&%-YJtjx?3{EC*Rz$dqH&R&J5u z$>u1~|Kb s8Qu2w zSU-ap-RyG6=!SFY4X}?KhP*DV_j^2S#$D!hP0fC~xk)H(jv-!`6l{T*WN}?JRj<5H z#E^n76pLz#&2zJ*eDUXCPD$(sxeN2V4ZIagJ_9lyMN$=1%5ufO*ni<&^Y$$N?6dwq zwWoAxr(7x%N<>X&IS(4KWcN2-QD8){I=!536vw}md4tMG=gYHn (yR*-3?{k8N zqUz@m({gGoZHbnpE!9BQ41u @JL6m&ZEU_Ct@4vq1N5I(^1Sea_v?s`xk-q z7jYu+9j{<9P5li=Q!AQMIvk6s^5BPJ{fdi)sWk7|4pKdR6<2^_z0SqLewuj8g)kOp zXNp_dT~(p&7h&37@$W(WvC4k)47ysG0j{dd02ftRQvR|MdO%qA`ze95O6ptAWpHX3 zRM|&y cp`=FAU*90CsZ~;P6Ro$ljb=JFW?-L0JNnCr zOW^t{Bj`q_`Ow_YVDm$`i$V KdW2 zR&2M6nk1q|*#r)N#K#V9H^;2jnAsAs!2de*XE0=sN&rbfw!Z;Ukn0Fzaf@-jsddfb z;Gswu2Ti>TzGoUXwys$ex-J|BR=Ovd?6%vxlgS=B8BfIFUn2g4L;~BA`iv+LH=s2W zr;C~smXR|P6n7k&si-qTmar_g!W<9gc0Nuo3cK^YdAGr4XMDYj1CDkR ((u$O-x;f)Nl8kyyLW} zx7*#5X4{gnc#G4SFnjIZt?j+vN%_$}7~ -T c?%`Lkw9wteAQU+;y ziXq%U*=9tQEHOTpZIH5f4_J~53R;hKan{$#2G))ZOuD->{`nRkyDr uvKj&-Xz*7|f;ZMj9tJd0A)z`Ik6= zYvfY_2}Ck`(_P@Eq8PMJfCu$iJr$(hXiI`?r!L@5n|ucAXLng!{dn6KYMZ1=E^2OG z(5iK-qir64pLanwo3i`VU_ JsE;(?~?)L6z&xLyrEyKE$NSb_!z>KNTTxZ3q+L^5K8>1n4dq%vc z*+9>RX13MNHb)mVFNKeEvn{?>J8W+D#5(+gpnK4g==E44My6NlACCA6{wATmHxll1 zFYouyGYS=+mOyYY0M@6wEKy5yz!jm3&*dUEzeV3DXCqcRX@w<3JMYp;4?WKA?+jNp z9Qp`xxa0(x2@6-l38rtlhMAR-%pzFBsrW=YY>1Uo#u%fFNm#=tr(g{ix+*oiG>RKx z?- jf!kL)C+NWy;V)R?3r8*t%=A~_) z5h=kX5JxO|sMa@$p5S?{$?Z0oSoRM5>vrE^bi0jamX&&JcDLJZ^UVH5yvm;;UZ)c` zVt>^FCkfd>Qc_(fO?AXDQD-!Jy=Hj54W#NkiGj|6(Ozm{~BkNHgxwnmbwM(S@8 zLpbV4CS3(X*gly~jRqa@h(&BFBk3(ff? ;3Bz2x`Dh?waVIT$m^WdploAL& z2P?p8;vTf~0T>3U8#n2QEs()l@%EN2Z==3&0gUk*7{f(|FN53=8QzY1>wkb{;B4#_ zP5>%iOVt!p9^SyqL pKo#t;|9y}sev6d_VL!%sAR2nFM{)X2 n*r 9ILt{Af_a!s9P;eF@At8aA zdIH6RA^#AZC1A){>9VOO1nA3l_zMKDK?vvarK}oV*!-PDrJ=y;_JJs4^{|#ETLZ*1 z0+!i#_BZFfw1rhPwhuKgL}yi>6~w?r;2FdlJK=Jfl2BmTp+n5M=f(~XAEs|Tg6iQ_ z80ULj9JttHl9c)@7=bwyvmd#YK0J&qM8v>9VGI|U#-&N)(yS1~AUBIbGdMJZL&t%a zAi)MgEChlX?_}=ycVwAf@H?UgSdr#2vL-ML9{gQT58Cg9;S*eV9EKAUDELJ2(Viz4 zAHr?pwc91&9B?nM-L8ZwuN7 zi;iF@CxMQe$-@|*c~y{bjAW9zjsV@ohukl`Fb|w^KY4%u=1m+{t07kV5G*HBi6Vjb zFlalx8aPR^_$G(f5QKIu2aSuvBx&HiA8ffFY<^=1bitSpkG+VXT>>$?kHgIAj5{I2 zbWib32 m ;X@}9)NW` zaJ|mrgbxDtY9>e1IR@Xi16T14DV=4QEX~~oxMw~Cds=L|XFhW(w$9N~I*l-v9zo$0 z3~vE%UE1A^PfL<~xP<#6;=UHG;H^Em+^%dE?|8yBhMw4oQX|LHIq(Of0GA&EP+D7} zh`*Jdz%m1Sh5f^#2;c5MpQLTwf1s!5!2VY4ns@)wmUA; 1p zW64#am56*CTYu)6>-}q1tXOmJ$e;J`e|NrT?8V)?Ul>QJcEMD8xm45)ABVT$1pW Kf^R{m)3(Xh-Yva<(yrOw}JZAR}Yet!6^c94y#~{oqP<= z`i6YftFHp}!5~o#e*Hrj;|v}~xZ;tanpx)*q0488r{!UoBaN!TL(7&3MO14h(@Kei zOO|D0(YQ*?#A1wC6_3UarUsq4tW8BzG0LH|wC3r-R8Yy-yi0 Szq+>x#u(FyB}-yKM0^R*RP%48r** zFdpIa3@-877-cXuNatHEN(aP^R@t&S=U_^J@mK*qC!WJS3Pizb(9>6Z@G!ad>+9fG zASsE#eBxvD72D5}^nFFX|Fw2zIuT3lMkzFdNSL2^Hr>*6TWzTJwx(M)dCoY+d}~)A`RJp`K-aD2n_$Xw zOZS4`6VGFQQYnce`DRkhC_%00iYr82=r&AbMBSpphv9AN*{T%C4nPv6NLG?j_{OEJ zq{lE|YRR!<5)Kak1jpNw(i32cI4ZEC6~t`cfcya94BI6uM(<`=k>EZ`fF-fi8qsGx zYyhp@*|sp_@_P!s1-HAW!58op`U-A)dn7z!W_8W9*Xb_w6j- e=HyWgLIk0Dpfkp9vxBv~T;XCe*7M#xoXcuuo`^o9NnZu8%WvbIJ+I}Hw}mQlG) z9Uf24ZeX1nv5w~sUnzfPm2-W5-_xFoCTzBVMjy7>?JX{EA(_as6@K-zZ}|?(wXmvO zJ|s7Deml~0F#Ef|8PVd;W-bQ44e!~D1+M- ~Z95IFP`*O?N#v%At<|^T?F-_8vhEZuM>7ub zKyc~|^mP@y?c~1lKF#BBwjuTgr+V>x^&^;eH~LCpE%CS8UR^-EHnjwws#*oV?&QD5 z(JtJoSKAf@iCd?TF)zWxmAS5ddbWd%2mLT;IeN7CPp_As_2A5g;-i`G#!7sC?qlH3 zs-s6i%W@c %-~0W&zCgdv5mwrp%xZsg!e?+bnKkkHkppYjT|IB!)$7(C81eL8xNze9 zo}Tk37GBu9EVw9_9uF8)jI60Y(>ADT^r#HTBWV@3zKUhjZ?ecYt@B=OHTy)EvfEra zhco94GmOXUVor?UMsTt&>h`5g+i!Kb9acnHPX(>uec}a-n;-2#&LQKTZ7q {H|9jdQ2Ch+%VAe8V4XWjV0PWVRv`WedS|byg^rA>)Q93gbak7 >y=C8J$kYvpp8LO_)M1-1|!#1CPQG@xFFHec{535tqx+FeOnLL-NSOICcn z;<9ePL8$k2CndsePmfRnwg5pQQ4)Z}w&CGz#TUQ3;gLr+d>8g}8CV6O-YH;_p1iVp zN0XUtCmivhoOvXq3UFMu=h%`Oo6@DF^hzqAai#-?sN5{GD=4j66);&1p^IkYv`R-g zX<{1WluV|mqZ(Md)~%Nwhi|xaDq$zi5`?gBzP-wx9%tH@u80qD zJ5>x$@b1%-an9uLcxK~paNb2Dor`@DiBQwc&>1?rW86}R`$zJQ?1qBB-DG4&RmPNY z{e ?g9J2A4oY2xs(sN3Whv}<6OpvTn 2+qE4C{@u?T>owHlx{LqiNP{Hrn+XyTz^x zS?PeRCgO6$jj-HT!&1Bg^Cgj{1zI0C<4Ovm4i=|Ng6o18etryzDc0LSt?thO9?vIX zJ +0q%;T9#UCgQabX;wN=Dvy0NW>LZ8e}f5J!MV#>448|2 FHYv8WhfR4m5|V$2OiA~D0%xdM zPabREvM!l)v~Jnj0c#B5iF$w$Vmdt^&E9_CyJlj#Yf`)w8;+oOLj~H;*l1gZ&GoP* z4@ D)ddT0+ZI1j}CY}`mmm$GWOO^XDbV9 zc>bgE27i5n6INiipQimPQ&2~BCS5J`hRNQQnCJKq&J`B{JEB{Fw+mJlLrl0r8coRM zk1 eAF;XBk@q~JCTa1PDArx@b_C|DonuFnrvnefdYl%M z%GJndS{#X-Eos~9U|T{OqlHr1^mHO@h{nxv2 ;!w(@W=G&-16%p{-J9JiA*kGW8 zVK=KcDOj0VnX?Bodb7=CO-fBVMxoQ_bb6POQc;Q~mrCbjjgEQ=V=;L&sOFBs5Zcw7kKrA#PRu7B|K+~qcV`V&xzA#9IxI@F z%p!kuU!Bep$=OmIP8Pk MD%%|2b&WUv@5YNwh|hK 9On=paulZeAr85&5@H1p;gIXA;@pAZ z+`xz23q$V0alX%oJOESu2* Lh$s44O_N(H%g1ARh19LYH1@j?^8FZlYq`G42S;Xm z7D1JzY8`O5yG&j+k&lZARZK>)Dm9~I;sLN{VmLm)s^rPDi*AS95Lc=X%Nuj?WERc& zTr2TyGQ+Mjr0bH3Ki5h@@}c2iu-_AEw-ccF=?9Hbw=rz7r)-9xTBC0Tdyoa10k^9? zP^XZD6wP5>+|9%d4N|sAflBop BT=JQHCd%(gU9HI8A(y7&Z>;3#Ue>ly`stCw#3W;&b3ySwOU>Oa8ha+ zLDuUUC==>aXx;S-*z#!SdAh$=ObMv($qRK!M=GATICQKIM*i*jos_MRd+{kZtJA)N z)+R7;FS(A>F#y asOX>pHd~a%L2B`U(sd5n6?@W#fI8oZLN<1nn>|yY|cS6Ov49)M`5m? z!xBny3FT2vn^dBHG*8^rbIzsRCwHMz6<<7j-jmn1kD(OLpneKd$homF)8!>NCmx-@ z-=wdnnxsk^>}g4XRJ6F?Y7~jW*bfl|hrN~9aDFo#E%Nm$sr+_D#H2c8wfpO-gf$V! zX=$q;-fVt|Q^BvXm@HaHSL&swT)yCc;ajE6U=FJ49ID$aE+VO -z~|}l`Ouy*x_iT6FTBchgzZnn2bfqs7SAJUf~lYw{0_p!bfgNm%Biztg+qd5 z@Mug#YEq^`hr7+C4N$}oqJk<9rC}kM=Nw9o1S%BCjrSoks8aEC@b9ohpTJxcGisRE z3RnL ft59j` zYAA<=ZH77j5a#?#GK5Zkp}sZ4^-;NpZS6@74%fu@@27oATVsPN1orf0uM81u) I5@|_SOEVQI0cY&0S076JcfY4!}K>iMO zkkSM-cNFii#mq>;0 T(eP$UbOn_PR5Lh#t*#IY+SH=j( BVLBBsYh$HnJvm~(j=qRuA@1l#h`X)AtPxLlQl9)rgaDH@*1cdrDxg3 zhK2@G+SmvekjxQ{O9THODgOR0AFW5?Dn0G !K%it;oyC{ald!y0)8QgX;rfVnK< zQ)-}(^mx17p>~a35wdy`Em^Sd$F_mACvA36tkU3ixeGRYCLk>sCCo$t(vc9}^W`dz zNmA%+23-GfYy&01o^+YyECKdf-d!a&}?0 zBJ=R0{&6Z}r!&+7|6-?ev3~)Tq3s!J+`mYvbW!#emTj?fcUZsUrK<=5@u9#Y2p}5) z$r+oub8OopnXM9zOA-$6amKkcmB|Hq=Jy05i<;ZU?LK>JB$|N%y@AB?R(81a))x4; zwb|efyDT1ynay~Eolc)EWH9?(2A9#|&IUrgti}QUdh^XwpWTIO2^r%>I;M8i-qAQ` zt@Ai!ut8)sa+?Et-cT+l*UDqdTXSRP5S8&1x@77mhXeE!)9ZjZVqB3jx1=+s<`KWw z8q}H!F>^B2VvluOgx$at6Q*E0#|6kn<8E})3rQZ3zpv >&7FAGa!;>t7k8oNRzQDH>* zz~hdA)7m ZuxqmToldZ$*x3Q*N#|X?ZrwG*ep}FB&F>r@ zIiuj9eclK-*(VBbhZm~Nt))MKuZYXIbB)e#I@gHJOHX!gY-!uv7V6Tn>X0ei=U&)H zr!@}S{Gn)P^T~sQo04{IOr`M-#)g&|l`*q@EphkM2$uEVL}-Z{U@p#?HmW!$jnf8Q zAax>92`|)pWK9j`CfcJFJ8RjVl-zErS2bERR ?MGYf&bcs0Cz zbI)BKAh~8Hk%lwD!rm+6e2qr2lQg7vg50Jl cUBx%-Vcc zW?=sOfy|w2;2M0lYrMN-!uvT0^mO&-ei#*{P_Hz?TN=XTAePNJ@ rbF z@er&HJLh%BIlcZnk!wk$7AC>Q-c$oiBEvo=t|dj?X)&qIX^k zU0YTyNzV6bHKPZn{uIzzGJ3=H8l@#}&vt>c!#>f}o8d6T1JzwmrS2@>SbL(ms&EB( zZ0a3&n^lh+SaD!Iyf|NfR}qbnf}`H={>J`~Xqp_^Cyb&~fod?;e_EmA%;D%FJO S$zKM5?IpU zv|aM@37#tb1!0-c@F%)CD%ak!IO@uE=9py2oiO`sL)pZ9KMu%c{Jl1pHrrABO&2&& zbaaAirEGsJ)D`!6B34(-VhcJ0Y bS6%ag^aN$JtMt zi!LDIx9Ws6cR~CFw00G_@asEJD jbA>CX$F; 4DdWK;zCbHR?u%+|bavENd22tZ?oYNFYU_5U hmqzUyavM$*!J6Q3tRm^Gv8o-$zLj!;}K$#vv5889eXi>V}~KHE$sq> zgbRfWknHn2=oj08Y9+Wc83stlqJma*?yp*SFyka2 @ z4NHEow7sh2*Q1j2-&^MRen@Z`{to*BF^+5QI`mxtzw2hCM;=t>NPiulp8Jl{ANq#x z$EUyHThbr@{km`Ye*HImKR*BOANT!+xxb&F{%-sh_&0qE{x^L~{>Oj6@ms#n%>OX@ zE)WSuanI+dg&I 2aNvAEhmGj8fcJ(CJ~pdV(Z;XqUtppSBSJ>hHh5?f(1MKb?CT{zvh+lNn_V z^l@-E@aA#|!dk&@@Haw@An=;NSPl3p-*wlO|L^wSbff>KoBTK4 7^XDj`BMo0cV1HVfon7*FcF*ln9=H zc)v!tgg|hz0G&Iz28WJ84Dtkn&Y=i?D{$do2|ksAP9L2i2!W4?^@u{EQv+&|S_D2S z?gOV6Uj_cqRBmeCOTw1~2x17l#l=g;VZ^vdeKPRFNT-KTjCoTzM5V{!jf6Esa;IKx zY7|v1k*FyO)?;x5-2Ll|FaC8dcj!>xq3&Lv(APU>DrY>Ij57?(1E)f1z}+wvm!$hp z-*hS;rw3HsqR7J*->Uxvcb|JK_t;~(W9PzZ1A eUQpb9??o5gi~CCf!XL$FB+$Mm60;J_o2nat8yp+Da`u>N0#mGSt>!oU8CX70aM zk1Ouf41_-31~#n+&lGp%1Z3%J!2x0t{0n=jPGbI^p?Sjx74MeQ5-2C+^2!n$QAI?h z(SRot^B7^HJ5D>YPNvOmi?K4HWjOBdWZACbVQWmKi vs%B| z-Q|t-vqrx$p7#w#Qe%P9fG6zryV-;=>ka3^$!rAcIDxyskBGbe9htPPnWmd zxgFU#&>&-Cf=^)RLOvD4M3um1m(ACJ`)*iM!c>{}lShb&K}^{OAmytk4wp}O&&fSc zTW+cr_z|JeXnbY6Z@#(C)@=_Ltd^L`oe%2ltzJvB)@2 Jr}d1j59@U?i=$)jx~)H22Jv{fv BV(oMLnx;Xll@8ZWNL^f*2i4?%s25vaqg2NWj;zp~UVB;OqJpbn>INcq(`b z=7*dv(ejyjz(td~B`wp7Y9;b|x2||9`Q$VZi0dJU>lmCNnr7h2IV*obrkB(~#5}rw zO-mUM^471HbNLE#rJIRvGKNngk&wTyvOEHU2f9_?IZad}6p|w0eJyV+2S=^`Oz}vQ zwF&+wzWjPKYC+y-HEcmgmCt5mNi 5@V@-8q?`~)-= z9|H%vKkj~|YwFYz^5@V_)Dk0bF7%X6gKrYjBe)d)LMWxZgp;#MK=IzC)k+fHx<39h zc(8cSYkveg&xnIA&=v0%7XPF8OJO&XxWiNqyv{&+-q W%|uBlPP z4V3w0y}%6D^C4dQ^+a36B+rnOCsar}k{NclIjsS?wZWutgab}3-DsrZJ9!R%AFr-N zx4L <#tBP(-#cyCEAz{io z{%U!Z{BMJ|$LDJEH1`G;p4o59pFHHX=?re2TWj$uY`P99yQl}GhnD+>`*S-^Ss#pf z7OmQlig?<4i;u-JdV@TQtsikdF0ST$x=h;`K%+yYw%OH4Y>l&w!rHP$;_(>64PoS= zN(Fq)tNXp){?*Osx423uA`@fr<#rdl?N>l6uG4k9*d9G8lEx-?b#?7R4wrXz0TCg5 zOI#~z$wpgxz+&-R(mK7-Vh}cn{vd`mAuoMOG!qguKZ-ycP{=+51#GB;d0znc7yDk2 zfm$J`4Ls8E2&y?->A#62A;a V#}PL5?wre z2AMKol0XgO=qrvXmm$c3;y;A5p@Sq+;!jclc#8kvBk6$L!(rtq{uR$-HbMZNMDd+K zDIt?0i4%bTD85kFDk8zzMDZh#uz^JJWB5XfTI-7VY~_4`6?_VwK&g@p5J9e$WR&NJ zs^VGUOKna>7B3`$0;X6XNP;iGZ*e}(Bt#96NhSC@{#<;Ki=2e%Kq6Fp5h!3fl+QXr zl8}JkaQPt7CIy_-MzShi66J@G3?h`#`o7#AytXsfCTgmp?aZ~z#~(ioZYwSVxABeh zrtnQ*N+j+_=O)QYE%GpuTr1H^Y+*YppBE@6YD;{Wc%5slkBUxkdvO9?5JI`t%2+Uv zIfLyc!kiism3lt<2)5nSZ@DxwgaB&8(@ul~YRxEYONO`YhTD`&bVlO51Zr0ZvG~{X zxndO;q4S@g37o_l@G9o^;Nl`_gRD2w#)Ex`So355?&8>P|BvA>IJ( f^x1A3i6TMVx_-dN^noQ9)@C9=^h}@b&XI7XqudPM{E++*!zzED zKHcqfa*=#sQSmk|=HTI*F%KXZhdFmtpYQ$%{NbZ<@F7VSRUB^R7}Mvwl{PLK_(Abu zKI(di9I~zibJug&ai_Nls;C4Xk(*(bMQkH~I>z(~Z@Gw%7A)S*#T*0$jGr3D-dbH+ zHAyU*;>!R>(|^P7?KASrPu)f=s^musIs|J772oISxzC9wXZ6Gm@T>RRQMYa9?vVk% ze;|VIYrrpxF=1w19`$d04+n;$(cu7hhq*)rOCV=5QntMPZM}SU-oV$st)pXGd&kxe z_&>HNm0A>wE>5KuN1d%K+v>#kCE2Y*gIlxNt%E~bvytGEe135#v^bw%5=_$tpSM8M z1+T9_3y9Kxm%f1YcN5o>C6%76%MydJsn-eB)Q5G%j_B0YSuYVo_C8Vkr$~c9ASw>@Y<({9lp;HFtXhNm0c1MH5hdM zh*Dio*N6%&p&>2gb}Vt5L`3Ks6&iTW~R*RD+H+gvJ!b4aq(i>PbSF+kE1Wux_vq z-I+O3D2wV1PkB;~oijPr>kWRRtKE+?4h#T|K45Tm_*Aqw6&xsmUDKJ1E-#)1^NP#u zI&%UBfTCpT!(^`ud~~n{siO*NA*VHucmexOrm>AOyu(ys^WYS)cw3Gd&4v5aLUn&A zH%jHUNmpKT=ElUTHSzZL_?lITjb~m1M`11YD)0iF$5NbDdlJ=|x@zAlS#^F2DY;XX zXWlFChColK&Q%xc2^4S2^ttkk+)fE?wpym$?QUmkt#+Xn4z;|ix5e45POH0EiEqXD z_zItdy?Lx7*lMY*7n+kHxie+8rkwIn(k!g6wX_C1#+;Fe6O|VEZ5kzB!{^#*$TCDB zj};IigAqdDl!8-)U~}<%*wQLjn%7`y=<3oiyiPEFCwa`L(SA$Q |D+3r@`& z`jYNWY8uIZ#$0V(f%%hXFI;%`