git: 13e74bc09eff - main - graphics/oxipng: add new port

From: Jan Beich <jbeich_at_FreeBSD.org>
Date: Fri, 04 Nov 2022 18:20:20 UTC
The branch main has been updated by jbeich:

URL: https://cgit.FreeBSD.org/ports/commit/?id=13e74bc09effd6de6506339b1edcce48d64dbfac

commit 13e74bc09effd6de6506339b1edcce48d64dbfac
Author:     Jan Beich <jbeich@FreeBSD.org>
AuthorDate: 2022-09-07 15:50:33 +0000
Commit:     Jan Beich <jbeich@FreeBSD.org>
CommitDate: 2022-11-04 18:18:58 +0000

    graphics/oxipng: add new port
    
    Oxipng is a multithreaded lossless PNG compression optimizer. It can
    be used via a command-line interface or as a library in other Rust
    programs.
    
    https://github.com/shssoichiro/oxipng
---
 graphics/Makefile               |   1 +
 graphics/oxipng/Makefile        |  18 +++++
 graphics/oxipng/Makefile.crates |  71 ++++++++++++++++++++
 graphics/oxipng/distinfo        | 145 ++++++++++++++++++++++++++++++++++++++++
 graphics/oxipng/pkg-descr       |   3 +
 5 files changed, 238 insertions(+)

diff --git a/graphics/Makefile b/graphics/Makefile
index 914365b62d2e..8e5cdd9324dd 100644
--- a/graphics/Makefile
+++ b/graphics/Makefile
@@ -625,6 +625,7 @@
     SUBDIR += ospray
     SUBDIR += ospray-studio
     SUBDIR += ossim
+    SUBDIR += oxipng
     SUBDIR += oyranos
     SUBDIR += p5-Acme-Steganography-Image-Png
     SUBDIR += p5-Algorithm-Line-Bresenham
