diff options
author | shannonjr <shannonjr@pkgsrc.org> | 2006-01-29 15:54:04 +0000 |
---|---|---|
committer | shannonjr <shannonjr@pkgsrc.org> | 2006-01-29 15:54:04 +0000 |
commit | 33cbcbfe6317b588e4fb18225ea7f93a5f3751ea (patch) | |
tree | 9d8fa9cc0720ab439491b3aa1998afb78c297f7d /security/libprelude | |
parent | e9cc052417e904e1497c5046066f38d073ab91b2 (diff) | |
download | pkgsrc-33cbcbfe6317b588e4fb18225ea7f93a5f3751ea.tar.gz |
Prelude is a hybrid IDS consisting of multiple
sensors, managers, and a display console. LibPrelude
is the glue that binds all aspects of Prelude together.
LibPrelude is a library which enables Prelude
components to communicate in a standard IDMEF method.
This is one of several new packages in the Prelude family.
Diffstat (limited to 'security/libprelude')
-rw-r--r-- | security/libprelude/DESCR | 5 | ||||
-rw-r--r-- | security/libprelude/Makefile | 45 | ||||
-rw-r--r-- | security/libprelude/PLIST | 106 | ||||
-rw-r--r-- | security/libprelude/PLIST.py | 3 | ||||
-rw-r--r-- | security/libprelude/buildlink3.mk | 20 | ||||
-rw-r--r-- | security/libprelude/distinfo | 8 | ||||
-rw-r--r-- | security/libprelude/options.mk | 29 | ||||
-rw-r--r-- | security/libprelude/patches/patch-aa | 80 | ||||
-rw-r--r-- | security/libprelude/patches/patch-ab | 21 | ||||
-rw-r--r-- | security/libprelude/patches/patch-ac | 104 |
10 files changed, 421 insertions, 0 deletions
diff --git a/security/libprelude/DESCR b/security/libprelude/DESCR new file mode 100644 index 00000000000..71bebdbaad3 --- /dev/null +++ b/security/libprelude/DESCR @@ -0,0 +1,5 @@ +Prelude is a hybrid IDS consisting of multiple +sensors, managers, and a display console. LibPrelude +is the glue that binds all aspects of Prelude together. +LibPrelude is a library which enables Prelude +components to communicate in a standard IDMEF method. diff --git a/security/libprelude/Makefile b/security/libprelude/Makefile new file mode 100644 index 00000000000..53957319868 --- /dev/null +++ b/security/libprelude/Makefile @@ -0,0 +1,45 @@ +# $NetBSD: Makefile,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ +# +DISTNAME= libprelude-0.9.3 +CATEGORIES= security +MASTER_SITES= http://www.prelude-ids.org/download/releases/ + +MAINTAINER= shannonjr@NetBSD.org +HOMEPAGE= http://www.prelude-ids.org/download/releases/ +COMMENT= Provides the framework for using the Prelude system + +.include "../../mk/bsd.prefs.mk" +.include "options.mk" + +PRELUDE_USER?= _prelude +PRELUDE_GROUP?= _prelude + +USE_PKGLOCALEDIR= yes +USE_LIBTOOL= yes +GNU_CONFIGURE= yes +USE_GNU_TOOLS+= make +USE_TOOLS+= bison gawk +CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR:Q} +CONFIGURE_ARGS+= --localstatedir=${VARBASE:Q} +CONFIGURE_ARGS+= --with-html-dir=${PREFIX}/share/doc +PRELUDE_USER?= _prelude +PRELUDE_GROUP?= _prelude +PRELUDE_HOME?= ${VARBASE:Q}/spool/prelude +PKG_USERS= ${PRELUDE_USER}:${PRELUDE_GROUP}::Prelude\ IDS:${PRELUDE_HOME}:${NOLOGIN} +PKG_GROUPS= ${PRELUDE_GROUP} + +post-install: + ${INSTALL_DATA_DIR} ${PREFIX}/share/examples/libprelude/ + ${INSTALL_DATA} ${WRKSRC}/client.conf \ + ${PREFIX}/share/examples/libprelude/client.conf-dist + ${INSTALL_DATA} ${WRKSRC}/global.conf \ + ${PREFIX}/share/examples/libprelude/global.conf-dist + ${INSTALL_DATA} ${WRKSRC}/idmef-client.conf \ + ${PREFIX}/share/examples/libprelude/idmef-client.conf-dist + ${INSTALL_DATA} ${WRKSRC}/tls.conf \ + ${PREFIX}/share/examples/libprelude/tls.conf-dist + ${CHOWN} -R ${PRELUDE_USER}:${PRELUDE_GROUP} ${PRELUDE_HOME} + +.include "../../security/gnutls/buildlink3.mk" +.include "../../mk/pthread.buildlink3.mk" +.include "../../mk/bsd.pkg.mk" diff --git a/security/libprelude/PLIST b/security/libprelude/PLIST new file mode 100644 index 00000000000..f10cf98c42a --- /dev/null +++ b/security/libprelude/PLIST @@ -0,0 +1,106 @@ +@comment $NetBSD: PLIST,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ +bin/libprelude-config +bin/prelude-adduser +include/libprelude/common.h +include/libprelude/daemonize.h +include/libprelude/idmef-additional-data.h +include/libprelude/idmef-class.h +include/libprelude/idmef-criteria.h +include/libprelude/idmef-criterion-value.h +include/libprelude/idmef-data.h +include/libprelude/idmef-message-id.h +include/libprelude/idmef-message-print.h +include/libprelude/idmef-message-read.h +include/libprelude/idmef-message-write.h +include/libprelude/idmef-path.h +include/libprelude/idmef-time.h +include/libprelude/idmef-tree-data.h +include/libprelude/idmef-tree-wrap.h +include/libprelude/idmef-value-type.h +include/libprelude/idmef-value.h +include/libprelude/idmef.h +include/libprelude/prelude-async.h +include/libprelude/prelude-client-profile.h +include/libprelude/prelude-client.h +include/libprelude/prelude-config.h +include/libprelude/prelude-connection-pool.h +include/libprelude/prelude-connection.h +include/libprelude/prelude-error.h +include/libprelude/prelude-extract.h +include/libprelude/prelude-failover.h +include/libprelude/prelude-hash.h +include/libprelude/prelude-ident.h +include/libprelude/prelude-inttypes.h +include/libprelude/prelude-io.h +include/libprelude/prelude-linked-object.h +include/libprelude/prelude-list.h +include/libprelude/prelude-log.h +include/libprelude/prelude-message-id.h +include/libprelude/prelude-msg.h +include/libprelude/prelude-msgbuf.h +include/libprelude/prelude-option-wide.h +include/libprelude/prelude-option.h +include/libprelude/prelude-plugin.h +include/libprelude/prelude-string.h +include/libprelude/prelude-timer.h +include/libprelude/prelude.h +include/libprelude/variable.h +lib/libprelude.la +share/aclocal/libprelude.m4 +share/doc/libprelude/ch01.html +share/doc/libprelude/ch02.html +share/doc/libprelude/ch03.html +share/doc/libprelude/ch04.html +share/doc/libprelude/home.png +share/doc/libprelude/index.html +share/doc/libprelude/index.sgml +share/doc/libprelude/left.png +share/doc/libprelude/libprelude-idmef-additional-data.html +share/doc/libprelude/libprelude-idmef-criteria.html +share/doc/libprelude/libprelude-idmef-criterion-value.html +share/doc/libprelude/libprelude-idmef-data.html +share/doc/libprelude/libprelude-idmef-message-print.html +share/doc/libprelude/libprelude-idmef-message-read.html +share/doc/libprelude/libprelude-idmef-message-write.html +share/doc/libprelude/libprelude-idmef-path.html +share/doc/libprelude/libprelude-idmef-time.html +share/doc/libprelude/libprelude-idmef-tree-wrap.html +share/doc/libprelude/libprelude-idmef-value.html +share/doc/libprelude/libprelude-prelude-async.html +share/doc/libprelude/libprelude-prelude-client-profile.html +share/doc/libprelude/libprelude-prelude-client.html +share/doc/libprelude/libprelude-prelude-connection-pool.html +share/doc/libprelude/libprelude-prelude-connection.html +share/doc/libprelude/libprelude-prelude-error.html +share/doc/libprelude/libprelude-prelude-extract.html +share/doc/libprelude/libprelude-prelude-failover.html +share/doc/libprelude/libprelude-prelude-hash.html +share/doc/libprelude/libprelude-prelude-ident.html +share/doc/libprelude/libprelude-prelude-inttypes.html +share/doc/libprelude/libprelude-prelude-io.html +share/doc/libprelude/libprelude-prelude-linked-object.html +share/doc/libprelude/libprelude-prelude-list.html +share/doc/libprelude/libprelude-prelude-log.html +share/doc/libprelude/libprelude-prelude-msg.html +share/doc/libprelude/libprelude-prelude-msgbuf.html +share/doc/libprelude/libprelude-prelude-option-wide.html +share/doc/libprelude/libprelude-prelude-option.html +share/doc/libprelude/libprelude-prelude-plugin.html +share/doc/libprelude/libprelude-prelude-string.html +share/doc/libprelude/libprelude-prelude-timer.html +share/doc/libprelude/libprelude-prelude.html +share/doc/libprelude/libprelude.devhelp +share/doc/libprelude/pt01.html +share/doc/libprelude/pt02.html +share/doc/libprelude/pt03.html +share/doc/libprelude/pt04.html +share/doc/libprelude/right.png +share/doc/libprelude/style.css +share/doc/libprelude/up.png +share/examples/libprelude/client.conf-dist +share/examples/libprelude/global.conf-dist +share/examples/libprelude/idmef-client.conf-dist +share/examples/libprelude/tls.conf-dist +@dirrm share/examples/libprelude +@dirrm share/doc/libprelude +@dirrm include/libprelude diff --git a/security/libprelude/PLIST.py b/security/libprelude/PLIST.py new file mode 100644 index 00000000000..72366dd1b1a --- /dev/null +++ b/security/libprelude/PLIST.py @@ -0,0 +1,3 @@ +@comment $NetBSD: PLIST.py,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ +${PYSITELIB}/_prelude.so +${PYSITELIB}/prelude.pyc diff --git a/security/libprelude/buildlink3.mk b/security/libprelude/buildlink3.mk new file mode 100644 index 00000000000..a927749c72b --- /dev/null +++ b/security/libprelude/buildlink3.mk @@ -0,0 +1,20 @@ +# $NetBSD: buildlink3.mk,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ + +BUILDLINK_DEPTH:= ${BUILDLINK_DEPTH}+ +LIBPRELUDE_BUILDLINK3_MK:= ${LIBPRELUDE_BUILDLINK3_MK}+ + +.if !empty(BUILDLINK_DEPTH:M+) +BUILDLINK_DEPENDS+= libprelude +.endif + +BUILDLINK_PACKAGES:= ${BUILDLINK_PACKAGES:Nlibprelude} +BUILDLINK_PACKAGES+= libprelude + +.if !empty(LIBPRELUDE_BUILDLINK3_MK:M+) +BUILDLINK_DEPENDS.libprelude+= libprelude>=0.9.0 +BUILDLINK_PKGSRCDIR.libprelude?= ../../security/libprelude +.endif # LIBPRELUDE_BUILDLINK3_MK + +.include "../../security/gnutls/buildlink3.mk" + +BUILDLINK_DEPTH:= ${BUILDLINK_DEPTH:S/+$//} diff --git a/security/libprelude/distinfo b/security/libprelude/distinfo new file mode 100644 index 00000000000..4da9949aba2 --- /dev/null +++ b/security/libprelude/distinfo @@ -0,0 +1,8 @@ +$NetBSD: distinfo,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ + +SHA1 (libprelude-0.9.3.tar.gz) = 38bc3bd102d21b164ed7da6586ada38b55fbe46a +RMD160 (libprelude-0.9.3.tar.gz) = 40b520978a71fd7dbcce4dd84e5fc16b75632543 +Size (libprelude-0.9.3.tar.gz) = 1704602 bytes +SHA1 (patch-aa) = 1d788517feb2ef687777ae6640033d9f177b07f8 +SHA1 (patch-ab) = 592f42a6d9217c502eb49e8fb0ba7d17a49f2ada +SHA1 (patch-ac) = 34f11cdf22cbdc843ed0db6ea017a56b2ec780ca diff --git a/security/libprelude/options.mk b/security/libprelude/options.mk new file mode 100644 index 00000000000..40041ac1366 --- /dev/null +++ b/security/libprelude/options.mk @@ -0,0 +1,29 @@ +# $NetBSD: options.mk,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ + +PKG_OPTIONS_VAR= PKG_OPTIONS.libprelude +PKG_SUPPORTED_OPTIONS= perl python + +.include "../../mk/bsd.options.mk" + +### +### Whether to build with the perl and python plugins +### +### python is needed for prewikka +### + +.if !empty(PKG_OPTIONS:Mperl) +USE_PERL= run +CONFIGURE_ARGS+= --enable-perl +REPLACE_PERL+= bindings/perl/Makefile.PL +.else +CONFIGURE_ARGS+= --disable-perl +.endif +.if !empty(PKG_OPTIONS:Mpython) +CONFIGURE_ARGS+= --enable-python +CONFIGURE_ENV+= PYTHON=${PYTHONBIN:Q} +PY_PATCHPLIST= yes +.include "../../lang/python/application.mk" +.include "../../lang/python/extension.mk" +.else +CONFIGURE_ARGS+= --disable-python +.endif diff --git a/security/libprelude/patches/patch-aa b/security/libprelude/patches/patch-aa new file mode 100644 index 00000000000..8c9a6fd5807 --- /dev/null +++ b/security/libprelude/patches/patch-aa @@ -0,0 +1,80 @@ +$NetBSD: patch-aa,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ + +--- prelude-adduser/prelude-adduser.c.orig 2005-06-26 05:41:44.000000000 -0600 ++++ prelude-adduser/prelude-adduser.c +@@ -43,6 +43,8 @@ + #include <gnutls/x509.h> + #include <gnutls/extra.h> + ++#include <fts.h> ++ + #include "common.h" + #include "config-engine.h" + #include "prelude-error.h" +@@ -886,6 +888,66 @@ static int del_cb(const char *filename, + } + + ++int ++ftw(const char *path, int (*fn)(const char *, const struct stat *, int), ++ int nfds) ++{ ++ char * const paths[2] = { (char *)path, NULL }; ++ FTSENT *cur; ++ FTS *ftsp; ++ int error = 0, fnflag, sverrno; ++ ++ /* XXX - nfds is currently unused */ ++ if (nfds < 1 || nfds > OPEN_MAX) { ++ errno = EINVAL; ++ return (-1); ++ } ++ ++ ftsp = fts_open(paths, FTS_LOGICAL | FTS_COMFOLLOW | FTS_NOCHDIR, NULL); ++ if (ftsp == NULL) ++ return (-1); ++ while ((cur = fts_read(ftsp)) != NULL) { ++ switch (cur->fts_info) { ++ case FTS_D: ++ fnflag = FTW_D; ++ break; ++ case FTS_DNR: ++ fnflag = FTW_DNR; ++ break; ++ case FTS_DP: ++ /* we only visit in preorder */ ++ continue; ++ case FTS_F: ++ case FTS_DEFAULT: ++ fnflag = FTW_F; ++ break; ++ case FTS_NS: ++ case FTS_NSOK: ++ case FTS_SLNONE: ++ fnflag = FTW_NS; ++ break; ++ case FTS_SL: ++ fnflag = FTW_SL; ++ break; ++ case FTS_DC: ++ errno = ELOOP; ++ /* FALLTHROUGH */ ++ default: ++ error = -1; ++ goto done; ++ } ++ error = fn(cur->fts_path, cur->fts_statp, fnflag); ++ if (error != 0) ++ break; ++ } ++done: ++ sverrno = errno; ++ if (fts_close(ftsp) != 0 && error == 0) ++ error = -1; ++ else ++ errno = sverrno; ++ return (error); ++} + + static void delete_dir(const char *dirname) + { diff --git a/security/libprelude/patches/patch-ab b/security/libprelude/patches/patch-ab new file mode 100644 index 00000000000..9325f98abf3 --- /dev/null +++ b/security/libprelude/patches/patch-ab @@ -0,0 +1,21 @@ +$NetBSD: patch-ab,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ +--- src/tls-auth.c.orig Mon Jul 25 15:58:08 2005 ++++ src/tls-auth.c Mon Aug 15 12:38:00 2005 +@@ -165,6 +165,7 @@ int tls_auth_connection(prelude_client_p + int ret, fd; + void *cred; + gnutls_session session; ++ int cipher_list[2]; + + ret = prelude_client_profile_get_credentials(cp, &cred); + if ( ret < 0 ) +@@ -172,6 +173,9 @@ int tls_auth_connection(prelude_client_p + + gnutls_init(&session, GNUTLS_CLIENT); + gnutls_set_default_priority(session); ++ cipher_list[0] = GNUTLS_CIPHER_AES_128_CBC; ++ cipher_list[1] = 0; ++ gnutls_cipher_set_priority (session, cipher_list); + gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, cred); + + fd = prelude_io_get_fd(io); diff --git a/security/libprelude/patches/patch-ac b/security/libprelude/patches/patch-ac new file mode 100644 index 00000000000..46d1d5fb241 --- /dev/null +++ b/security/libprelude/patches/patch-ac @@ -0,0 +1,104 @@ +$NetBSD: patch-ac,v 1.1.1.1 2006/01/29 15:54:04 shannonjr Exp $ + +--- Makefile.in.orig 2005-12-13 12:36:41.000000000 -0700 ++++ Makefile.in +@@ -827,71 +827,71 @@ prelude-config.h: $(top_builddir)/config + # Spool directory for report saving is mode + + install-data-local: +- $(INSTALL) -d -m 755 $(DESTDIR)$(prelude_spool_dir); +- $(INSTALL) -d -m 755 $(DESTDIR)$(prelude_config_dir); +- $(INSTALL) -d -m 755 $(DESTDIR)$(prelude_config_dir)/default; +- $(INSTALL) -d -m 755 $(DESTDIR)$(prelude_config_dir)/profile; +- @if test -f $(DESTDIR)$(prelude_config_dir)/default/client.conf; then \ ++ $(INSTALL) -d -m 755 $(prelude_spool_dir); ++ $(INSTALL) -d -m 755 $(prelude_config_dir); ++ $(INSTALL) -d -m 755 $(prelude_config_dir)/default; ++ $(INSTALL) -d -m 755 $(prelude_config_dir)/profile; ++ @if test -f $(prelude_config_dir)/default/client.conf; then \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- echo "$(DESTDIR)$(prelude_config_dir)/default/client.conf already exist..."; \ +- echo "Installing default configuration in $(DESTDIR)$(prelude_config_dir)/default/client.conf-dist"; \ ++ echo "$(prelude_config_dir)/default/client.conf already exist..."; \ ++ echo "Installing default configuration in $(prelude_config_dir)/default/client.conf-dist"; \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- $(INSTALL) -m 644 $(top_srcdir)/client.conf $(DESTDIR)$(prelude_config_dir)/default/client.conf-dist; \ ++ $(INSTALL) -m 644 $(top_srcdir)/client.conf $(prelude_config_dir)/default/client.conf-dist; \ + else \ +- $(INSTALL) -m 644 $(top_srcdir)/client.conf $(DESTDIR)$(prelude_config_dir)/default; \ ++ $(INSTALL) -m 644 $(top_srcdir)/client.conf $(prelude_config_dir)/default; \ + fi + +- @if test -f $(DESTDIR)$(prelude_config_dir)/default/global.conf; then \ ++ @if test -f $(prelude_config_dir)/default/global.conf; then \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- echo "$(DESTDIR)$(prelude_config_dir)/default/global.conf already exist..."; \ +- echo "Installing default configuration in $(DESTDIR)$(prelude_config_dir)/default/global.conf-dist"; \ ++ echo "$(prelude_config_dir)/default/global.conf already exist..."; \ ++ echo "Installing default configuration in $(prelude_config_dir)/default/global.conf-dist"; \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- $(INSTALL) -m 644 $(top_srcdir)/global.conf $(DESTDIR)$(prelude_config_dir)/default/global.conf-dist; \ ++ $(INSTALL) -m 644 $(top_srcdir)/global.conf $(prelude_config_dir)/default/global.conf-dist; \ + else \ +- $(INSTALL) -m 644 $(top_srcdir)/global.conf $(DESTDIR)$(prelude_config_dir)/default; \ ++ $(INSTALL) -m 644 $(top_srcdir)/global.conf $(prelude_config_dir)/default; \ + fi + +- @if test -f $(DESTDIR)$(prelude_config_dir)/default/idmef-client.conf; then \ ++ @if test -f $(prelude_config_dir)/default/idmef-client.conf; then \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- echo "$(DESTDIR)$(prelude_config_dir)/default/idmef-client.conf already exist..."; \ +- echo "Installing default configuration in $(DESTDIR)$(prelude_config_dir)/default/idmef-client.conf-dist"; \ ++ echo "$(prelude_config_dir)/default/idmef-client.conf already exist..."; \ ++ echo "Installing default configuration in $(prelude_config_dir)/default/idmef-client.conf-dist"; \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- $(INSTALL) -m 644 $(top_srcdir)/idmef-client.conf $(DESTDIR)$(prelude_config_dir)/default/idmef-client.conf-dist; \ ++ $(INSTALL) -m 644 $(top_srcdir)/idmef-client.conf $(prelude_config_dir)/default/idmef-client.conf-dist; \ + else \ +- $(INSTALL) -m 644 $(top_srcdir)/idmef-client.conf $(DESTDIR)$(prelude_config_dir)/default; \ ++ $(INSTALL) -m 644 $(top_srcdir)/idmef-client.conf $(prelude_config_dir)/default; \ + fi + +- @if test -f $(DESTDIR)$(prelude_config_dir)/default/tls.conf; then \ ++ @if test -f $(prelude_config_dir)/default/tls.conf; then \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- echo "$(DESTDIR)$(prelude_config_dir)/default/tls.conf already exist..."; \ +- echo "Installing default configuration in $(DESTDIR)$(prelude_config_dir)/default/tls.conf-dist"; \ ++ echo "$(prelude_config_dir)/default/tls.conf already exist..."; \ ++ echo "Installing default configuration in $(prelude_config_dir)/default/tls.conf-dist"; \ + echo; \ + echo "********************************************************************************"; \ + echo; \ +- $(INSTALL) -m 644 $(top_srcdir)/tls.conf $(DESTDIR)$(prelude_config_dir)/default/tls.conf-dist; \ ++ $(INSTALL) -m 644 $(top_srcdir)/tls.conf $(prelude_config_dir)/default/tls.conf-dist; \ + else \ +- $(INSTALL) -m 644 $(top_srcdir)/tls.conf $(DESTDIR)$(prelude_config_dir)/default; \ ++ $(INSTALL) -m 644 $(top_srcdir)/tls.conf $(prelude_config_dir)/default; \ + fi + + uninstall-local: +- rm -f $(DESTDIR)$(prelude_config_dir)/default/client.conf +- rm -f $(DESTDIR)$(prelude_config_dir)/default/global.conf +- rm -f $(DESTDIR)$(prelude_config_dir)/default/idmef-client.conf +- rm -f $(DESTDIR)$(prelude_config_dir)/default/tls.conf ++ rm -f $(prelude_config_dir)/default/client.conf ++ rm -f $(prelude_config_dir)/default/global.conf ++ rm -f $(prelude_config_dir)/default/idmef-client.conf ++ rm -f $(prelude_config_dir)/default/tls.conf + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: |