Implementation notes: amd64, cezanne, crypto_sign/edons128k08n72nu8l4mu3

Computer: cezanne
Microarchitecture: amd64; Zen 3 (a50f00)
Architecture: amd64
CPU ID: AuthenticAMD-00a50f00-178bfbff
SUPERCOP version: 20240716
Operation: crypto_sign
Primitive: edons128k08n72nu8l4mu3
TimeObject sizeTest sizeImplementationCompilerBenchmark dateSUPERCOP version
125780346939 0 89684819 1012 2648T:refclang_-march=native_-O3_-fwrapv_-Qunused-arguments_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
129019927575 0 89665347 1012 2648T:refclang_-march=native_-O2_-fwrapv_-Qunused-arguments_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
132789930738 0 89667577 988 2680T:refgcc_-march=native_-mtune=native_-O3_-fwrapv_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
134961847446 0 89684947 1012 2648T:refclang_-mcpu=native_-O3_-fwrapv_-Qunused-arguments_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
156543016824 0 89652033 1004 2648T:refclang_-march=native_-Os_-fwrapv_-Qunused-arguments_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
158773122155 0 89658416 996 2680T:refgcc_-march=native_-mtune=native_-O2_-fwrapv_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
162402321846 0 89657760 996 2680T:refgcc_-march=native_-mtune=native_-O_-fwrapv_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
249541716294 0 89651336 988 2680T:refgcc_-march=native_-mtune=native_-Os_-fwrapv_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716
296594617854 0 89653657 1004 2648T:refclang_-march=native_-O_-fwrapv_-Qunused-arguments_-fPIC_-fPIE_-gdwarf-4_-Wall2024071720240716

Compiler output


mpfq_2_128.c: mpfq_2_128.c:154:35: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
mpfq_2_128.c:         int ret = mpn_set_str(zz, tmp, len, k->io_type);
mpfq_2_128.c:                                   ^~~
mpfq_2_128.c: .../supercop-data/cezanne/amd64/include/gmp.h:1595:68: note: passing argument to parameter here
mpfq_2_128.c: __GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
mpfq_2_128.c:                                                                    ^
mpfq_2_128.c: 1 warning generated.
sign.c: sign.c:815:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:566:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:566:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:880:84: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kclear(allcandidates[i]);
sign.c:                                                                                    ^
sign.c: sign.c:880:84: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:975:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:934:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:934:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:913:51: warning: unused variable 'temphash' [-Wunused-variable]
sign.c: ...

Number of similar (implementation,compiler) pairs: 1, namely:
ImplementationCompiler
T:refclang -march=native -O2 -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)

Compiler output


mpfq_2_128.c: mpfq_2_128.c:154:35: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
mpfq_2_128.c:         int ret = mpn_set_str(zz, tmp, len, k->io_type);
mpfq_2_128.c:                                   ^~~
mpfq_2_128.c: .../supercop-data/cezanne/amd64/include/gmp.h:1595:68: note: passing argument to parameter here
mpfq_2_128.c: __GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
mpfq_2_128.c:                                                                    ^
mpfq_2_128.c: 1 warning generated.
sign.c: sign.c:815:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:566:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:566:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:880:84: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kclear(allcandidates[i]);
sign.c:                                                                                    ^
sign.c: sign.c:880:84: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:975:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:934:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:934:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:916:19: warning: unused variable 'allrandombytes' [-Wunused-variable]
sign.c: ...

Number of similar (implementation,compiler) pairs: 1, namely:
ImplementationCompiler
T:refclang -march=native -O3 -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)

Compiler output


mpfq_2_128.c: mpfq_2_128.c:154:35: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
mpfq_2_128.c:         int ret = mpn_set_str(zz, tmp, len, k->io_type);
mpfq_2_128.c:                                   ^~~
mpfq_2_128.c: .../supercop-data/cezanne/amd64/include/gmp.h:1595:68: note: passing argument to parameter here
mpfq_2_128.c: __GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
mpfq_2_128.c:                                                                    ^
mpfq_2_128.c: 1 warning generated.
sign.c: sign.c:815:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:566:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:566:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:880:84: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kclear(allcandidates[i]);
sign.c:                                                                                    ^
sign.c: sign.c:880:84: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:975:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:934:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:934:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:925:10: warning: unused variable 'M' [-Wunused-variable]
sign.c: ...

