voms_apic.h(3)
π¦ voms_apic.h β the Library Functions Manual, section 3 (3) π
okay bestie, sit down, hydrate, because this is the header. voms_apic.h is a C header, it lives in the Library Functions Manual, and it is genuinely a whole vibe. We're doing this in three parts and this is part one, so no, I'm not leaving, and neither are you. πΈ
β¨ NAME β¨
voms_apic.h β no cap, that's the whole name, she's iconic and she knows it. π
π SYNOPSIS π
First, the includes, because we're cultured:
#include <openssl/x509.h>
#include <time.h>
#include 'newformat.h'
(and yes, that third one has single quotes in the original β I don't make the rules, I just report them faithfully, fr fr π«Ά)
π Data Structures
struct dataβ User's characteristics: can be repeated. (yes bestie, repeated, she's flexible β¨)struct attributeβ just vibing here, no description given, mysterious main character energy πstruct contactdataβ The type of data returned.struct vomsstruct vomsdata
π Macros
#define TYPE_NODATA 0#define TYPE_STD 1#define TYPE_CUSTOM 2#define RECURSE_CHAIN 0#define RECURSE_NONE 1#define VERIFY_FULL 0xffffffff#define VERIFY_NONE 0x00000000#define VERIFY_DATE 0x00000001#define VERIFY_NOTARGET 0x00000002#define VERIFY_KEY 0x00000004#define VERIFY_SIGN 0x00000008#define VERIFY_ORDER 0x00000010#define VERIFY_ID 0x00000020#define VERIFY_CERTLIST 0x00000040#define VERR_NONE 0β Error codes. (she's the opening act of the error-code saga β¨)#define VERR_NOSOCKET 1#define VERR_NOIDENT 2#define VERR_COMM 3#define VERR_PARAM 4#define VERR_NOEXT 5#define VERR_NOINIT 6#define VERR_TIME 7#define VERR_IDCHECK 8#define VERR_EXTRAINFO 9#define VERR_FORMAT 10#define VERR_NODATA 11#define VERR_PARSE 12#define VERR_DIR 13#define VERR_SIGN 14#define VERR_SERVER 15#define VERR_MEM 16#define VERR_VERIFY 17#define VERR_TYPE 18#define VERR_ORDER 19#define VERR_SERVERCODE 20#define VERR_NOTAVAIL 21
π§ Typedefs
typedef void * gss_cred_id_ttypedef void * gss_ctx_id_t
π Functions
the whole roster, in the exact order the header gives them, no skipping, no cutting corners:
struct contactdata ** VOMS_FindByAlias (struct vomsdata *vd, char *alias, char *system, char *user, int *error)struct contactdata ** VOMS_FindByVO (struct vomsdata *vd, char *vo, char *system, char *user, int *error)void VOMS_DeleteContacts (struct contactdata **list)struct vomsdata * VOMS_Init (char *voms, char *cert)struct voms * VOMS_Copy (struct voms *v, int *error)struct vomsdata * VOMS_CopyAll (struct vomsdata *vd, int *error)void VOMS_Delete (struct voms *v)int VOMS_AddTarget (struct vomsdata *vd, char *target, int *error)void VOMS_FreeTargets (struct vomsdata *vd, int *error)char * VOMS_ListTargets (struct vomsdata *vd, int *error)int VOMS_SetVerificationType (int type, struct vomsdata *vd, int *error)int VOMS_SetLifetime (int length, struct vomsdata *vd, int *error)void VOMS_Destroy (struct vomsdata *vd)int VOMS_ResetOrder (struct vomsdata *vd, int *error)int VOMS_Ordering (char *order, struct vomsdata *vd, int *error)int VOMS_Contact (char *hostname, int port, char *servsubject, char *command, struct vomsdata *vd, int *error)int VOMS_ContactRaw (char *hostname, int port, char *servsubject, char *command, void **data, int *datalen, int *version, struct vomsdata *vd, int *error)int VOMS_Retrieve (X509 *cert, STACK_OF(X509) *chain, int how, struct vomsdata *vd, int *error)int VOMS_Import (char *buffer, int buflen, struct vomsdata *vd, int *error)int VOMS_Export (char **buffer, int *buflen, struct vomsdata *vd, int *error)struct voms * VOMS_DefaultData (struct vomsdata *vd, int *error)char * VOMS_ErrorMessage (struct vomsdata *vd, int error, char *buffer, int len)int VOMS_RetrieveEXT (X509_EXTENSION *ext, struct vomsdata *vd, int *error)int VOMS_RetrieveFromCred (gss_cred_id_t cred, int how, struct vomsdata *vd, int *error)int VOMS_RetrieveFromFile (FILE *file, int how, struct vomsdata *vd, int *error)int VOMS_RetrieveFromCtx (gss_ctx_id_t ctx, int how, struct vomsdata *vd, int *error)int VOMS_RetrieveFromProxy (int how, struct vomsdata *vd, int *error)int VOMS_RetrieveFromAC (AC *ac, struct vomsdata *vd, int *error)int VOMS_GetAttributeSourcesNumber (struct voms *v, struct vomsdata *vd, int *error)int VOMS_GetAttributeSourceHandle (struct voms *v, int num, struct vomsdata *vd, int *error)const char * VOMS_GetAttributeGrantor (struct voms *v, int handle, struct vomsdata *vd, int *error)int VOMS_GetAttributesNumber (struct voms *v, int handle, struct vomsdata *vd, int *error)int VOMS_GetAttribute (struct voms *v, int handle, int num, struct attribute *at, struct vomsdata *vd, int *error)struct vomsdata * VOMS_Duplicate (struct vomsdata *vd)AC * VOMS_GetAC (struct voms *v)int getMajorVersionNumber (void)int getMinorVersionNumber (void)int getPatchVersionNumber (void)int VOMS_SetVerificationTime (time_t verificationtime, struct vomsdata *vd, int *error)char ** VOMS_GetTargetsList (struct voms *v, struct vomsdata *vd, int *error)void VOMS_FreeTargetsList (char **)int VOMS_SetTimeout (int t, struct vomsdata *vd, int *error)int VOMS_LoadCredentials (X509 *cert, EVP_PKEY *pkey, STACK_OF(X509) *chain, struct vomsdata *vd, int *error)
π Macro Definition Documentation π
grab a snack, we're going macro by macro, and every single "Definition at line N of file voms_apic.h." is staying because I respect the lore π
#define RECURSE_CHAIN 0
Definition at line 104 of file voms_apic.h.
#define RECURSE_NONE 1
Definition at line 105 of file voms_apic.h.
#define TYPE_CUSTOM 2
result of an S command
Definition at line 76 of file voms_apic.h.
#define TYPE_NODATA 0
no data
Definition at line 74 of file voms_apic.h.
#define TYPE_STD 1
group, role, capability triplet
Definition at line 75 of file voms_apic.h.
#define VERIFY_CERTLIST 0x00000040
Definition at line 115 of file voms_apic.h.
#define VERIFY_DATE 0x00000001
Definition at line 109 of file voms_apic.h.
#define VERIFY_FULL 0xffffffff
Definition at line 107 of file voms_apic.h.
#define VERIFY_ID 0x00000020
Definition at line 114 of file voms_apic.h.
#define VERIFY_KEY 0x00000004
Definition at line 111 of file voms_apic.h.
#define VERIFY_NONE 0x00000000
Definition at line 108 of file voms_apic.h.
#define VERIFY_NOTARGET 0x00000002
Definition at line 110 of file voms_apic.h.
#define VERIFY_ORDER 0x00000010
Definition at line 113 of file voms_apic.h.
#define VERIFY_SIGN 0x00000008
Definition at line 112 of file voms_apic.h.
#define VERR_COMM 3
Server problem
Definition at line 122 of file voms_apic.h.
#define VERR_DIR 13
Directory error
Definition at line 133 of file voms_apic.h.
#define VERR_EXTRAINFO 9
VO name and URI missing
Definition at line 129 of file voms_apic.h.
#define VERR_FORMAT 10
Wrong data format
Definition at line 130 of file voms_apic.h.
#define VERR_IDCHECK 8
User data in extension different from the real ones
Definition at line 127 of file voms_apic.h.
#define VERR_MEM 16
Memory problems
Definition at line 136 of file voms_apic.h.
#define VERR_NODATA 11
Empty extension
Definition at line 131 of file voms_apic.h.
#define VERR_NOEXT 5
VOMS extension missing
Definition at line 124 of file voms_apic.h.
#define VERR_NOIDENT 2
Cannot identify itself (certificate problem)
Definition at line 121 of file voms_apic.h.
#define VERR_NOINIT 6
Initialization error
Definition at line 125 of file voms_apic.h.
#define VERR_NONE 0
Error codes.
Definition at line 119 of file voms_apic.h.
#define VERR_NOSOCKET 1
Socket problem
Definition at line 120 of file voms_apic.h.
#define VERR_NOTAVAIL 21
Method not available
Definition at line 141 of file voms_apic.h.
#define VERR_ORDER 19
Ordering different than required
Definition at line 139 of file voms_apic.h.
#define VERR_PARAM 4
Wrong parameters
Definition at line 123 of file voms_apic.h.
#define VERR_PARSE 12
Parse error
Definition at line 132 of file voms_apic.h.
#define VERR_SERVER 15
Unidentifiable VOMS server
Definition at line 135 of file voms_apic.h.
#define VERR_SERVERCODE 20
Error from the server
Definition at line 140 of file voms_apic.h.
#define VERR_SIGN 14
Signature error
Definition at line 134 of file voms_apic.h.
#define VERR_TIME 7
Error in time checking
Definition at line 126 of file voms_apic.h.
#define VERR_TYPE 18
Returned data of unknown type
Definition at line 138 of file voms_apic.h.
#define VERR_VERIFY 17
Generic verification error
Definition at line 137 of file voms_apic.h.
π§΅ Typedef Documentation π§΅
typedef void* gss_cred_id_t
Definition at line 34 of file voms_apic.h.
typedef void* gss_ctx_id_t
Definition at line 35 of file voms_apic.h.
π οΈ Function Documentation π οΈ
int getMajorVersionNumber (void ) [extern]
no extra notes, she just exists β¨
int getMinorVersionNumber (void ) [extern]
same energy π«Ά
int getPatchVersionNumber (void ) [extern]
that's the trio, periodt π
int VOMS_AddTarget (struct vomsdata * vd, char * target, int * error) [extern]
Adds a target to the AC. (yes, adding targets, very main character of her π―)
Parameters
- vd β The vomsdata structure.
- target β The target to add. It should be a FQDN.
- error β RETURN PARAMETER: qualifies the error message.
Returns
failure (0) or success (<>0)
int VOMS_Contact (char * hostname, int port, char * servsubject, char * command, struct vomsdata * vd, int * error) [extern]
Contacts a VOMS server to get a certificate π
It is the equivalent of the voms_proxy_init command, but without the --include functionality.
Parameters
- hostname β FQDN of the VOMS server
- port β the port on which the VOMS server is listening
- servsubject β the subject of the server's certificate
- command β Command
- vd β RETURN PARAMETER: contains the data returned by the connection
- error β RETURN PARAMETER: Qualifies the error message
Returns
failure (0) or success (<>0)
int VOMS_ContactRaw (char * hostname, int port, char * servsubject, char * command, void ** data, int * datalen, int * version, struct vomsdata * vd, int * error) [extern]
The same as VOMS_Contact, except that instead of starting the verification process, the data is returned as is in the data and datalen fields. π
Parameters
- hostname β FQDN of the VOMS server
- port β the port on which the VOMS server is listening
- servsubject β the subject of the server's certificate
- command β the command sent to the server
- version β is the version number of the data.
- vd β RETURN PARAMETER: contains the data returned by the connection
- error β RETURN PARAMETER: Qualifies the error message
Returns
failure (0) or success (<>0)
struct voms * VOMS_Copy (struct voms * v, int * error) [extern]
Copies a voms structure.
N.B: This is the ONLY way to correctly initialize a voms structure as a copy of another voms structure. read that again bestie, the ONLY way, no shortcuts, no DIY π
Parameters
- v β The structure to copy.
- error β RETURN PARAMETER: qualifies the error message.
Returns
NULL (error) or the new voms structure.
π struct vomsdata * VOMS_CopyAll (struct vomsdata * vd, int * error) [extern]
okay so this one copies a vomsdata structure. and bestie, listen: N.B: this is the ONLY way to correctly initialize a vomsdata structure as a copy of another vomsdata structure. there is no plan B, no "i'll just wing it", no cap. π«Ά
- vd β the structure to copy.
- error β RETURN PARAMETER: qualifies the error message.
Returns: NULL (aka it went wrong π) or the new vomsdata structure. β¨
πΈ struct voms * VOMS_DefaultData (struct vomsdata * vd, int * error) [extern]
grabs the default attributes out of a vomsdata structure. the defaults, the moment, the main character energy. π
- vd β the
vomsdatastructure to analyze. - error β RETURN PARAMETER: qualifies the error message.
Returns: a pointer to the relevant voms structure. DO NOT modify the fields. like literally do not touch them, that's not your field to touch, that's giving chaos. π
π void VOMS_Delete (struct voms * v) [extern]
deletes a voms structure. bye bye, slay, rest well. π
- v β pointer to the structure to delete.
π§ void VOMS_DeleteContacts (struct contactdata ** list) [extern]
frees a contactdata vector. that's it, that's the whole function, and honestly? iconic for being so unbothered. β¨
- list β the vector to free.
π void VOMS_Destroy (struct vomsdata * vd) [extern]
destroys a proper vomsdata structure /param vd the structure to deallocate.
yes bestie, the "/param" is right there in the source, we keep the source's lore intact. the vd here is the structure you're deallocating. π₯
π struct vomsdata * VOMS_Duplicate (struct vomsdata * vd) [extern]
the docs give us literally nothing else here β just the signature. no description, no parameters list, no returns. it's giving mystery, it's giving "figure it out", and we respect it. π«Ά
π char * VOMS_ErrorMessage (struct vomsdata * vd, int error, char * buffer, int len) [extern]
gets a textual description of the error. so when everything's on fire, this is the function that tells you why it's on fire. π₯
- vd β the
vomsdatastructure to analyze. - error β the error returned by the last function.
- buffer β a pointer to a buffer where the error message will be written. If
NULL, then memory is allocated by the function, and will have to befree()ed by the caller. yes, by YOU. don't forget. π - len β the length of the memory pointed to by the buffer parameter.
Returns: a pointer to the error message. π
β int VOMS_Export (char ** buffer, int * buflen, struct vomsdata * vd, int * error) [extern]
converts data into a test format. (yes, "test format" β that's what it says, we don't editorialize.)
- buffer β OUTPUT PARAMETER, contains the converted data.
- buflen β OUTPUT PARAMETER, contains the length of
buffer. - vd β contains the data to convert.
- error β RETURN PARAMETER, qualifies the error message.
Returns: failure (0) or success (<>0).
π¦ struct contactdata ** VOMS_FindByAlias (struct vomsdata * vd, char * alias, char * system, char * user, int * error) [extern]
gets a list of VOMS servers which share an alias. it's a little friend group search. π«Ά
- vd β the correctly initialized
vomsdatastructure. - alias β the alias to look for.
- system β the directory in which to look for the system configuration files. If
NULL, defaults to/opt/edc/etc/vomses - user β the directory in which to look for the user configuration files. Defaults to
$VOMS_USERCONFifNULL. Again defaults to$HOME/.edg/vomsesif the latter isNULL, or to~/.edg/vomsesas a last resort. (the fallback chain ate, honestly π) - error β RETURN PARAMETER: qualifies the error message.
Returns: NULL, or a NULL-terminated vector of contactdata structures. the only supported way to free this array is via the VOMS_DeleteContacts function. note also that the order in which the servers are returned is unspecified β so don't build your whole personality around the ordering, bestie. π
πΈ struct contactdata ** VOMS_FindByVO (struct vomsdata * vd, char * vo, char * system, char * user, int * error) [extern]
gets a list of VOMS servers which serve the same VO. same energy as the alias one, different search key. β¨
- vd β the correctly initialized
vomsdatastructure. - vo β the VO to look for.
- system β the directory in which to look for the system configuration files. If
NULL, defaults to/opt/edc/etc/vomses - user β the directory in which to look for the user configuration files. Defaults to
$VOMS_USERCONFifNULL. Again defaults to$HOME/.edg/vomsesif the latter isNULL, or to~/.edg/vomsesas a last resort. - error β RETURN PARAMETER: qualifies the error message.
Returns: NULL, or a NULL-terminated vector of contactdata structures. the only supported way to free this array is via the VOMS_DeleteContacts function. and again, the order in which the servers are returned is unspecified. lowkey just accept it. π
π void VOMS_FreeTargets (struct vomsdata * vd, int * error) [extern]
delete the targets from the AC. clean slate, clear skin, fresh start. β¨
- vd β the
vomsdatastructure. - error β RETURN PARAMETER: qualifies the error message.
π the next few are mystery boxes π
these ones ship with a signature and absolutely zero explanation in the source, so here they are, exactly as documented, in order, no invented lore:
void VOMS_FreeTargetsList (char ** ) [extern]AC * VOMS_GetAC (struct voms * v) [extern]int VOMS_GetAttribute (struct voms * v, int handle, int num, struct attribute * at, struct vomsdata * vd, int * error) [extern]const char * VOMS_GetAttributeGrantor (struct voms * v, int handle, struct vomsdata * vd, int * error) [extern]int VOMS_GetAttributesNumber (struct voms * v, int handle, struct vomsdata * vd, int * error) [extern]int VOMS_GetAttributeSourceHandle (struct voms * v, int num, struct vomsdata * vd, int * error) [extern]int VOMS_GetAttributeSourcesNumber (struct voms * v, struct vomsdata * vd, int * error) [extern]char ** VOMS_GetTargetsList (struct voms * v, struct vomsdata * vd, int * error) [extern]
periodt. that's all the docs gave us. π«Ά
π₯ int VOMS_Import (char * buffer, int buflen, struct vomsdata * vd, int * error) [extern]
converts data from the format used for inclusion into a certificate to the internal format.
the function does verify the data. okayyyy validation, we love to see it. π
- buffer β contains the data to be converted.
- buflen β contains the length of
buffer. - vd β RETURN PARAMETER: contains the data returned by the connection.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π struct vomsdata * VOMS_Init (char * voms, char * cert) [extern]
initializes a vomsdata structure for use by the other functions.
N.B: this is the ONLY way to correctly initialize avomsdatastructure. it is also forbidden to directly take thesizeof()of this structure. forbidden!! do not. π
- voms β the directory which contains the certificates of the VOMS servers.
- cert β the directory which contains the CA certificates.
if voms_dir is empty, the value of the environment variable X509_VOMS_DIR is taken.
if cert_dir is empty, the value of the environment variable X509_CERT_DIR is taken.
Returns: NULL for failure, or a pointer to a properly initialized structure. π
π
char * VOMS_ListTargets (struct vomsdata * vd, int * error) [extern]
no description in the source, bestie β just the signature, doing its little silent thing. π
π int VOMS_LoadCredentials (X509 * cert, EVP_PKEY * pkey, STACK_OF(X509) * chain, struct vomsdata * vd, int * error) [extern]
also undocumented beyond the signature. we simply respect the mystery. β¨
β int VOMS_Ordering (char * order, struct vomsdata * vd, int * error) [extern]
further specified the order of the returned attributes. please do note that calls are cumulative unless VOMS_ResetOrder() is called. so it stacks, bestie β keep calling it and the order keeps growing, until you reset. no cap. π«Ά
- order β the
group:roleattribute. - vd β RETURN PARAMETER: contains the modified data.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π§ int VOMS_ResetOrder (struct vomsdata * vd, int * error) [extern]
unsets the return order of the attributes. the undo button, the palette cleanser, the "we don't talk about that anymore". π
- vd β RETURN PARAMETER: contains the modified data.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
πΈ int VOMS_Retrieve (X509 * cert, STACK_OF(X509) * chain, int how, struct vomsdata * vd, int * error) [extern]
extracts the VOMS extension from an X.509 certificate.
the function doesn't check the validity of the certificates, but it does check the content of the user data. so like, it's not doing a full vibe check on the certs, but it IS reading the user data carefully. π
\param certβ the certificate with the VOMS extensions\param chainβ the chain of the validation certificates (only the intermediate ones)\param howβ recursion type\param vdβ RETURN PARAMETER: contains the data returned by the connection\param errorβ RETURN PARAMETER: qualifies the error message\returnβ failure (0) or success (<>0)
π int VOMS_RetrieveEXT (X509_EXTENSION * ext, struct vomsdata * vd, int * error) [extern]
gets VOMS information from the given extension.
- ext β the extension to parse.
- vd β RETURN PARAMETER: contains the data returned by the connection.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π int VOMS_RetrieveFromAC (AC * ac, struct vomsdata * vd, int * error) [extern]
gets VOMS information from an existing globus proxy.
- ac β AC from which to get the credentials.
- vd β RETURN PARAMETER: contains the data returned by the connection.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π₯ int VOMS_RetrieveFromCred (gss_cred_id_t cred, int how, struct vomsdata * vd, int * error) [extern]
gets VOMS information from the given globus credential.
- cred β the credential from which to retrieve the certificate.
- how β recursion type.
- vd β RETURN PARAMETER: contains the data returned by the connection.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π¦ int VOMS_RetrieveFromCtx (gss_ctx_id_t ctx, int how, struct vomsdata * vd, int * error) [extern]
gets VOMS information from the given globus context.
- ctx β the context from which to retrieve the certificate.
- how β recursion type.
- vd β RETURN PARAMETER: contains the data returned by the connection.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
β int VOMS_RetrieveFromFile (FILE * file, int how, struct vomsdata * vd, int * error) [extern]
gets VOMS information from the given globus credential. (yes, the source says "globus credential" here too, even though there's a FILE * β we're keeping the original's exact words, no editing the lore. π
)
- file β the file from which to retrieve the certificate.
- how β recursion type.
- vd β RETURN PARAMETER: contains the data returned by the connection.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π int VOMS_RetrieveFromProxy (int how, struct vomsdata * vd, int * error) [extern]
gets VOMS information from an existing globus proxy.
- how β recursion type.
- vd β RETURN PARAMETER: contains the data returned by the connection.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π int VOMS_SetLifetime (int length, struct vomsdata * vd, int * error) [extern]
set requested lifetime for VOMS_Contact() calls. how long do you want this to live? manifest it. β¨
- length β lifetime requested.
- vd β RETURN PARAMETER: contains the modified data.
- error β RETURN PARAMETER: qualifies the error message.
Returns: failure (0) or success (<>0).
π the last three, signature-only squad π«Ά
these close out this chunk of the page, and the source gives us nothing but the signatures β so here they are, exactly:
int VOMS_SetTimeout (int t, struct vomsdata * vd, int * error) [extern]int VOMS_SetVerificationTime (time_t verificationtime, struct vomsdata * vd, int * error) [extern]int VOMS_SetVerificationType (int type, struct vomsdata * vd, int * error) [extern]
and that's the end of this part β hold on bestie, there's more coming, don't go anywhere. π
β¨ AUTHOR β¨
So bestie, nobody hand-wrote this one, okay? π This whole page was generated automatically by Doxygen for VOMS C API from the source code. Like, the docs literally wrote themselves straight out of the code β no human author to credit, just the tool doing its thing. π€β¨ Which honestly? Iconic behavior. It means if the source changes, the docs follow, no cap.
fr fr, don't go looking for a person to @ about typos β Doxygen said what it said, and it said it automatically. π«Ά
And that's the whole page, babe!! You made it to the very end, main character energy fr. π
This lil' manual drop is brought to you by VOMS C API, rockin' Version 1.5.0, and it lives under the name voms_apic.h(3) β that's the header page, section 3, iykyk. π
go forth and call those functions, bestie β you're literally so good at this ππ«
π¦ where this page comes from
- epel 10: voms-devel 2.1.4-1.el10_3 Β· Apache-2.0
- fedora 43: voms-devel 2.1.4-1.fc43 Β· Apache-2.0
- fedora 43: voms-devel 2.1.4-1.fc43 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms