Index: third_party/talloc/libreplace/replace.h |
diff --git a/third_party/talloc/libreplace/replace.h b/third_party/talloc/libreplace/replace.h |
deleted file mode 100644 |
index 6424d10c0f9b9ed6f53f1740be6c97cf020e747b..0000000000000000000000000000000000000000 |
--- a/third_party/talloc/libreplace/replace.h |
+++ /dev/null |
@@ -1,726 +0,0 @@ |
-/* |
- Unix SMB/CIFS implementation. |
- |
- macros to go along with the lib/replace/ portability layer code |
- |
- Copyright (C) Andrew Tridgell 2005 |
- Copyright (C) Jelmer Vernooij 2006-2008 |
- Copyright (C) Jeremy Allison 2007. |
- |
- ** NOTE! The following LGPL license applies to the replace |
- ** library. This does NOT imply that all of Samba is released |
- ** under the LGPL |
- |
- This library is free software; you can redistribute it and/or |
- modify it under the terms of the GNU Lesser General Public |
- License as published by the Free Software Foundation; either |
- version 3 of the License, or (at your option) any later version. |
- |
- This library is distributed in the hope that it will be useful, |
- but WITHOUT ANY WARRANTY; without even the implied warranty of |
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
- Lesser General Public License for more details. |
- |
- You should have received a copy of the GNU Lesser General Public |
- License along with this library; if not, see <http://www.gnu.org/licenses/>. |
-*/ |
- |
-#ifndef _LIBREPLACE_REPLACE_H |
-#define _LIBREPLACE_REPLACE_H |
- |
-#ifndef NO_CONFIG_H |
-#include "config.h" |
-#endif |
- |
-#ifdef HAVE_STANDARDS_H |
-#include <standards.h> |
-#endif |
- |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <stdarg.h> |
-#include <errno.h> |
- |
-#if defined(_MSC_VER) || defined(__MINGW32__) |
-#include "win32_replace.h" |
-#endif |
- |
- |
-#ifdef HAVE_STDINT_H |
-#include <stdint.h> |
-/* force off HAVE_INTTYPES_H so that roken doesn't try to include both, |
- which causes a warning storm on irix */ |
-#undef HAVE_INTTYPES_H |
-#elif HAVE_INTTYPES_H |
-#define __STDC_FORMAT_MACROS |
-#include <inttypes.h> |
-#endif |
- |
-#ifndef __PRI64_PREFIX |
-# if __WORDSIZE == 64 |
-# define __PRI64_PREFIX "l" |
-# else |
-# define __PRI64_PREFIX "ll" |
-# endif |
-#endif |
- |
-/* Decimal notation. */ |
-#ifndef PRId8 |
-# define PRId8 "d" |
-#endif |
-#ifndef PRId16 |
-# define PRId16 "d" |
-#endif |
-#ifndef PRId32 |
-# define PRId32 "d" |
-#endif |
-#ifndef PRId64 |
-# define PRId64 __PRI64_PREFIX "d" |
-#endif |
- |
-#ifndef PRIi8 |
-# define PRIi8 "i" |
-#endif |
-#ifndef PRIi8 |
-# define PRIi16 "i" |
-#endif |
-#ifndef PRIi8 |
-# define PRIi32 "i" |
-#endif |
-#ifndef PRIi8 |
-# define PRIi64 __PRI64_PREFIX "i" |
-#endif |
- |
-#ifndef PRIu8 |
-# define PRIu8 "u" |
-#endif |
-#ifndef PRIu16 |
-# define PRIu16 "u" |
-#endif |
-#ifndef PRIu32 |
-# define PRIu32 "u" |
-#endif |
-#ifndef PRIu64 |
-# define PRIu64 __PRI64_PREFIX "u" |
-#endif |
- |
-#ifdef HAVE_STRING_H |
-#include <string.h> |
-#endif |
- |
-#ifdef HAVE_STRINGS_H |
-#include <strings.h> |
-#endif |
- |
-#ifdef HAVE_SYS_TYPES_H |
-#include <sys/types.h> |
-#endif |
- |
-#if STDC_HEADERS |
-#include <stdlib.h> |
-#include <stddef.h> |
-#endif |
- |
-#ifndef HAVE_STRERROR |
-extern char *sys_errlist[]; |
-#define strerror(i) sys_errlist[i] |
-#endif |
- |
-#ifndef HAVE_ERRNO_DECL |
-extern int errno; |
-#endif |
- |
-#ifndef HAVE_STRDUP |
-#define strdup rep_strdup |
-char *rep_strdup(const char *s); |
-#endif |
- |
-#ifndef HAVE_MEMMOVE |
-#define memmove rep_memmove |
-void *rep_memmove(void *dest,const void *src,int size); |
-#endif |
- |
-#ifndef HAVE_MKTIME |
-#define mktime rep_mktime |
-/* prototype is in "system/time.h" */ |
-#endif |
- |
-#ifndef HAVE_TIMEGM |
-#define timegm rep_timegm |
-/* prototype is in "system/time.h" */ |
-#endif |
- |
-#ifndef HAVE_UTIME |
-#define utime rep_utime |
-/* prototype is in "system/time.h" */ |
-#endif |
- |
-#ifndef HAVE_UTIMES |
-#define utimes rep_utimes |
-/* prototype is in "system/time.h" */ |
-#endif |
- |
-#ifndef HAVE_STRLCPY |
-#define strlcpy rep_strlcpy |
-size_t rep_strlcpy(char *d, const char *s, size_t bufsize); |
-#endif |
- |
-#ifndef HAVE_STRLCAT |
-#define strlcat rep_strlcat |
-size_t rep_strlcat(char *d, const char *s, size_t bufsize); |
-#endif |
- |
-#if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP)) |
-#undef HAVE_STRNDUP |
-#define strndup rep_strndup |
-char *rep_strndup(const char *s, size_t n); |
-#endif |
- |
-#if (defined(BROKEN_STRNLEN) || !defined(HAVE_STRNLEN)) |
-#undef HAVE_STRNLEN |
-#define strnlen rep_strnlen |
-size_t rep_strnlen(const char *s, size_t n); |
-#endif |
- |
-#if !HAVE_DECL_ENVIRON |
-#ifdef __APPLE__ |
-#include <crt_externs.h> |
-#define environ (*_NSGetEnviron()) |
-#else |
-extern char **environ; |
-#endif |
-#endif |
- |
-#ifndef HAVE_SETENV |
-#define setenv rep_setenv |
-int rep_setenv(const char *name, const char *value, int overwrite); |
-#else |
-#ifndef HAVE_SETENV_DECL |
-int setenv(const char *name, const char *value, int overwrite); |
-#endif |
-#endif |
- |
-#ifndef HAVE_UNSETENV |
-#define unsetenv rep_unsetenv |
-int rep_unsetenv(const char *name); |
-#endif |
- |
-#ifndef HAVE_SETEUID |
-#define seteuid rep_seteuid |
-int rep_seteuid(uid_t); |
-#endif |
- |
-#ifndef HAVE_SETEGID |
-#define setegid rep_setegid |
-int rep_setegid(gid_t); |
-#endif |
- |
-#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL)) |
-/* stupid glibc */ |
-int setresuid(uid_t ruid, uid_t euid, uid_t suid); |
-#endif |
-#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESGID_DECL)) |
-int setresgid(gid_t rgid, gid_t egid, gid_t sgid); |
-#endif |
- |
-#ifndef HAVE_CHOWN |
-#define chown rep_chown |
-int rep_chown(const char *path, uid_t uid, gid_t gid); |
-#endif |
- |
-#ifndef HAVE_CHROOT |
-#define chroot rep_chroot |
-int rep_chroot(const char *dirname); |
-#endif |
- |
-#ifndef HAVE_LINK |
-#define link rep_link |
-int rep_link(const char *oldpath, const char *newpath); |
-#endif |
- |
-#ifndef HAVE_READLINK |
-#define readlink rep_readlink |
-ssize_t rep_readlink(const char *path, char *buf, size_t bufsize); |
-#endif |
- |
-#ifndef HAVE_SYMLINK |
-#define symlink rep_symlink |
-int rep_symlink(const char *oldpath, const char *newpath); |
-#endif |
- |
-#ifndef HAVE_REALPATH |
-#define realpath rep_realpath |
-char *rep_realpath(const char *path, char *resolved_path); |
-#endif |
- |
-#ifndef HAVE_LCHOWN |
-#define lchown rep_lchown |
-int rep_lchown(const char *fname,uid_t uid,gid_t gid); |
-#endif |
- |
-#ifdef HAVE_UNIX_H |
-#include <unix.h> |
-#endif |
- |
-#ifndef HAVE_SETLINEBUF |
-#define setlinebuf rep_setlinebuf |
-void rep_setlinebuf(FILE *); |
-#endif |
- |
-#ifndef HAVE_STRCASESTR |
-#define strcasestr rep_strcasestr |
-char *rep_strcasestr(const char *haystack, const char *needle); |
-#endif |
- |
-#ifndef HAVE_STRTOK_R |
-#define strtok_r rep_strtok_r |
-char *rep_strtok_r(char *s, const char *delim, char **save_ptr); |
-#endif |
- |
-#ifndef HAVE_STRTOLL |
-#define strtoll rep_strtoll |
-long long int rep_strtoll(const char *str, char **endptr, int base); |
-#endif |
- |
-#ifndef HAVE_STRTOULL |
-#define strtoull rep_strtoull |
-unsigned long long int rep_strtoull(const char *str, char **endptr, int base); |
-#endif |
- |
-#ifndef HAVE_FTRUNCATE |
-#define ftruncate rep_ftruncate |
-int rep_ftruncate(int,off_t); |
-#endif |
- |
-#ifndef HAVE_INITGROUPS |
-#define initgroups rep_initgroups |
-int rep_initgroups(char *name, gid_t id); |
-#endif |
- |
-#if !defined(HAVE_BZERO) && defined(HAVE_MEMSET) |
-#define bzero(a,b) memset((a),'\0',(b)) |
-#endif |
- |
-#ifndef HAVE_DLERROR |
-#define dlerror rep_dlerror |
-char *rep_dlerror(void); |
-#endif |
- |
-#ifndef HAVE_DLOPEN |
-#define dlopen rep_dlopen |
-#ifdef DLOPEN_TAKES_UNSIGNED_FLAGS |
-void *rep_dlopen(const char *name, unsigned int flags); |
-#else |
-void *rep_dlopen(const char *name, int flags); |
-#endif |
-#endif |
- |
-#ifndef HAVE_DLSYM |
-#define dlsym rep_dlsym |
-void *rep_dlsym(void *handle, const char *symbol); |
-#endif |
- |
-#ifndef HAVE_DLCLOSE |
-#define dlclose rep_dlclose |
-int rep_dlclose(void *handle); |
-#endif |
- |
-#ifndef HAVE_SOCKETPAIR |
-#define socketpair rep_socketpair |
-/* prototype is in system/network.h */ |
-#endif |
- |
-#ifndef PRINTF_ATTRIBUTE |
-#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 ) |
-/** Use gcc attribute to check printf fns. a1 is the 1-based index of |
- * the parameter containing the format, and a2 the index of the first |
- * argument. Note that some gcc 2.x versions don't handle this |
- * properly **/ |
-#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) |
-#else |
-#define PRINTF_ATTRIBUTE(a1, a2) |
-#endif |
-#endif |
- |
-#ifndef _DEPRECATED_ |
-#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 ) |
-#define _DEPRECATED_ __attribute__ ((deprecated)) |
-#else |
-#define _DEPRECATED_ |
-#endif |
-#endif |
- |
-#ifndef HAVE_VASPRINTF |
-#define vasprintf rep_vasprintf |
-int rep_vasprintf(char **ptr, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0); |
-#endif |
- |
-#if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF) |
-#define snprintf rep_snprintf |
-int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4); |
-#endif |
- |
-#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF) |
-#define vsnprintf rep_vsnprintf |
-int rep_vsnprintf(char *,size_t ,const char *, va_list ap) PRINTF_ATTRIBUTE(3,0); |
-#endif |
- |
-#ifndef HAVE_ASPRINTF |
-#define asprintf rep_asprintf |
-int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3); |
-#endif |
- |
-#ifndef HAVE_VSYSLOG |
-#ifdef HAVE_SYSLOG |
-#define vsyslog rep_vsyslog |
-void rep_vsyslog (int facility_priority, const char *format, va_list arglist) PRINTF_ATTRIBUTE(2,0); |
-#endif |
-#endif |
- |
-/* we used to use these fns, but now we have good replacements |
- for snprintf and vsnprintf */ |
-#define slprintf snprintf |
- |
- |
-#ifndef HAVE_VA_COPY |
-#undef va_copy |
-#ifdef HAVE___VA_COPY |
-#define va_copy(dest, src) __va_copy(dest, src) |
-#else |
-#define va_copy(dest, src) (dest) = (src) |
-#endif |
-#endif |
- |
-#ifndef HAVE_VOLATILE |
-#define volatile |
-#endif |
- |
-#ifndef HAVE_COMPARISON_FN_T |
-typedef int (*comparison_fn_t)(const void *, const void *); |
-#endif |
- |
-#ifdef REPLACE_STRPTIME |
-#define strptime rep_strptime |
-struct tm; |
-char *rep_strptime(const char *buf, const char *format, struct tm *tm); |
-#endif |
- |
-#ifndef HAVE_DUP2 |
-#define dup2 rep_dup2 |
-int rep_dup2(int oldfd, int newfd); |
-#endif |
- |
-/* Load header file for dynamic linking stuff */ |
-#ifdef HAVE_DLFCN_H |
-#include <dlfcn.h> |
-#endif |
- |
-#ifndef RTLD_LAZY |
-#define RTLD_LAZY 0 |
-#endif |
-#ifndef RTLD_NOW |
-#define RTLD_NOW 0 |
-#endif |
-#ifndef RTLD_GLOBAL |
-#define RTLD_GLOBAL 0 |
-#endif |
- |
-#ifndef HAVE_SECURE_MKSTEMP |
-#define mkstemp(path) rep_mkstemp(path) |
-int rep_mkstemp(char *temp); |
-#endif |
- |
-#ifndef HAVE_MKDTEMP |
-#define mkdtemp rep_mkdtemp |
-char *rep_mkdtemp(char *template); |
-#endif |
- |
-#ifndef HAVE_PREAD |
-#define pread rep_pread |
-ssize_t rep_pread(int __fd, void *__buf, size_t __nbytes, off_t __offset); |
-#define LIBREPLACE_PREAD_REPLACED 1 |
-#else |
-#define LIBREPLACE_PREAD_NOT_REPLACED 1 |
-#endif |
- |
-#ifndef HAVE_PWRITE |
-#define pwrite rep_pwrite |
-ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset); |
-#define LIBREPLACE_PWRITE_REPLACED 1 |
-#else |
-#define LIBREPLACE_PWRITE_NOT_REPLACED 1 |
-#endif |
- |
-#if !defined(HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA) |
-#define inet_ntoa rep_inet_ntoa |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifndef HAVE_INET_PTON |
-#define inet_pton rep_inet_pton |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifndef HAVE_INET_NTOP |
-#define inet_ntop rep_inet_ntop |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifndef HAVE_INET_ATON |
-#define inet_aton rep_inet_aton |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifndef HAVE_CONNECT |
-#define connect rep_connect |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifndef HAVE_GETHOSTBYNAME |
-#define gethostbyname rep_gethostbyname |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifndef HAVE_GETIFADDRS |
-#define getifaddrs rep_getifaddrs |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifndef HAVE_FREEIFADDRS |
-#define freeifaddrs rep_freeifaddrs |
-/* prototype is in "system/network.h" */ |
-#endif |
- |
-#ifdef HAVE_LIMITS_H |
-#include <limits.h> |
-#endif |
- |
-#ifdef HAVE_SYS_PARAM_H |
-#include <sys/param.h> |
-#endif |
- |
-/* The extra casts work around common compiler bugs. */ |
-#define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) |
-/* The outer cast is needed to work around a bug in Cray C 5.0.3.0. |
- It is necessary at least when t == time_t. */ |
-#define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \ |
- ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) |
-#define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t))) |
- |
-#ifndef UINT16_MAX |
-#define UINT16_MAX 65535 |
-#endif |
- |
-#ifndef UINT32_MAX |
-#define UINT32_MAX (4294967295U) |
-#endif |
- |
-#ifndef UINT64_MAX |
-#define UINT64_MAX ((uint64_t)-1) |
-#endif |
- |
-#ifndef CHAR_BIT |
-#define CHAR_BIT 8 |
-#endif |
- |
-#ifndef INT32_MAX |
-#define INT32_MAX _TYPE_MAXIMUM(int32_t) |
-#endif |
- |
-#ifdef HAVE_STDBOOL_H |
-#include <stdbool.h> |
-#endif |
- |
-#if !defined(HAVE_BOOL) |
-#ifdef HAVE__Bool |
-#define bool _Bool |
-#else |
-typedef int bool; |
-#endif |
-#endif |
- |
-#if !defined(HAVE_INTPTR_T) |
-typedef long long intptr_t ; |
-#endif |
- |
-#if !defined(HAVE_UINTPTR_T) |
-typedef unsigned long long uintptr_t ; |
-#endif |
- |
-#if !defined(HAVE_PTRDIFF_T) |
-typedef unsigned long long ptrdiff_t ; |
-#endif |
- |
-/* |
- * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool' |
- * |
- * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED |
- * Tru64 needs _BOOL_EXISTS |
- * AIX needs _BOOL,_TRUE,_FALSE |
- */ |
-#ifndef BOOL_DEFINED |
-#define BOOL_DEFINED |
-#endif |
-#ifndef _BOOL_EXISTS |
-#define _BOOL_EXISTS |
-#endif |
-#ifndef _BOOL |
-#define _BOOL |
-#endif |
- |
-#ifndef __bool_true_false_are_defined |
-#define __bool_true_false_are_defined |
-#endif |
- |
-#ifndef true |
-#define true (1) |
-#endif |
-#ifndef false |
-#define false (0) |
-#endif |
- |
-#ifndef _TRUE |
-#define _TRUE true |
-#endif |
-#ifndef _FALSE |
-#define _FALSE false |
-#endif |
- |
-#ifndef HAVE_FUNCTION_MACRO |
-#ifdef HAVE_func_MACRO |
-#define __FUNCTION__ __func__ |
-#else |
-#define __FUNCTION__ ("") |
-#endif |
-#endif |
- |
- |
-#ifndef MIN |
-#define MIN(a,b) ((a)<(b)?(a):(b)) |
-#endif |
- |
-#ifndef MAX |
-#define MAX(a,b) ((a)>(b)?(a):(b)) |
-#endif |
- |
-#if !defined(HAVE_VOLATILE) |
-#define volatile |
-#endif |
- |
-/** |
- this is a warning hack. The idea is to use this everywhere that we |
- get the "discarding const" warning from gcc. That doesn't actually |
- fix the problem of course, but it means that when we do get to |
- cleaning them up we can do it by searching the code for |
- discard_const. |
- |
- It also means that other error types aren't as swamped by the noise |
- of hundreds of const warnings, so we are more likely to notice when |
- we get new errors. |
- |
- Please only add more uses of this macro when you find it |
- _really_ hard to fix const warnings. Our aim is to eventually use |
- this function in only a very few places. |
- |
- Also, please call this via the discard_const_p() macro interface, as that |
- makes the return type safe. |
-*/ |
-#define discard_const(ptr) ((void *)((uintptr_t)(ptr))) |
- |
-/** Type-safe version of discard_const */ |
-#define discard_const_p(type, ptr) ((type *)discard_const(ptr)) |
- |
-#ifndef __STRING |
-#define __STRING(x) #x |
-#endif |
- |
-#ifndef __STRINGSTRING |
-#define __STRINGSTRING(x) __STRING(x) |
-#endif |
- |
-#ifndef __LINESTR__ |
-#define __LINESTR__ __STRINGSTRING(__LINE__) |
-#endif |
- |
-#ifndef __location__ |
-#define __location__ __FILE__ ":" __LINESTR__ |
-#endif |
- |
-/** |
- * zero a structure |
- */ |
-#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x)) |
- |
-/** |
- * zero a structure given a pointer to the structure |
- */ |
-#define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0) |
- |
-/** |
- * zero a structure given a pointer to the structure - no zero check |
- */ |
-#define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x))) |
- |
-/* zero an array - note that sizeof(array) must work - ie. it must not be a |
- pointer */ |
-#define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x)) |
- |
-/** |
- * work out how many elements there are in a static array |
- */ |
-#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) |
- |
-/** |
- * pointer difference macro |
- */ |
-#define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2))) |
- |
-#if MMAP_BLACKLIST |
-#undef HAVE_MMAP |
-#endif |
- |
-#ifdef __COMPAR_FN_T |
-#define QSORT_CAST (__compar_fn_t) |
-#endif |
- |
-#ifndef QSORT_CAST |
-#define QSORT_CAST (int (*)(const void *, const void *)) |
-#endif |
- |
-#ifndef PATH_MAX |
-#define PATH_MAX 1024 |
-#endif |
- |
-#ifndef MAX_DNS_NAME_LENGTH |
-#define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */ |
-#endif |
- |
-#ifndef HAVE_CRYPT |
-char *ufc_crypt(const char *key, const char *salt); |
-#define crypt ufc_crypt |
-#else |
-#ifdef HAVE_CRYPT_H |
-#include <crypt.h> |
-#endif |
-#endif |
- |
-/* these macros gain us a few percent of speed on gcc */ |
-#if (__GNUC__ >= 3) |
-/* the strange !! is to ensure that __builtin_expect() takes either 0 or 1 |
- as its first argument */ |
-#ifndef likely |
-#define likely(x) __builtin_expect(!!(x), 1) |
-#endif |
-#ifndef unlikely |
-#define unlikely(x) __builtin_expect(!!(x), 0) |
-#endif |
-#else |
-#ifndef likely |
-#define likely(x) (x) |
-#endif |
-#ifndef unlikely |
-#define unlikely(x) (x) |
-#endif |
-#endif |
- |
-#endif /* _LIBREPLACE_REPLACE_H */ |