Number of similar (implementation,compiler) pairs: 1, namely:
ImplementationCompiler
T:refclang -march=native -O -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)

Compiler output


mpfq_2_128.c: mpfq_2_128.c:154:35: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
mpfq_2_128.c:         int ret = mpn_set_str(zz, tmp, len, k->io_type);
mpfq_2_128.c:                                   ^~~
mpfq_2_128.c: .../supercop-data/cezanne/amd64/include/gmp.h:1595:68: note: passing argument to parameter here
mpfq_2_128.c: __GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
mpfq_2_128.c:                                                                    ^
mpfq_2_128.c: 1 warning generated.
sign.c: sign.c:815:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:566:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:566:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:880:84: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kclear(allcandidates[i]);
sign.c:                                                                                    ^
sign.c: sign.c:880:84: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:975:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:934:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:934:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:926:10: warning: unused variable 'mm' [-Wunused-variable]
sign.c: ...

Number of similar (implementation,compiler) pairs: 1, namely:
ImplementationCompiler
T:refclang -march=native -Os -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)

Compiler output


mpfq_2_128.c: mpfq_2_128.c:154:35: warning: passing 'char *' to parameter of type 'const unsigned char *' converts between pointers to integer types with different sign [-Wpointer-sign]
mpfq_2_128.c:         int ret = mpn_set_str(zz, tmp, len, k->io_type);
mpfq_2_128.c:                                   ^~~
mpfq_2_128.c: .../supercop-data/cezanne/amd64/include/gmp.h:1595:68: note: passing argument to parameter here
mpfq_2_128.c: __GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
mpfq_2_128.c:                                                                    ^
mpfq_2_128.c: 1 warning generated.
sign.c: sign.c:815:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:566:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:566:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:880:84: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kclear(allcandidates[i]);
sign.c:                                                                                    ^
sign.c: sign.c:880:84: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:975:63: warning: incompatible function pointer types passing 'int (const unsigned long *, const unsigned long *)' to parameter of type '__compar_fn_t' (aka 'int (*)(const void *, const void *)') [-Wincompatible-function-pointer-types]
sign.c:     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:                                                               ^~~~~~~
sign.c: /usr/include/stdlib.h:831:20: note: passing argument to parameter '__compar' here
sign.c:                    __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:                                  ^
sign.c: sign.c:934:83: warning: for loop has empty body [-Wempty-body]
sign.c:     for(i=0; i<(1<<(mu + 1 + ErrorBasisDimension))+2; i++) Kinit(allcandidates[i]);
sign.c:                                                                                   ^
sign.c: sign.c:934:83: note: put the semicolon on a separate line to silence this warning
sign.c: sign.c:915:19: warning: unused variable 's0s1' [-Wunused-variable]
sign.c: ...

Number of similar (implementation,compiler) pairs: 1, namely:
ImplementationCompiler
T:refclang -mcpu=native -O3 -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)

Compiler output


