summaryrefslogtreecommitdiff
path: root/shared/ossp_uuid/uuid.pod
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:07:43 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:07:43 +0200
commit4226e548662339ea1ca37b45385a7cf9b237ff1e (patch)
tree9a3fa54b85d97f05164e41bdb96b82f748a37342 /shared/ossp_uuid/uuid.pod
parent3.7 (diff)
downloadFreeFileSync-4226e548662339ea1ca37b45385a7cf9b237ff1e.tar.gz
FreeFileSync-4226e548662339ea1ca37b45385a7cf9b237ff1e.tar.bz2
FreeFileSync-4226e548662339ea1ca37b45385a7cf9b237ff1e.zip
3.8
Diffstat (limited to 'shared/ossp_uuid/uuid.pod')
-rw-r--r--shared/ossp_uuid/uuid.pod529
1 files changed, 0 insertions, 529 deletions
diff --git a/shared/ossp_uuid/uuid.pod b/shared/ossp_uuid/uuid.pod
deleted file mode 100644
index 4ad3742b..00000000
--- a/shared/ossp_uuid/uuid.pod
+++ /dev/null
@@ -1,529 +0,0 @@
-##
-## OSSP uuid - Universally Unique Identifier
-## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
-## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
-##
-## This file is part of OSSP uuid, a library for the generation
-## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
-##
-## Permission to use, copy, modify, and distribute this software for
-## any purpose with or without fee is hereby granted, provided that
-## the above copyright notice and this permission notice appear in all
-## copies.
-##
-## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
-## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-## SUCH DAMAGE.
-##
-## uuid.pod: manual page
-##
-
-=pod
-
-=head1 NAME
-
-B<OSSP uuid> - B<Universally Unique Identifier>
-
-=head1 VERSION
-
-OSSP uuid UUID_VERSION_STR
-
-=head1 DESCRIPTION
-
-B<OSSP uuid> is a ISO-C:1999 application programming interface (API) and
-corresponding command line interface (CLI) for the generation of DCE
-1.1, ISO/IEC 11578:1996 and IETF RFC-4122 compliant I<Universally Unique
-Identifier> (UUID). It supports DCE 1.1 variant UUIDs of version 1 (time
-and node based), version 3 (name based, MD5), version 4 (random number
-based) and version 5 (name based, SHA-1). Additional API bindings are
-provided for the languages ISO-C++:1998, Perl:5 and PHP:4/5. Optional
-backward compatibility exists for the ISO-C DCE-1.1 and Perl Data::UUID
-APIs.
-
-UUIDs are 128 bit numbers which are intended to have a high likelihood
-of uniqueness over space and time and are computationally difficult
-to guess. They are globally unique identifiers which can be locally
-generated without contacting a global registration authority. UUIDs
-are intended as unique identifiers for both mass tagging objects
-with an extremely short lifetime and to reliably identifying very
-persistent objects across a network.
-
-This is the ISO-C application programming interface (API) of B<OSSP uuid>.
-
-=head2 UUID Binary Representation
-
-According to the DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122
-standards, a DCE 1.1 variant UUID is a 128 bit number defined out of 7
-fields, each field a multiple of an octet in size and stored in network
-byte order:
-
- [4]
- version
- -->| |<--
- | |
- | | [16]
- [32] [16] | |time_hi
- time_low time_mid | _and_version
- |<---------------------------->||<------------>||<------------>|
- | MSB || || | |
- | / || || | |
- |/ || || | |
-
- +------++------++------++------++------++------++------++------+~~
- | 15 || 14 || 13 || 12 || 11 || 10 |####9 || 8 |
- | MSO || || || || || |#### || |
- +------++------++------++------++------++------++------++------+~~
- 7654321076543210765432107654321076543210765432107654321076543210
-
- ~~+------++------++------++------++------++------++------++------+
- ##* 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 |
- ##* || || || || || || || LSO |
- ~~+------++------++------++------++------++------++------++------+
- 7654321076543210765432107654321076543210765432107654321076543210
-
- | | || || /|
- | | || || / |
- | | || || LSB |
- |<---->||<---->||<-------------------------------------------->|
- |clk_seq clk_seq node
- |_hi_res _low [48]
- |[5-6] [8]
- | |
- -->| |<--
- variant
- [2-3]
-
-An example of a UUID binary representation is the octet stream C<0xF8
-0x1D 0x4F 0xAE 0x7D 0xEC 0x11 0xD0 0xA7 0x65 0x00 0xA0 0xC9 0x1E 0x6B
-0xF6>. The binary representation format is exactly what the B<OSSP uuid>
-API functions B<uuid_import>() and B<uuid_export>() deal with under
-C<UUID_FMT_BIN>.
-
-=head2 UUID ASCII String Representation
-
-According to the DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122
-standards, a DCE 1.1 variant UUID is represented as an ASCII string
-consisting of 8 hexadecimal digits followed by a hyphen, then three
-groups of 4 hexadecimal digits each followed by a hyphen, then 12
-hexadecimal digits. Formally, the string representation is defined by
-the following grammar:
-
- uuid = <time_low> "-"
- <time_mid> "-"
- <time_high_and_version> "-"
- <clock_seq_high_and_reserved>
- <clock_seq_low> "-"
- <node>
- time_low = 4*<hex_octet>
- time_mid = 2*<hex_octet>
- time_high_and_version = 2*<hex_octet>
- clock_seq_high_and_reserved = <hex_octet>
- clock_seq_low = <hex_octet>
- node = 6*<hex_octet>
- hex_octet = <hex_digit> <hex_digit>
- hex_digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
- |"a"|"b"|"c"|"d"|"e"|"f"
- |"A"|"B"|"C"|"D"|"E"|"F"
-
-An example of a UUID string representation is the ASCII string
-"C<f81d4fae-7dec-11d0-a765-00a0c91e6bf6>". The string representation
-format is exactly what the B<OSSP uuid> API functions B<uuid_import>()
-and B<uuid_export>() deal with under C<UUID_FMT_STR>.
-
-Notice: a corresponding URL can be generated out of a ASCII string
-representation of an UUID by prefixing with "C<urn:uuid:>" as in
-"C<urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>".
-
-=head2 UUID Single Integer Value Representation
-
-According to the ISO/IEC 11578:1996 and ITU-T Rec. X.667 standards, a
-DCE 1.1 variant UUID can be also represented as a single integer value
-consisting of a decimal number with up to 39 digits.
-
-An example of a UUID single integer value representation is the decimal
-number "C<329800735698586629295641978511506172918>". The string
-representation format is exactly what the B<OSSP uuid> API functions
-B<uuid_import>() and B<uuid_export>() deal with under C<UUID_FMT_SIV>.
-
-Notice: a corresponding ISO OID can be generated under the
-"{joint-iso-itu-t(2) uuid(25)}" arc out of a single integer value
-representation of a UUID by prefixing with "C<2.25.>". An example OID
-is "C<2.25.329800735698586629295641978511506172918>". Additionally,
-an URL can be generated by further prefixing with "C<urn:oid:>" as in
-"C<urn:oid:2.25.329800735698586629295641978511506172918>".
-
-=head2 UUID Variants and Versions
-
-A UUID has a variant and version. The variant defines the layout of the
-UUID. The version defines the content of the UUID. The UUID variant
-supported in B<OSSP uuid> is the DCE 1.1 variant only. The DCE 1.1 UUID
-variant versions supported in B<OSSP uuid> are:
-
-=over 4
-
-=item B<Version 1> (time and node based)
-
-These are the classical UUIDs, created out of a 60-bit system time,
-a 14-bit local clock sequence and 48-bit system MAC address. The MAC
-address can be either the real one of a physical network interface card
-(NIC) or a random multi-cast MAC address. Version 1 UUIDs are usually
-used as one-time global unique identifiers.
-
-=item B<Version 3> (name based, MD5)
-
-These are UUIDs which are based on the 128-bit MD5 message digest of the
-concatenation of a 128-bit namespace UUID and a name string of arbitrary
-length. Version 3 UUIDs are usually used for non-unique but repeatable
-message digest identifiers.
-
-=item B<Version 4> (random data based)
-
-These are UUIDs which are based on just 128-bit of random data. Version
-4 UUIDs are usually used as one-time local unique identifiers.
-
-=item B<Version 5> (name based, SHA-1)
-
-These are UUIDs which are based on the 160-bit SHA-1 message digest of the
-concatenation of a 128-bit namespace UUID and a name string of arbitrary
-length. Version 5 UUIDs are usually used for non-unique but repeatable
-message digest identifiers.
-
-=back
-
-=head2 UUID Uniqueness
-
-Version 1 UUIDs are guaranteed to be unique through combinations of
-hardware addresses, time stamps and random seeds. There is a reference
-in the UUID to the hardware (MAC) address of the first network interface
-card (NIC) on the host which generated the UUID -- this reference
-is intended to ensure the UUID will be unique in space as the MAC
-address of every network card is assigned by a single global authority
-(IEEE) and is guaranteed to be unique. The next component in a UUID
-is a timestamp which, as clock always (should) move forward, will
-be unique in time. Just in case some part of the above goes wrong
-(the hardware address cannot be determined or the clock moved steps
-backward), there is a random clock sequence component placed into the
-UUID as a "catch-all" for uniqueness.
-
-Version 3 and version 5 UUIDs are guaranteed to be inherently globally
-unique if the combination of namespace and name used to generate them is
-unique.
-
-Version 4 UUIDs are not guaranteed to be globally unique, because they
-are generated out of locally gathered pseudo-random numbers only.
-Nevertheless there is still a high likelihood of uniqueness over space
-and time and that they are computationally difficult to guess.
-
-=head2 Nil UUID
-
-There is a special I<Nil> UUID consisting of all octets set to zero in
-the binary representation. It can be used as a special UUID value which does
-not conflict with real UUIDs.
-
-=head1 APPLICATION PROGRAMMING INTERFACE
-
-The ISO-C Application Programming Interface (API) of B<OSSP uuid>
-consists of the following components.
-
-=head2 CONSTANTS
-
-The following constants are provided:
-
-=over 4
-
-=item B<UUID_VERSION>
-
-The hexadecimal encoded B<OSSP uuid> version. This allows compile-time
-checking of the B<OSSP uuid> version. For run-time checking use
-B<uuid_version>() instead.
-
-The hexadecimal encoding for a version "$I<v>.$I<r>$I<t>$I<l>" is
-calculated with the B<GNU shtool> B<version> command and is (in
-Perl-style for concise description) "sprintf('0x%x%02x%d%02x', $I<v>,
-$I<r>, {qw(s 9 . 2 b 1 a 0)}->{$I<t>}, ($I<t> eq 's' ? 99 : $I<l>))",
-i.e., the version 0.9.6 is encoded as "0x009206".
-
-=item B<UUID_LEN_BIN>, B<UUID_LEN_STR>, B<UUID_LEN_SIV>
-
-The number of octets of the UUID binary and string representations.
-Notice that the lengths of the string representation (B<UUID_LEN_STR>)
-and the lengths of the single integer value representation
-(B<UUID_LEN_SIV>) does I<not> include the necessary C<NUL> termination
-character.
-
-=item B<UUID_MAKE_V1>, B<UUID_MAKE_V3>, B<UUID_MAKE_V4>, B<UUID_MAKE_V5>, B<UUID_MAKE_MC>
-
-The I<mode> bits for use with B<uuid_make>(). The B<UUID_MAKE_V>I<N>
-specify which UUID version to generate. The B<UUID_MAKE_MC> forces the
-use of a random multi-cast MAC address instead of the real physical MAC
-address in version 1 UUIDs.
-
-=item B<UUID_RC_OK>, B<UUID_RC_ARG>, B<UUID_RC_MEM>, B<UUID_RC_SYS>, B<UUID_RC_INT>, B<UUID_RC_IMP>
-
-The possible numerical return-codes of API functions.
-The C<UUID_RC_OK> indicates success, the others indicate errors.
-Use B<uuid_error>() to translate them into string versions.
-
-=item B<UUID_FMT_BIN>, B<UUID_FMT_STR>, B<UUID_FMT_SIV>, B<UUID_FMT_TXT>
-
-The I<fmt> formats for use with B<uuid_import>() and B<uuid_export>().
-The B<UUID_FMT_BIN> indicates the UUID binary representation (of
-length B<UUID_LEN_BIN>), the B<UUID_FMT_STR> indicates the UUID string
-representation (of length B<UUID_LEN_STR>), the B<UUID_FMT_SIV>
-indicates the UUID single integer value representation (of maximum
-length B<UUID_LEN_SIV>) and the B<UUID_FMT_TXT> indicates the textual
-description (of arbitrary length) of a UUID.
-
-=back
-
-=head2 FUNCTIONS
-
-The following functions are provided:
-
-=over 4
-
-=item uuid_rc_t B<uuid_create>(uuid_t **I<uuid>);
-
-Create a new UUID object and store a pointer to it in C<*>I<uuid>.
-A UUID object consists of an internal representation of a UUID, the
-internal PRNG and MD5 generator contexts, and cached MAC address and
-timestamp information. The initial UUID is the I<Nil> UUID.
-
-=item uuid_rc_t B<uuid_destroy>(uuid_t *I<uuid>);
-
-Destroy UUID object I<uuid>.
-
-=item uuid_rc_t B<uuid_clone>(const uuid_t *I<uuid>, uuid_t **I<uuid_clone>);
-
-Clone UUID object I<uuid> and store new UUID object in I<uuid_clone>.
-
-=item uuid_rc_t B<uuid_isnil>(const uuid_t *I<uuid>, int *I<result>);
-
-Checks whether the UUID in I<uuid> is the I<Nil> UUID.
-If this is the case, it returns I<true> in C<*>I<result>.
-Else it returns I<false> in C<*>I<result>.
-
-=item uuid_rc_t B<uuid_compare>(const uuid_t *I<uuid>, const uuid_t *I<uuid2>, int *I<result>);
-
-Compares the order of the two UUIDs in I<uuid1> and I<uuid2>
-and returns the result in C<*>I<result>: C<-1> if I<uuid1> is
-smaller than I<uuid2>, C<0> if I<uuid1> is equal to I<uuid2>
-and C<+1> if I<uuid1> is greater than I<uuid2>.
-
-=item uuid_rc_t B<uuid_import>(uuid_t *I<uuid>, uuid_fmt_t I<fmt>, const void *I<data_ptr>, size_t I<data_len>);
-
-Imports a UUID I<uuid> from an external representation of format I<fmt>.
-The data is read from the buffer at I<data_ptr> which contains at least
-I<data_len> bytes.
-
-The format of the external representation is specified by I<fmt> and the
-minimum expected length in I<data_len> depends on it. Valid values for
-I<fmt> are B<UUID_FMT_BIN>, B<UUID_FMT_STR> and B<UUID_FMT_SIV>.
-
-=item uuid_rc_t B<uuid_export>(const uuid_t *I<uuid>, uuid_fmt_t I<fmt>, void *I<data_ptr>, size_t *I<data_len>);
-
-Exports a UUID I<uuid> into an external representation of format
-I<fmt>. Valid values for I<fmt> are B<UUID_FMT_BIN>, B<UUID_FMT_STR>,
-B<UUID_FMT_SIV> and B<UUID_FMT_TXT>.
-
-The data is written to the buffer whose location is obtained
-by dereferencing I<data_ptr> after a "cast" to the appropriate
-pointer-to-pointer type. Hence the generic pointer argument I<data_ptr>
-is expected to be a pointer to a "pointer of a particular type", i.e.,
-it has to be of type "C<unsigned char **>" for B<UUID_FMT_BIN> and
-"C<char **>" for B<UUID_FMT_STR>, B<UUID_FMT_SIV> and B<UUID_FMT_TXT>.
-
-The buffer has to be room for at least C<*>I<data_len> bytes. If the
-value of the pointer after "casting" and dereferencing I<data_ptr>
-is C<NULL>, I<data_len> is ignored as input and a new buffer is
-allocated and returned in the pointer after "casting" and dereferencing
-I<data_ptr> (the caller has to free(3) it later on).
-
-If I<data_len> is not C<NULL>, the number of available bytes in the
-buffer has to be provided in C<*>I<data_len> and the number of actually
-written bytes are returned in C<*>I<data_len> again. The minimum
-required buffer length depends on the external representation as
-specified by I<fmt> and is at least B<UUID_LEN_BIN> for B<UUID_FMT_BIN>,
-B<UUID_LEN_STR> for B<UUID_FMT_STR> and B<UUID_LEN_SIV> for
-B<UUID_FMT_SIV>. For B<UUID_FMT_TXT> a buffer of unspecified length is
-required and hence it is recommended to allow B<OSSP uuid> to allocate
-the buffer as necessary.
-
-=item uuid_rc_t B<uuid_load>(uuid_t *I<uuid>, const char *I<name>);
-
-Loads a pre-defined UUID value into the UUID object I<uuid>. The
-following I<name> arguments are currently known:
-
-=over 4
-
-=item I<name> I<UUID>
-
-=item nil 00000000-0000-0000-0000-000000000000
-
-=item ns:DNS 6ba7b810-9dad-11d1-80b4-00c04fd430c8
-
-=item ns:URL 6ba7b811-9dad-11d1-80b4-00c04fd430c8
-
-=item ns:OID 6ba7b812-9dad-11d1-80b4-00c04fd430c8
-
-=item ns:X500 6ba7b814-9dad-11d1-80b4-00c04fd430c8
-
-=back
-
-The "C<ns:>I<XXX>" are names of pre-defined name-space UUIDs for use in
-the generation of DCE 1.1 version 3 and version 5 UUIDs.
-
-=item uuid_rc_t B<uuid_make>(uuid_t *I<uuid>, unsigned int I<mode>, ...);
-
-Generates a new UUID in I<uuid> according to I<mode> and optional
-arguments (dependent on I<mode>).
-
-If I<mode> contains the C<UUID_MAKE_V1> bit, a DCE 1.1 variant UUID of
-version 1 is generated. Then optionally the bit C<UUID_MAKE_MC> forces
-the use of random multi-cast MAC address instead of the real physical
-MAC address (the default). The UUID is generated out of the 60-bit current
-system time, a 12-bit clock sequence and the 48-bit MAC address.
-
-If I<mode> contains the C<UUID_MAKE_V3> or C<UUID_MAKE_V5> bit, a DCE
-1.1 variant UUID of version 3 or 5 is generated and two additional
-arguments are expected: first, a namespace UUID object (C<uuid_t *>).
-Second, a name string of arbitrary length (C<const char *>). The UUID is
-generated out of the 128-bit MD5 or 160-bit SHA-1 from the concatenated
-octet stream of namespace UUID and name string.
-
-If I<mode> contains the C<UUID_MAKE_V4> bit, a DCE 1.1 variant UUID
-of version 4 is generated. The UUID is generated out of 128-bit random
-data.
-
-=item char *B<uuid_error>(uuid_rc_t I<rc>);
-
-Returns a constant string representation corresponding to the
-return-code I<rc> for use in displaying B<OSSP uuid> errors.
-
-=item unsigned long B<uuid_version>(void);
-
-Returns the hexadecimal encoded B<OSSP uuid> version as compiled into
-the library object files. This allows run-time checking of the B<OSSP
-uuid> version. For compile-time checking use C<UUID_VERSION> instead.
-
-=back
-
-=head1 EXAMPLE
-
-The following shows an example usage of the API. Error handling is
-omitted for code simplification and has to be re-added for production
-code.
-
- /* generate a DCE 1.1 v1 UUID from system environment */
- char *uuid_v1(void)
- {
- uuid_t *uuid;
- char *str;
-
- uuid_create(&uuid);
- uuid_make(uuid, UUID_MAKE_V1);
- str = NULL;
- uuid_export(uuid, UUID_FMT_STR, &str, NULL);
- uuid_destroy(uuid);
- return str;
- }
-
- /* generate a DCE 1.1 v3 UUID from an URL */
- char *uuid_v3(const char *url)
- {
- uuid_t *uuid;
- uuid_t *uuid_ns;
- char *str;
-
- uuid_create(&uuid);
- uuid_create(&uuid_ns);
- uuid_load(uuid_ns, "ns:URL");
- uuid_make(uuid, UUID_MAKE_V3, uuid_ns, url);
- str = NULL;
- uuid_export(uuid, UUID_FMT_STR, &str, NULL);
- uuid_destroy(uuid_ns);
- uuid_destroy(uuid);
- return str;
- }
-
-=head1 SEE ALSO
-
-The following are references to B<UUID> documentation and specifications:
-
-=over 4
-
-=item
-
-B<A Universally Unique IDentifier (UUID) URN Namespace>,
-P. Leach, M. Mealling, R. Salz,
-IETF RFC-4122,
-July 2005, 32 pages,
-http://www.ietf.org/rfc/rfc4122.txt
-
-=item
-
-Information Technology -- Open Systems Interconnection (OSI),
-B<Procedures for the operation of OSI Registration Authorities:
-Generation and Registration of Universally Unique Identifiers (UUIDs)
-and their Use as ASN.1 Object Identifier Components>,
-ISO/IEC 9834-8:2004 / ITU-T Rec. X.667, 2004,
-December 2004, 25 pages,
-http://www.itu.int/ITU-T/studygroups/com17/oid/X.667-E.pdf
-
-=item
-
-B<DCE 1.1: Remote Procedure Call>,
-appendix B<Universally Unique Identifier>,
-Open Group Technical Standard
-Document Number C706, August 1997, 737 pages,
-(supersedes C309 DCE: Remote Procedure Call 8/1994,
-which was basis for ISO/IEC 11578:1996 specification),
-http://www.opengroup.org/publications/catalog/c706.htm
-
-=item
-
-Information technology -- Open Systems Interconnection (OSI),
-B<Remote Procedure Call (RPC)>,
-ISO/IEC 11578:1996,
-August 2001, 570 pages, (CHF 340,00),
-http://www.iso.ch/cate/d2229.html
-
-=item
-
-B<HTTP Extensions for Distributed Authoring (WebDAV)>,
-section B<6.4.1 Node Field Generation Without the IEEE 802 Address>,
-IETF RFC-2518,
-February 1999, 94 pages,
-http://www.ietf.org/rfc/rfc2518.txt
-
-=item
-
-B<DCE 1.1 compliant UUID functions>,
-FreeBSD manual pages uuid(3) and uuidgen(2),
-http://www.freebsd.org/cgi/man.cgi?query=uuid&manpath=FreeBSD+6.0-RELEASE
-
-=back
-
-=head1 HISTORY
-
-B<OSSP uuid> was implemented in January 2004 by Ralf S. Engelschall
-E<lt>rse@engelschall.comE<gt>. It was prompted by the use of UUIDs
-in the B<OSSP as> and B<OpenPKG> projects. It is a clean room
-implementation intended to be strictly standards compliant and maximum
-portable.
-
-=head1 SEE ALSO
-
-uuid(1), uuid-config(1), OSSP::uuid(3).
-
-=cut
-
bgstack15