diff --git a/graphics/oxipng/Makefile b/graphics/oxipng/Makefile
new file mode 100644
index 000000000000..2a6dfa8bb77d
--- /dev/null
+++ b/graphics/oxipng/Makefile
@@ -0,0 +1,18 @@
+PORTNAME=	oxipng
+DISTVERSION=	6.0.1
+CATEGORIES=	graphics
+MASTER_SITES=	CRATESIO
+# XXX Teach USES=cargo to have proper default
+DISTFILES=	${CARGO_DIST_SUBDIR}/${DISTNAME}${CARGO_CRATE_EXT}
+
+MAINTAINER=	jbeich@FreeBSD.org
+COMMENT=	Multithreaded PNG optimizer written in Rust
+WWW=		https://github.com/shssoichiro/oxipng
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+USES=		cargo
+PLIST_FILES=	bin/${PORTNAME}
+
+.include <bsd.port.mk>
diff --git a/graphics/oxipng/Makefile.crates b/graphics/oxipng/Makefile.crates
new file mode 100644
index 000000000000..59ea555b3e2f
--- /dev/null
+++ b/graphics/oxipng/Makefile.crates
@@ -0,0 +1,71 @@
+CARGO_CRATES=	adler-1.0.2 \
+		adler32-1.2.0 \
+		atty-0.2.14 \
+		autocfg-1.1.0 \
+		bit-vec-0.6.3 \
+		bitflags-1.3.2 \
+		bytemuck-1.12.1 \
+		byteorder-1.4.3 \
+		cc-1.0.73 \
+		cfg-if-1.0.0 \
+		clap-3.2.20 \
+		clap_lex-0.2.4 \
+		cloudflare-zlib-0.2.9 \
+		cloudflare-zlib-sys-0.3.0 \
+		color_quant-1.1.0 \
+		crc-3.0.0 \
+		crc-catalog-2.1.0 \
+		crc32fast-1.3.2 \
+		crossbeam-channel-0.5.6 \
+		crossbeam-deque-0.8.2 \
+		crossbeam-epoch-0.9.10 \
+		crossbeam-utils-0.8.11 \
+		either-1.8.0 \
+		filetime-0.2.17 \
+		flate2-1.0.24 \
+		glob-0.3.0 \
+		hashbrown-0.12.3 \
+		hermit-abi-0.1.19 \
+		image-0.24.3 \
+		indexmap-1.9.1 \
+		iter-read-0.3.1 \
+		itertools-0.10.3 \
+		libc-0.2.132 \
+		libdeflate-sys-0.10.0 \
+		libdeflater-0.10.0 \
+		log-0.4.17 \
+		memoffset-0.6.5 \
+		miniz_oxide-0.5.4 \
+		miniz_oxide-0.6.2 \
+		num-integer-0.1.45 \
+		num-rational-0.4.1 \
+		num-traits-0.2.15 \
+		num_cpus-1.13.1 \
+		once_cell-1.14.0 \
+		os_str_bytes-6.3.0 \
+		png-0.17.6 \
+		rayon-1.5.3 \
+		rayon-core-1.9.3 \
+		redox_syscall-0.2.16 \
+		rgb-0.8.33 \
+		rustc_version-0.4.0 \
+		scopeguard-1.1.0 \
+		semver-1.0.13 \
+		stderrlog-0.5.3 \
+		strsim-0.10.0 \
+		termcolor-1.1.3 \
+		textwrap-0.15.0 \
+		thread_local-1.1.4 \
+		typed-arena-2.0.1 \
+		wild-2.1.0 \
+		winapi-0.3.9 \
+		winapi-i686-pc-windows-gnu-0.4.0 \
+		winapi-util-0.1.5 \
+		winapi-x86_64-pc-windows-gnu-0.4.0 \
+		windows-sys-0.36.1 \
+		windows_aarch64_msvc-0.36.1 \
+		windows_i686_gnu-0.36.1 \
+		windows_i686_msvc-0.36.1 \
+		windows_x86_64_gnu-0.36.1 \
+		windows_x86_64_msvc-0.36.1 \
+		zopfli-0.7.1
diff --git a/graphics/oxipng/distinfo b/graphics/oxipng/distinfo
new file mode 100644
index 000000000000..f19f620bf9d7
--- /dev/null
+++ b/graphics/oxipng/distinfo
@@ -0,0 +1,145 @@
+TIMESTAMP = 1662565833
+SHA256 (rust/crates/oxipng-6.0.1.crate) = a40d437cd5308cba163907008d4c91a0280fc3b1ec1265dd20820e739002f4d9
+SIZE (rust/crates/oxipng-6.0.1.crate) = 61819
+SHA256 (rust/crates/adler-1.0.2.crate) = f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe
+SIZE (rust/crates/adler-1.0.2.crate) = 12778
+SHA256 (rust/crates/adler32-1.2.0.crate) = aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234
+SIZE (rust/crates/adler32-1.2.0.crate) = 6411
+SHA256 (rust/crates/atty-0.2.14.crate) = d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8
+SIZE (rust/crates/atty-0.2.14.crate) = 5470
+SHA256 (rust/crates/autocfg-1.1.0.crate) = d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa
+SIZE (rust/crates/autocfg-1.1.0.crate) = 13272
+SHA256 (rust/crates/bit-vec-0.6.3.crate) = 349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb
+SIZE (rust/crates/bit-vec-0.6.3.crate) = 19927
+SHA256 (rust/crates/bitflags-1.3.2.crate) = bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a
+SIZE (rust/crates/bitflags-1.3.2.crate) = 23021
+SHA256 (rust/crates/bytemuck-1.12.1.crate) = 2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da
+SIZE (rust/crates/bytemuck-1.12.1.crate) = 38293
+SHA256 (rust/crates/byteorder-1.4.3.crate) = 14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610
+SIZE (rust/crates/byteorder-1.4.3.crate) = 22512
+SHA256 (rust/crates/cc-1.0.73.crate) = 2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11
+SIZE (rust/crates/cc-1.0.73.crate) = 57880
+SHA256 (rust/crates/cfg-if-1.0.0.crate) = baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd
+SIZE (rust/crates/cfg-if-1.0.0.crate) = 7934
+SHA256 (rust/crates/clap-3.2.20.crate) = 23b71c3ce99b7611011217b366d923f1d0a7e07a92bb2dbf1e84508c673ca3bd
+SIZE (rust/crates/clap-3.2.20.crate) = 214114
+SHA256 (rust/crates/clap_lex-0.2.4.crate) = 2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5
+SIZE (rust/crates/clap_lex-0.2.4.crate) = 9652
+SHA256 (rust/crates/cloudflare-zlib-0.2.9.crate) = 2cfcefb5df07f146eb15756342a135eb7d76b8bb609eff9c111f7539d060f94d
+SIZE (rust/crates/cloudflare-zlib-0.2.9.crate) = 6113
+SHA256 (rust/crates/cloudflare-zlib-sys-0.3.0.crate) = 2040b6d1edfee6d75f172d81e2d2a7807534f3f294ce18184c70e7bb0105cd6f
+SIZE (rust/crates/cloudflare-zlib-sys-0.3.0.crate) = 143643
+SHA256 (rust/crates/color_quant-1.1.0.crate) = 3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b
+SIZE (rust/crates/color_quant-1.1.0.crate) = 6649
+SHA256 (rust/crates/crc-3.0.0.crate) = 53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3
+SIZE (rust/crates/crc-3.0.0.crate) = 9956
+SHA256 (rust/crates/crc-catalog-2.1.0.crate) = 2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff
+SIZE (rust/crates/crc-catalog-2.1.0.crate) = 9863
+SHA256 (rust/crates/crc32fast-1.3.2.crate) = b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d
+SIZE (rust/crates/crc32fast-1.3.2.crate) = 38661
+SHA256 (rust/crates/crossbeam-channel-0.5.6.crate) = c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521
+SIZE (rust/crates/crossbeam-channel-0.5.6.crate) = 90292
+SHA256 (rust/crates/crossbeam-deque-0.8.2.crate) = 715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc
+SIZE (rust/crates/crossbeam-deque-0.8.2.crate) = 21237
+SHA256 (rust/crates/crossbeam-epoch-0.9.10.crate) = 045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1
+SIZE (rust/crates/crossbeam-epoch-0.9.10.crate) = 46918
+SHA256 (rust/crates/crossbeam-utils-0.8.11.crate) = 51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc
+SIZE (rust/crates/crossbeam-utils-0.8.11.crate) = 40887
+SHA256 (rust/crates/either-1.8.0.crate) = 90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797
+SIZE (rust/crates/either-1.8.0.crate) = 15992
+SHA256 (rust/crates/filetime-0.2.17.crate) = e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c
+SIZE (rust/crates/filetime-0.2.17.crate) = 14484
+SHA256 (rust/crates/flate2-1.0.24.crate) = f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6
+SIZE (rust/crates/flate2-1.0.24.crate) = 70191
+SHA256 (rust/crates/glob-0.3.0.crate) = 9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574
+SIZE (rust/crates/glob-0.3.0.crate) = 18724
+SHA256 (rust/crates/hashbrown-0.12.3.crate) = 8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888
+SIZE (rust/crates/hashbrown-0.12.3.crate) = 102968
+SHA256 (rust/crates/hermit-abi-0.1.19.crate) = 62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33
+SIZE (rust/crates/hermit-abi-0.1.19.crate) = 9979
+SHA256 (rust/crates/image-0.24.3.crate) = 7e30ca2ecf7666107ff827a8e481de6a132a9b687ed3bb20bb1c144a36c00964
+SIZE (rust/crates/image-0.24.3.crate) = 265521
+SHA256 (rust/crates/indexmap-1.9.1.crate) = 10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e
+SIZE (rust/crates/indexmap-1.9.1.crate) = 54114
+SHA256 (rust/crates/iter-read-0.3.1.crate) = c397ca3ea05ad509c4ec451fea28b4771236a376ca1c69fd5143aae0cf8f93c4
+SIZE (rust/crates/iter-read-0.3.1.crate) = 8856
+SHA256 (rust/crates/itertools-0.10.3.crate) = a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3
+SIZE (rust/crates/itertools-0.10.3.crate) = 118661
+SHA256 (rust/crates/libc-0.2.132.crate) = 8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5
+SIZE (rust/crates/libc-0.2.132.crate) = 595317
+SHA256 (rust/crates/libdeflate-sys-0.10.0.crate) = 43afa5b192ff058426ba20a4f35c290ef402478d6045ac934ac15aa947a3898d
+SIZE (rust/crates/libdeflate-sys-0.10.0.crate) = 162828
+SHA256 (rust/crates/libdeflater-0.10.0.crate) = e656b7960ec49e864badc7ad1b810427a7ac8b78511a699ce5cdc3ead0b32e5b
+SIZE (rust/crates/libdeflater-0.10.0.crate) = 23520
+SHA256 (rust/crates/log-0.4.17.crate) = abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e
+SIZE (rust/crates/log-0.4.17.crate) = 38028
+SHA256 (rust/crates/memoffset-0.6.5.crate) = 5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce
+SIZE (rust/crates/memoffset-0.6.5.crate) = 7686
+SHA256 (rust/crates/miniz_oxide-0.5.4.crate) = 96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34
+SIZE (rust/crates/miniz_oxide-0.5.4.crate) = 53485
+SHA256 (rust/crates/miniz_oxide-0.6.2.crate) = b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa
+SIZE (rust/crates/miniz_oxide-0.6.2.crate) = 54536
+SHA256 (rust/crates/num-integer-0.1.45.crate) = 225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9
+SIZE (rust/crates/num-integer-0.1.45.crate) = 22529
+SHA256 (rust/crates/num-rational-0.4.1.crate) = 0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0
+SIZE (rust/crates/num-rational-0.4.1.crate) = 27889
+SHA256 (rust/crates/num-traits-0.2.15.crate) = 578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd
+SIZE (rust/crates/num-traits-0.2.15.crate) = 49262
+SHA256 (rust/crates/num_cpus-1.13.1.crate) = 19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1
+SIZE (rust/crates/num_cpus-1.13.1.crate) = 14752
+SHA256 (rust/crates/once_cell-1.14.0.crate) = 2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0
+SIZE (rust/crates/once_cell-1.14.0.crate) = 31614
+SHA256 (rust/crates/os_str_bytes-6.3.0.crate) = 9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff
+SIZE (rust/crates/os_str_bytes-6.3.0.crate) = 22928
+SHA256 (rust/crates/png-0.17.6.crate) = 8f0e7f4c94ec26ff209cee506314212639d6c91b80afb82984819fafce9df01c
+SIZE (rust/crates/png-0.17.6.crate) = 80695
+SHA256 (rust/crates/rayon-1.5.3.crate) = bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d
+SIZE (rust/crates/rayon-1.5.3.crate) = 167246
+SHA256 (rust/crates/rayon-core-1.9.3.crate) = 258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f
+SIZE (rust/crates/rayon-core-1.9.3.crate) = 65300
+SHA256 (rust/crates/redox_syscall-0.2.16.crate) = fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a
+SIZE (rust/crates/redox_syscall-0.2.16.crate) = 24012
+SHA256 (rust/crates/rgb-0.8.33.crate) = c3b221de559e4a29df3b957eec92bc0de6bc8eaf6ca9cfed43e5e1d67ff65a34
+SIZE (rust/crates/rgb-0.8.33.crate) = 16261
+SHA256 (rust/crates/rustc_version-0.4.0.crate) = bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366
+SIZE (rust/crates/rustc_version-0.4.0.crate) = 12175
+SHA256 (rust/crates/scopeguard-1.1.0.crate) = d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd
+SIZE (rust/crates/scopeguard-1.1.0.crate) = 11470
+SHA256 (rust/crates/semver-1.0.13.crate) = 93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711
+SIZE (rust/crates/semver-1.0.13.crate) = 29653
+SHA256 (rust/crates/stderrlog-0.5.3.crate) = af95cb8a5f79db5b2af2a46f44da7594b5adbcbb65cbf87b8da0959bfdd82460
+SIZE (rust/crates/stderrlog-0.5.3.crate) = 20368
+SHA256 (rust/crates/strsim-0.10.0.crate) = 73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623
+SIZE (rust/crates/strsim-0.10.0.crate) = 11355
+SHA256 (rust/crates/termcolor-1.1.3.crate) = bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755
+SIZE (rust/crates/termcolor-1.1.3.crate) = 17242
+SHA256 (rust/crates/textwrap-0.15.0.crate) = b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb
+SIZE (rust/crates/textwrap-0.15.0.crate) = 52998
+SHA256 (rust/crates/thread_local-1.1.4.crate) = 5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180
+SIZE (rust/crates/thread_local-1.1.4.crate) = 13106
+SHA256 (rust/crates/typed-arena-2.0.1.crate) = 0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae
+SIZE (rust/crates/typed-arena-2.0.1.crate) = 11439
+SHA256 (rust/crates/wild-2.1.0.crate) = 05b116685a6be0c52f5a103334cbff26db643826c7b3735fc0a3ba9871310a74
+SIZE (rust/crates/wild-2.1.0.crate) = 7548
+SHA256 (rust/crates/winapi-0.3.9.crate) = 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419
+SIZE (rust/crates/winapi-0.3.9.crate) = 1200382
+SHA256 (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6
+SIZE (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = 2918815
+SHA256 (rust/crates/winapi-util-0.1.5.crate) = 70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178
+SIZE (rust/crates/winapi-util-0.1.5.crate) = 10164
+SHA256 (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f
+SIZE (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 2947998
+SHA256 (rust/crates/windows-sys-0.36.1.crate) = ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2
+SIZE (rust/crates/windows-sys-0.36.1.crate) = 3347053
+SHA256 (rust/crates/windows_aarch64_msvc-0.36.1.crate) = 9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47
+SIZE (rust/crates/windows_aarch64_msvc-0.36.1.crate) = 661960
+SHA256 (rust/crates/windows_i686_gnu-0.36.1.crate) = 180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6
+SIZE (rust/crates/windows_i686_gnu-0.36.1.crate) = 818115
+SHA256 (rust/crates/windows_i686_msvc-0.36.1.crate) = e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024
+SIZE (rust/crates/windows_i686_msvc-0.36.1.crate) = 724575
+SHA256 (rust/crates/windows_x86_64_gnu-0.36.1.crate) = 4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1
+SIZE (rust/crates/windows_x86_64_gnu-0.36.1.crate) = 790934
+SHA256 (rust/crates/windows_x86_64_msvc-0.36.1.crate) = c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680
+SIZE (rust/crates/windows_x86_64_msvc-0.36.1.crate) = 661999
+SHA256 (rust/crates/zopfli-0.7.1.crate) = f1e0d16c30236860686a8f03d36b384dc2fc0675a8916367d2f9a1ecd795eab6
+SIZE (rust/crates/zopfli-0.7.1.crate) = 44416
diff --git a/graphics/oxipng/pkg-descr b/graphics/oxipng/pkg-descr
new file mode 100644
index 000000000000..26d4506414ad
--- /dev/null
+++ b/graphics/oxipng/pkg-descr
@@ -0,0 +1,3 @@
+Oxipng is a multithreaded lossless PNG compression optimizer. It can
+be used via a command-line interface or as a library in other Rust
+programs.