mpfq_2_128.c: mpfq_2_128.c: In function 'mpfq_2_128_sscan':
mpfq_2_128.c: mpfq_2_128.c:154:35: warning: pointer targets in passing argument 2 of '__gmpn_set_str' differ in signedness [-Wpointer-sign]
mpfq_2_128.c:   154 |         int ret = mpn_set_str(zz, tmp, len, k->io_type);
mpfq_2_128.c:       |                                   ^~~
mpfq_2_128.c:       |                                   |
mpfq_2_128.c:       |                                   char *
mpfq_2_128.c: In file included from mpfq.h:6,
mpfq_2_128.c:                  from mpfq_2_128.h:6,
mpfq_2_128.c:                  from mpfq_2_128.c:3:
mpfq_2_128.c: .../supercop-data/cezanne/amd64/include/gmp.h:1595:47: note: expected 'const unsigned char *' but argument is of type 'char *'
mpfq_2_128.c:  1595 | __GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
mpfq_2_128.c:       |                                               ^~~~~~~~~~~~~~~~~~~~~
sign.c: sign.c: In function 'crypto_sign_edons128k08n72nu8l4mu3_ref_timingleaks':
sign.c: sign.c:815:63: warning: passing argument 4 of 'qsort' from incompatible pointer type [-Wincompatible-pointer-types]
sign.c:   815 |     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:       |                                                               ^~~~~~~
sign.c:       |                                                               |
sign.c:       |                                                               int (*)(const long unsigned int *, const long unsigned int *)
sign.c: In file included from sign.c:2:
sign.c: /usr/include/stdlib.h:831:20: note: expected '__compar_fn_t' {aka 'int (*)(const void *, const void *)'} but argument is of type 'int (*)(const long unsigned int *, const long unsigned int *)'
sign.c:   831 |      __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:       |      ~~~~~~~~~~~~~~^~~~~~~~
sign.c: sign.c: In function 'crypto_sign_edons128k08n72nu8l4mu3_ref_timingleaks_open':
sign.c: sign.c:975:63: warning: passing argument 4 of 'qsort' from incompatible pointer type [-Wincompatible-pointer-types]
sign.c:   975 |     qsort(allcandidates, NumberOfAllCandidates, sizeof(Kelt), compare);
sign.c:       |                                                               ^~~~~~~
sign.c:       |                                                               |
sign.c:       |                                                               int (*)(const long unsigned int *, const long unsigned int *)
sign.c: In file included from sign.c:2:
sign.c: /usr/include/stdlib.h:831:20: note: expected '__compar_fn_t' {aka 'int (*)(const void *, const void *)'} but argument is of type 'int (*)(const long unsigned int *, const long unsigned int *)'
sign.c:   831 |      __compar_fn_t __compar) __nonnull ((1, 4));
sign.c:       |      ~~~~~~~~~~~~~~^~~~~~~~
sign.c: sign.c:926:10: warning: unused variable 'mm' [-Wunused-variable]
sign.c:   926 |     Kelt mm[mu], Cbase[NrColumns];
sign.c:       |          ^~
sign.c: sign.c:925:10: warning: unused variable 'M' [-Wunused-variable]
sign.c:   925 |     Kelt M[ProjectionDim], y[NrRows], C[NrColumns], allcandidates[(1<<(mu + 1 + ErrorBasisDimension))+2];
sign.c: ...

Number of similar (implementation,compiler) pairs: 4, namely:
ImplementationCompiler
T:refgcc -march=native -mtune=native -O2 -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)
T:refgcc -march=native -mtune=native -O3 -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)
T:refgcc -march=native -mtune=native -O -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)
T:refgcc -march=native -mtune=native -Os -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)

Namespace violations


gmp_export.o gmp_export T
gmp_import.o gmp_import T
mpfq_2_128.o mpfq_2_128_asprint T
mpfq_2_128.o mpfq_2_128_fprint T
mpfq_2_128.o mpfq_2_128_fscan T
mpfq_2_128.o mpfq_2_128_sscan T
rng.o AES256_CTR_DRBG_Update T
rng.o AES256_ECB T
rng.o DRBG_ctx B
rng.o handleErrors T
rng.o randombytes_init T
rng.o seedexpander T
rng.o seedexpander_init T
sign.o K B
sign.o PublicKey B
sign.o addcandidate T
sign.o compare T

Number of similar (implementation,compiler) pairs: 9, namely:
ImplementationCompiler
T:refclang -march=native -O2 -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)
T:refclang -march=native -O3 -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)
T:refclang -march=native -O -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)
T:refclang -march=native -Os -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)
T:refclang -mcpu=native -O3 -fwrapv -Qunused-arguments -fPIC -fPIE -gdwarf-4 -Wall (Debian_Clang_11.0.1)
T:refgcc -march=native -mtune=native -O2 -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)
T:refgcc -march=native -mtune=native -O3 -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)
T:refgcc -march=native -mtune=native -O -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)
T:refgcc -march=native -mtune=native -Os -fwrapv -fPIC -fPIE -gdwarf-4 -Wall (10.2.1_20210110)